briefed 0.1.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/LICENSE +21 -0
- package/README.md +118 -0
- package/dist/bench/metrics.d.ts +31 -0
- package/dist/bench/metrics.js +122 -0
- package/dist/bench/metrics.js.map +1 -0
- package/dist/bench/runner.d.ts +27 -0
- package/dist/bench/runner.js +184 -0
- package/dist/bench/runner.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +42 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/bench.d.ts +11 -0
- package/dist/commands/bench.js +23 -0
- package/dist/commands/bench.js.map +1 -0
- package/dist/commands/doctor.d.ts +5 -0
- package/dist/commands/doctor.js +246 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/init.d.ts +8 -0
- package/dist/commands/init.js +319 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/stats.d.ts +5 -0
- package/dist/commands/stats.js +87 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/deliver/ci.d.ts +4 -0
- package/dist/deliver/ci.js +62 -0
- package/dist/deliver/ci.js.map +1 -0
- package/dist/deliver/claudemd.d.ts +9 -0
- package/dist/deliver/claudemd.js +51 -0
- package/dist/deliver/claudemd.js.map +1 -0
- package/dist/deliver/cross-tool.d.ts +10 -0
- package/dist/deliver/cross-tool.js +49 -0
- package/dist/deliver/cross-tool.js.map +1 -0
- package/dist/deliver/git-hook.d.ts +10 -0
- package/dist/deliver/git-hook.js +104 -0
- package/dist/deliver/git-hook.js.map +1 -0
- package/dist/deliver/hooks.d.ts +9 -0
- package/dist/deliver/hooks.js +315 -0
- package/dist/deliver/hooks.js.map +1 -0
- package/dist/extract/complexity.d.ts +16 -0
- package/dist/extract/complexity.js +46 -0
- package/dist/extract/complexity.js.map +1 -0
- package/dist/extract/conventions.d.ts +18 -0
- package/dist/extract/conventions.js +143 -0
- package/dist/extract/conventions.js.map +1 -0
- package/dist/extract/depgraph.d.ts +12 -0
- package/dist/extract/depgraph.js +70 -0
- package/dist/extract/depgraph.js.map +1 -0
- package/dist/extract/env.d.ts +17 -0
- package/dist/extract/env.js +142 -0
- package/dist/extract/env.js.map +1 -0
- package/dist/extract/error-patterns.d.ts +15 -0
- package/dist/extract/error-patterns.js +107 -0
- package/dist/extract/error-patterns.js.map +1 -0
- package/dist/extract/frontend.d.ts +30 -0
- package/dist/extract/frontend.js +244 -0
- package/dist/extract/frontend.js.map +1 -0
- package/dist/extract/gotchas.d.ts +12 -0
- package/dist/extract/gotchas.js +145 -0
- package/dist/extract/gotchas.js.map +1 -0
- package/dist/extract/history.d.ts +29 -0
- package/dist/extract/history.js +91 -0
- package/dist/extract/history.js.map +1 -0
- package/dist/extract/infra.d.ts +27 -0
- package/dist/extract/infra.js +226 -0
- package/dist/extract/infra.js.map +1 -0
- package/dist/extract/monorepo.d.ts +16 -0
- package/dist/extract/monorepo.js +135 -0
- package/dist/extract/monorepo.js.map +1 -0
- package/dist/extract/routes.d.ts +16 -0
- package/dist/extract/routes.js +156 -0
- package/dist/extract/routes.js.map +1 -0
- package/dist/extract/scanner.d.ts +18 -0
- package/dist/extract/scanner.js +109 -0
- package/dist/extract/scanner.js.map +1 -0
- package/dist/extract/schema.d.ts +28 -0
- package/dist/extract/schema.js +192 -0
- package/dist/extract/schema.js.map +1 -0
- package/dist/extract/scripts.d.ts +18 -0
- package/dist/extract/scripts.js +104 -0
- package/dist/extract/scripts.js.map +1 -0
- package/dist/extract/security.d.ts +20 -0
- package/dist/extract/security.js +95 -0
- package/dist/extract/security.js.map +1 -0
- package/dist/extract/signatures.d.ts +33 -0
- package/dist/extract/signatures.js +608 -0
- package/dist/extract/signatures.js.map +1 -0
- package/dist/extract/staleness.d.ts +16 -0
- package/dist/extract/staleness.js +108 -0
- package/dist/extract/staleness.js.map +1 -0
- package/dist/extract/tests.d.ts +16 -0
- package/dist/extract/tests.js +175 -0
- package/dist/extract/tests.js.map +1 -0
- package/dist/extract/usage-examples.d.ts +17 -0
- package/dist/extract/usage-examples.js +115 -0
- package/dist/extract/usage-examples.js.map +1 -0
- package/dist/generate/index-file.d.ts +29 -0
- package/dist/generate/index-file.js +168 -0
- package/dist/generate/index-file.js.map +1 -0
- package/dist/generate/rules.d.ts +6 -0
- package/dist/generate/rules.js +94 -0
- package/dist/generate/rules.js.map +1 -0
- package/dist/generate/skeleton.d.ts +14 -0
- package/dist/generate/skeleton.js +145 -0
- package/dist/generate/skeleton.js.map +1 -0
- package/dist/learn/tracker.d.ts +54 -0
- package/dist/learn/tracker.js +129 -0
- package/dist/learn/tracker.js.map +1 -0
- package/dist/utils/detect.d.ts +16 -0
- package/dist/utils/detect.js +188 -0
- package/dist/utils/detect.js.map +1 -0
- package/dist/utils/pagerank.d.ts +19 -0
- package/dist/utils/pagerank.js +52 -0
- package/dist/utils/pagerank.js.map +1 -0
- package/dist/utils/tokens.d.ts +11 -0
- package/dist/utils/tokens.js +27 -0
- package/dist/utils/tokens.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-file.js","sourceRoot":"","sources":["../../src/generate/index-file.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Gotcha } from "../extract/gotchas.js";
|
|
2
|
+
/**
|
|
3
|
+
* Group gotchas by directory and format as .claude/rules/ files.
|
|
4
|
+
* Each file gets YAML frontmatter with path matchers.
|
|
5
|
+
*/
|
|
6
|
+
export declare function generateRuleFiles(gotchas: Gotcha[], root: string): Map<string, string>;
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { dirname, relative } from "path";
|
|
2
|
+
/**
|
|
3
|
+
* Group gotchas by directory and format as .claude/rules/ files.
|
|
4
|
+
* Each file gets YAML frontmatter with path matchers.
|
|
5
|
+
*/
|
|
6
|
+
export function generateRuleFiles(gotchas, root) {
|
|
7
|
+
// Group gotchas by directory
|
|
8
|
+
const byDir = new Map();
|
|
9
|
+
for (const g of gotchas) {
|
|
10
|
+
const relPath = relative(root, g.file).replace(/\\/g, "/");
|
|
11
|
+
const dir = dirname(relPath);
|
|
12
|
+
if (!byDir.has(dir))
|
|
13
|
+
byDir.set(dir, []);
|
|
14
|
+
byDir.get(dir).push({ ...g, file: relPath });
|
|
15
|
+
}
|
|
16
|
+
// Generate rule files
|
|
17
|
+
const files = new Map();
|
|
18
|
+
for (const [dir, dirGotchas] of byDir) {
|
|
19
|
+
if (dirGotchas.length === 0)
|
|
20
|
+
continue;
|
|
21
|
+
// Create a safe filename
|
|
22
|
+
const safeDir = dir.replace(/[\/\\]/g, "-").replace(/^-/, "");
|
|
23
|
+
const fileName = `briefed-${safeDir || "root"}.md`;
|
|
24
|
+
const lines = [];
|
|
25
|
+
// YAML frontmatter with path matcher
|
|
26
|
+
lines.push("---");
|
|
27
|
+
lines.push(`paths:`);
|
|
28
|
+
lines.push(` - "${dir}/**"`);
|
|
29
|
+
lines.push("---");
|
|
30
|
+
lines.push("");
|
|
31
|
+
lines.push(`# Constraints: ${dir}/`);
|
|
32
|
+
lines.push("");
|
|
33
|
+
// Group by category
|
|
34
|
+
const byCategory = new Map();
|
|
35
|
+
for (const g of dirGotchas) {
|
|
36
|
+
if (!byCategory.has(g.category))
|
|
37
|
+
byCategory.set(g.category, []);
|
|
38
|
+
byCategory.get(g.category).push(g);
|
|
39
|
+
}
|
|
40
|
+
// Important comments first
|
|
41
|
+
const comments = byCategory.get("important_comment") || [];
|
|
42
|
+
if (comments.length > 0) {
|
|
43
|
+
for (const g of comments) {
|
|
44
|
+
lines.push(`- ${g.text}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Guard clauses
|
|
48
|
+
const guards = byCategory.get("guard_clause") || [];
|
|
49
|
+
if (guards.length > 0) {
|
|
50
|
+
for (const g of guards) {
|
|
51
|
+
lines.push(`- ${g.text}`);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// State transitions
|
|
55
|
+
const states = byCategory.get("state_transition") || [];
|
|
56
|
+
if (states.length > 0) {
|
|
57
|
+
for (const g of states) {
|
|
58
|
+
lines.push(`- ${g.text}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
// Side effects
|
|
62
|
+
const effects = byCategory.get("side_effect") || [];
|
|
63
|
+
if (effects.length > 0) {
|
|
64
|
+
for (const g of effects) {
|
|
65
|
+
lines.push(`- ${g.text}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Soft deletes
|
|
69
|
+
const deletes = byCategory.get("soft_delete") || [];
|
|
70
|
+
if (deletes.length > 0) {
|
|
71
|
+
for (const g of deletes) {
|
|
72
|
+
lines.push(`- ${g.text}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Unique constraints
|
|
76
|
+
const uniques = byCategory.get("unique_constraint") || [];
|
|
77
|
+
if (uniques.length > 0) {
|
|
78
|
+
for (const g of uniques) {
|
|
79
|
+
lines.push(`- ${g.text}`);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
// Other
|
|
83
|
+
for (const [cat, gs] of byCategory) {
|
|
84
|
+
if (["important_comment", "guard_clause", "state_transition", "side_effect", "soft_delete", "unique_constraint"].includes(cat))
|
|
85
|
+
continue;
|
|
86
|
+
for (const g of gs) {
|
|
87
|
+
lines.push(`- ${g.text}`);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
files.set(fileName, lines.join("\n"));
|
|
91
|
+
}
|
|
92
|
+
return files;
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=rules.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/generate/rules.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { FileExtraction } from "../extract/signatures.js";
|
|
2
|
+
import type { DepGraph } from "../extract/depgraph.js";
|
|
3
|
+
import type { ComplexityScore } from "../extract/complexity.js";
|
|
4
|
+
import type { StackInfo } from "../utils/detect.js";
|
|
5
|
+
export interface SkeletonOptions {
|
|
6
|
+
maxTokens: number;
|
|
7
|
+
topN: number;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Generate the L1 skeleton — a token-efficient structural map of the codebase.
|
|
11
|
+
* Uses PageRank to prioritize the most central files.
|
|
12
|
+
* Output format: Markdown (most token-efficient for hierarchical text).
|
|
13
|
+
*/
|
|
14
|
+
export declare function generateSkeleton(stack: StackInfo, extractions: FileExtraction[], depGraph: DepGraph, complexity: ComplexityScore[], opts?: Partial<SkeletonOptions>): string;
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { dirname, basename } from "path";
|
|
2
|
+
import { countTokens } from "../utils/tokens.js";
|
|
3
|
+
const DEFAULT_OPTIONS = {
|
|
4
|
+
maxTokens: 1000,
|
|
5
|
+
topN: 50,
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Generate the L1 skeleton — a token-efficient structural map of the codebase.
|
|
9
|
+
* Uses PageRank to prioritize the most central files.
|
|
10
|
+
* Output format: Markdown (most token-efficient for hierarchical text).
|
|
11
|
+
*/
|
|
12
|
+
export function generateSkeleton(stack, extractions, depGraph, complexity, opts = {}) {
|
|
13
|
+
const options = { ...DEFAULT_OPTIONS, ...opts };
|
|
14
|
+
// Rank files by PageRank score
|
|
15
|
+
const ranked = extractions
|
|
16
|
+
.filter((e) => e.symbols.length > 0)
|
|
17
|
+
.map((e) => ({
|
|
18
|
+
extraction: e,
|
|
19
|
+
score: depGraph.pageRank.get(e.path) || 0,
|
|
20
|
+
refs: depGraph.refCounts.get(e.path) || 0,
|
|
21
|
+
complexity: complexity.find((c) => c.file === e.path)?.score || 0,
|
|
22
|
+
}))
|
|
23
|
+
.sort((a, b) => b.score - a.score);
|
|
24
|
+
// Group files by directory
|
|
25
|
+
const dirGroups = new Map();
|
|
26
|
+
for (const item of ranked) {
|
|
27
|
+
const dir = dirname(item.extraction.path);
|
|
28
|
+
if (!dirGroups.has(dir))
|
|
29
|
+
dirGroups.set(dir, []);
|
|
30
|
+
dirGroups.get(dir).push(item);
|
|
31
|
+
}
|
|
32
|
+
// Sort directories by total PageRank of their files
|
|
33
|
+
const sortedDirs = [...dirGroups.entries()]
|
|
34
|
+
.map(([dir, files]) => ({
|
|
35
|
+
dir,
|
|
36
|
+
files,
|
|
37
|
+
totalScore: files.reduce((s, f) => s + f.score, 0),
|
|
38
|
+
totalFiles: files.length,
|
|
39
|
+
}))
|
|
40
|
+
.sort((a, b) => b.totalScore - a.totalScore);
|
|
41
|
+
// Build skeleton
|
|
42
|
+
const lines = [];
|
|
43
|
+
// Header
|
|
44
|
+
const projectName = basename(extractions[0]?.path?.split("/")[0] || "project");
|
|
45
|
+
lines.push(`# briefed: ${stack.frameworks.length > 0 ? stack.frameworks.join(", ") : stack.languages.join(", ")} project`);
|
|
46
|
+
lines.push(`Stack: ${[...stack.languages, ...stack.frameworks].join(", ")}${stack.dbORM ? `, ${stack.dbORM}` : ""}`);
|
|
47
|
+
if (stack.entryPoints.length > 0) {
|
|
48
|
+
lines.push(`Entry: ${stack.entryPoints.join(", ")}`);
|
|
49
|
+
}
|
|
50
|
+
lines.push(`Files: ${extractions.length} source files across ${dirGroups.size} directories`);
|
|
51
|
+
lines.push("");
|
|
52
|
+
// Directory sections with file signatures
|
|
53
|
+
let tokenCount = countTokens(lines.join("\n"));
|
|
54
|
+
let filesIncluded = 0;
|
|
55
|
+
for (const { dir, files, totalFiles } of sortedDirs) {
|
|
56
|
+
if (filesIncluded >= options.topN)
|
|
57
|
+
break;
|
|
58
|
+
if (tokenCount >= options.maxTokens)
|
|
59
|
+
break;
|
|
60
|
+
// Count all source files in directory (not just those with symbols)
|
|
61
|
+
const allInDir = extractions.filter((e) => dirname(e.path) === dir).length;
|
|
62
|
+
const dirLine = `## ${dir}/ (${allInDir} files)`;
|
|
63
|
+
lines.push(dirLine);
|
|
64
|
+
tokenCount += countTokens(dirLine);
|
|
65
|
+
for (const { extraction, refs, complexity: cx } of files) {
|
|
66
|
+
if (filesIncluded >= options.topN)
|
|
67
|
+
break;
|
|
68
|
+
if (tokenCount >= options.maxTokens)
|
|
69
|
+
break;
|
|
70
|
+
const fname = basename(extraction.path);
|
|
71
|
+
const refTag = refs > 0 ? ` ★${refs}` : "";
|
|
72
|
+
// For high-complexity files, show full signatures
|
|
73
|
+
// For low-complexity files, just show the file name with exports
|
|
74
|
+
const exportedSymbols = extraction.symbols.filter((s) => s.exported);
|
|
75
|
+
if (cx >= 5 || refs >= 3) {
|
|
76
|
+
// Detailed: show signatures
|
|
77
|
+
const fileLine = `${fname}${refTag}`;
|
|
78
|
+
lines.push(fileLine);
|
|
79
|
+
tokenCount += countTokens(fileLine);
|
|
80
|
+
for (const sym of exportedSymbols.slice(0, 10)) {
|
|
81
|
+
const sigLine = ` ${formatSignature(sym)}`;
|
|
82
|
+
const sigTokens = countTokens(sigLine);
|
|
83
|
+
if (tokenCount + sigTokens > options.maxTokens)
|
|
84
|
+
break;
|
|
85
|
+
lines.push(sigLine);
|
|
86
|
+
tokenCount += sigTokens;
|
|
87
|
+
}
|
|
88
|
+
if (exportedSymbols.length > 10) {
|
|
89
|
+
lines.push(` ... +${exportedSymbols.length - 10} more exports`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
// Compact: just file name with export count
|
|
94
|
+
const exportNames = exportedSymbols
|
|
95
|
+
.slice(0, 5)
|
|
96
|
+
.map((s) => s.name.split(".").pop())
|
|
97
|
+
.join(", ");
|
|
98
|
+
const suffix = exportedSymbols.length > 5
|
|
99
|
+
? ` +${exportedSymbols.length - 5} more`
|
|
100
|
+
: "";
|
|
101
|
+
const compactLine = `${fname}${refTag}: ${exportNames}${suffix}`;
|
|
102
|
+
lines.push(compactLine);
|
|
103
|
+
tokenCount += countTokens(compactLine);
|
|
104
|
+
}
|
|
105
|
+
filesIncluded++;
|
|
106
|
+
}
|
|
107
|
+
lines.push("");
|
|
108
|
+
tokenCount += 1;
|
|
109
|
+
}
|
|
110
|
+
// Footer with token count
|
|
111
|
+
lines.push(`<!-- briefed skeleton: ${filesIncluded} files, ~${countTokens(lines.join("\n"))} tokens -->`);
|
|
112
|
+
return lines.join("\n");
|
|
113
|
+
}
|
|
114
|
+
function formatSignature(sym) {
|
|
115
|
+
let base;
|
|
116
|
+
switch (sym.kind) {
|
|
117
|
+
case "route":
|
|
118
|
+
base = sym.signature;
|
|
119
|
+
break;
|
|
120
|
+
case "method":
|
|
121
|
+
base = sym.signature;
|
|
122
|
+
break;
|
|
123
|
+
case "class":
|
|
124
|
+
case "interface":
|
|
125
|
+
base = `${sym.kind} ${sym.signature}`;
|
|
126
|
+
break;
|
|
127
|
+
case "enum":
|
|
128
|
+
base = `enum ${sym.signature}`;
|
|
129
|
+
break;
|
|
130
|
+
case "type":
|
|
131
|
+
base = `type ${sym.signature}`;
|
|
132
|
+
break;
|
|
133
|
+
case "component":
|
|
134
|
+
base = `<${sym.name}> ${sym.signature}`;
|
|
135
|
+
break;
|
|
136
|
+
default:
|
|
137
|
+
base = sym.signature;
|
|
138
|
+
}
|
|
139
|
+
// Append description if available (one-liner from docstring/JSDoc)
|
|
140
|
+
if (sym.description) {
|
|
141
|
+
return `${base} — ${sym.description}`;
|
|
142
|
+
}
|
|
143
|
+
return base;
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=skeleton.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skeleton.js","sourceRoot":"","sources":["../../src/generate/skeleton.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Learning loop: tracks what context was useful per prompt pattern.
|
|
3
|
+
* Over time, improves the adaptive hook's predictions.
|
|
4
|
+
*
|
|
5
|
+
* How it works:
|
|
6
|
+
* 1. UserPromptSubmit hook injects context for modules A, B based on keywords
|
|
7
|
+
* 2. PostToolUse hook (Read matcher) logs which files Claude actually read
|
|
8
|
+
* 3. If Claude read files from module C (not injected), that's a MISS
|
|
9
|
+
* 4. Over time, associate "prompts about X" with "also need module C"
|
|
10
|
+
*
|
|
11
|
+
* Storage: simple JSON file (no SQLite dependency for now)
|
|
12
|
+
*/
|
|
13
|
+
interface LearningRecord {
|
|
14
|
+
promptKeywords: string[];
|
|
15
|
+
injectedModules: string[];
|
|
16
|
+
accessedModules: string[];
|
|
17
|
+
misses: string[];
|
|
18
|
+
timestamp: string;
|
|
19
|
+
}
|
|
20
|
+
interface LearningStore {
|
|
21
|
+
records: LearningRecord[];
|
|
22
|
+
moduleRelevance: Record<string, Record<string, number>>;
|
|
23
|
+
version: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Load the learning store.
|
|
27
|
+
*/
|
|
28
|
+
export declare function loadStore(root: string): LearningStore;
|
|
29
|
+
/**
|
|
30
|
+
* Save the learning store.
|
|
31
|
+
*/
|
|
32
|
+
export declare function saveStore(root: string, store: LearningStore): void;
|
|
33
|
+
/**
|
|
34
|
+
* Record a session's context usage.
|
|
35
|
+
* Called by the learning hook after a session ends or periodically.
|
|
36
|
+
*/
|
|
37
|
+
export declare function recordSession(store: LearningStore, promptKeywords: string[], injectedModules: string[], accessedFiles: string[], moduleIndex: Array<{
|
|
38
|
+
name: string;
|
|
39
|
+
dir: string;
|
|
40
|
+
files: string[];
|
|
41
|
+
}>): LearningStore;
|
|
42
|
+
/**
|
|
43
|
+
* Get learned module suggestions for a set of keywords.
|
|
44
|
+
* Returns modules sorted by relevance score.
|
|
45
|
+
*/
|
|
46
|
+
export declare function getLearnedModules(store: LearningStore, promptKeywords: string[], limit?: number): Array<{
|
|
47
|
+
module: string;
|
|
48
|
+
score: number;
|
|
49
|
+
}>;
|
|
50
|
+
/**
|
|
51
|
+
* Generate the PostToolUse hook script that tracks file reads.
|
|
52
|
+
*/
|
|
53
|
+
export declare function generateLearningHookScript(): string;
|
|
54
|
+
export {};
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync, mkdirSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
const STORE_FILE = "learning.json";
|
|
4
|
+
const MAX_RECORDS = 200;
|
|
5
|
+
/**
|
|
6
|
+
* Load the learning store.
|
|
7
|
+
*/
|
|
8
|
+
export function loadStore(root) {
|
|
9
|
+
const storePath = join(root, ".briefed", STORE_FILE);
|
|
10
|
+
if (existsSync(storePath)) {
|
|
11
|
+
try {
|
|
12
|
+
return JSON.parse(readFileSync(storePath, "utf-8"));
|
|
13
|
+
}
|
|
14
|
+
catch {
|
|
15
|
+
// Corrupt store — start fresh
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return { records: [], moduleRelevance: {}, version: 1 };
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Save the learning store.
|
|
22
|
+
*/
|
|
23
|
+
export function saveStore(root, store) {
|
|
24
|
+
const briefedDir = join(root, ".briefed");
|
|
25
|
+
if (!existsSync(briefedDir))
|
|
26
|
+
mkdirSync(briefedDir, { recursive: true });
|
|
27
|
+
// Trim old records
|
|
28
|
+
if (store.records.length > MAX_RECORDS) {
|
|
29
|
+
store.records = store.records.slice(-MAX_RECORDS);
|
|
30
|
+
}
|
|
31
|
+
writeFileSync(join(briefedDir, STORE_FILE), JSON.stringify(store, null, 2));
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Record a session's context usage.
|
|
35
|
+
* Called by the learning hook after a session ends or periodically.
|
|
36
|
+
*/
|
|
37
|
+
export function recordSession(store, promptKeywords, injectedModules, accessedFiles, moduleIndex) {
|
|
38
|
+
// Map accessed files to modules
|
|
39
|
+
const accessedModules = new Set();
|
|
40
|
+
for (const file of accessedFiles) {
|
|
41
|
+
for (const mod of moduleIndex) {
|
|
42
|
+
if (mod.files.some((f) => file.includes(f) || f.includes(file))) {
|
|
43
|
+
accessedModules.add(mod.name);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
// Detect misses: modules Claude accessed but we didn't inject
|
|
48
|
+
const injectedSet = new Set(injectedModules);
|
|
49
|
+
const misses = [...accessedModules].filter((m) => !injectedSet.has(m));
|
|
50
|
+
// Record
|
|
51
|
+
store.records.push({
|
|
52
|
+
promptKeywords,
|
|
53
|
+
injectedModules,
|
|
54
|
+
accessedModules: [...accessedModules],
|
|
55
|
+
misses,
|
|
56
|
+
timestamp: new Date().toISOString(),
|
|
57
|
+
});
|
|
58
|
+
// Update relevance scores
|
|
59
|
+
// For each keyword in the prompt, increase the score for modules that were accessed
|
|
60
|
+
for (const keyword of promptKeywords) {
|
|
61
|
+
if (!store.moduleRelevance[keyword]) {
|
|
62
|
+
store.moduleRelevance[keyword] = {};
|
|
63
|
+
}
|
|
64
|
+
for (const mod of accessedModules) {
|
|
65
|
+
const current = store.moduleRelevance[keyword][mod] || 0;
|
|
66
|
+
store.moduleRelevance[keyword][mod] = current + 1;
|
|
67
|
+
}
|
|
68
|
+
// Slight boost for misses (we should have injected these)
|
|
69
|
+
for (const miss of misses) {
|
|
70
|
+
const current = store.moduleRelevance[keyword][miss] || 0;
|
|
71
|
+
store.moduleRelevance[keyword][miss] = current + 2; // double weight for misses
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return store;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get learned module suggestions for a set of keywords.
|
|
78
|
+
* Returns modules sorted by relevance score.
|
|
79
|
+
*/
|
|
80
|
+
export function getLearnedModules(store, promptKeywords, limit = 5) {
|
|
81
|
+
const scores = new Map();
|
|
82
|
+
for (const keyword of promptKeywords) {
|
|
83
|
+
const relevance = store.moduleRelevance[keyword];
|
|
84
|
+
if (!relevance)
|
|
85
|
+
continue;
|
|
86
|
+
for (const [mod, score] of Object.entries(relevance)) {
|
|
87
|
+
scores.set(mod, (scores.get(mod) || 0) + score);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return [...scores.entries()]
|
|
91
|
+
.map(([module, score]) => ({ module, score }))
|
|
92
|
+
.sort((a, b) => b.score - a.score)
|
|
93
|
+
.slice(0, limit);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Generate the PostToolUse hook script that tracks file reads.
|
|
97
|
+
*/
|
|
98
|
+
export function generateLearningHookScript() {
|
|
99
|
+
return `#!/usr/bin/env node
|
|
100
|
+
// briefed: PostToolUse hook — tracks which files Claude reads for the learning loop
|
|
101
|
+
// Security: only appends to .briefed/session-reads.json, never reads prompt content
|
|
102
|
+
const { appendFileSync, mkdirSync, existsSync } = require("fs");
|
|
103
|
+
const { join } = require("path");
|
|
104
|
+
|
|
105
|
+
let input = "";
|
|
106
|
+
process.stdin.setEncoding("utf-8");
|
|
107
|
+
process.stdin.on("data", (chunk) => { input += chunk; });
|
|
108
|
+
process.stdin.on("end", () => {
|
|
109
|
+
try {
|
|
110
|
+
const data = JSON.parse(input);
|
|
111
|
+
// Only track Read tool calls
|
|
112
|
+
if (data.tool_name !== "Read") { process.exit(0); return; }
|
|
113
|
+
|
|
114
|
+
const filePath = data.tool_input?.file_path;
|
|
115
|
+
if (!filePath) { process.exit(0); return; }
|
|
116
|
+
|
|
117
|
+
// Append to session reads log (one line per file read)
|
|
118
|
+
const briefedDir = join(process.cwd(), ".briefed");
|
|
119
|
+
if (!existsSync(briefedDir)) mkdirSync(briefedDir, { recursive: true });
|
|
120
|
+
appendFileSync(
|
|
121
|
+
join(briefedDir, "session-reads.log"),
|
|
122
|
+
filePath + "\\n"
|
|
123
|
+
);
|
|
124
|
+
} catch {}
|
|
125
|
+
process.exit(0);
|
|
126
|
+
});
|
|
127
|
+
`.trim();
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=tracker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tracker.js","sourceRoot":"","sources":["../../src/learn/tracker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export interface StackInfo {
|
|
2
|
+
languages: string[];
|
|
3
|
+
frameworks: string[];
|
|
4
|
+
packageManager: string | null;
|
|
5
|
+
entryPoints: string[];
|
|
6
|
+
dbORM: string | null;
|
|
7
|
+
testFramework: string | null;
|
|
8
|
+
}
|
|
9
|
+
/** Detect the project's tech stack from config files */
|
|
10
|
+
export declare function detectStack(root: string): StackInfo;
|
|
11
|
+
/** Map file extension to language name */
|
|
12
|
+
export declare function extToLanguage(ext: string): string | null;
|
|
13
|
+
/** File extensions we should parse */
|
|
14
|
+
export declare const PARSEABLE_EXTENSIONS: Set<string>;
|
|
15
|
+
/** Directories to always skip */
|
|
16
|
+
export declare const SKIP_DIRS: Set<string>;
|