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.
Files changed (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +118 -0
  3. package/dist/bench/metrics.d.ts +31 -0
  4. package/dist/bench/metrics.js +122 -0
  5. package/dist/bench/metrics.js.map +1 -0
  6. package/dist/bench/runner.d.ts +27 -0
  7. package/dist/bench/runner.js +184 -0
  8. package/dist/bench/runner.js.map +1 -0
  9. package/dist/cli.d.ts +2 -0
  10. package/dist/cli.js +42 -0
  11. package/dist/cli.js.map +1 -0
  12. package/dist/commands/bench.d.ts +11 -0
  13. package/dist/commands/bench.js +23 -0
  14. package/dist/commands/bench.js.map +1 -0
  15. package/dist/commands/doctor.d.ts +5 -0
  16. package/dist/commands/doctor.js +246 -0
  17. package/dist/commands/doctor.js.map +1 -0
  18. package/dist/commands/init.d.ts +8 -0
  19. package/dist/commands/init.js +319 -0
  20. package/dist/commands/init.js.map +1 -0
  21. package/dist/commands/stats.d.ts +5 -0
  22. package/dist/commands/stats.js +87 -0
  23. package/dist/commands/stats.js.map +1 -0
  24. package/dist/deliver/ci.d.ts +4 -0
  25. package/dist/deliver/ci.js +62 -0
  26. package/dist/deliver/ci.js.map +1 -0
  27. package/dist/deliver/claudemd.d.ts +9 -0
  28. package/dist/deliver/claudemd.js +51 -0
  29. package/dist/deliver/claudemd.js.map +1 -0
  30. package/dist/deliver/cross-tool.d.ts +10 -0
  31. package/dist/deliver/cross-tool.js +49 -0
  32. package/dist/deliver/cross-tool.js.map +1 -0
  33. package/dist/deliver/git-hook.d.ts +10 -0
  34. package/dist/deliver/git-hook.js +104 -0
  35. package/dist/deliver/git-hook.js.map +1 -0
  36. package/dist/deliver/hooks.d.ts +9 -0
  37. package/dist/deliver/hooks.js +315 -0
  38. package/dist/deliver/hooks.js.map +1 -0
  39. package/dist/extract/complexity.d.ts +16 -0
  40. package/dist/extract/complexity.js +46 -0
  41. package/dist/extract/complexity.js.map +1 -0
  42. package/dist/extract/conventions.d.ts +18 -0
  43. package/dist/extract/conventions.js +143 -0
  44. package/dist/extract/conventions.js.map +1 -0
  45. package/dist/extract/depgraph.d.ts +12 -0
  46. package/dist/extract/depgraph.js +70 -0
  47. package/dist/extract/depgraph.js.map +1 -0
  48. package/dist/extract/env.d.ts +17 -0
  49. package/dist/extract/env.js +142 -0
  50. package/dist/extract/env.js.map +1 -0
  51. package/dist/extract/error-patterns.d.ts +15 -0
  52. package/dist/extract/error-patterns.js +107 -0
  53. package/dist/extract/error-patterns.js.map +1 -0
  54. package/dist/extract/frontend.d.ts +30 -0
  55. package/dist/extract/frontend.js +244 -0
  56. package/dist/extract/frontend.js.map +1 -0
  57. package/dist/extract/gotchas.d.ts +12 -0
  58. package/dist/extract/gotchas.js +145 -0
  59. package/dist/extract/gotchas.js.map +1 -0
  60. package/dist/extract/history.d.ts +29 -0
  61. package/dist/extract/history.js +91 -0
  62. package/dist/extract/history.js.map +1 -0
  63. package/dist/extract/infra.d.ts +27 -0
  64. package/dist/extract/infra.js +226 -0
  65. package/dist/extract/infra.js.map +1 -0
  66. package/dist/extract/monorepo.d.ts +16 -0
  67. package/dist/extract/monorepo.js +135 -0
  68. package/dist/extract/monorepo.js.map +1 -0
  69. package/dist/extract/routes.d.ts +16 -0
  70. package/dist/extract/routes.js +156 -0
  71. package/dist/extract/routes.js.map +1 -0
  72. package/dist/extract/scanner.d.ts +18 -0
  73. package/dist/extract/scanner.js +109 -0
  74. package/dist/extract/scanner.js.map +1 -0
  75. package/dist/extract/schema.d.ts +28 -0
  76. package/dist/extract/schema.js +192 -0
  77. package/dist/extract/schema.js.map +1 -0
  78. package/dist/extract/scripts.d.ts +18 -0
  79. package/dist/extract/scripts.js +104 -0
  80. package/dist/extract/scripts.js.map +1 -0
  81. package/dist/extract/security.d.ts +20 -0
  82. package/dist/extract/security.js +95 -0
  83. package/dist/extract/security.js.map +1 -0
  84. package/dist/extract/signatures.d.ts +33 -0
  85. package/dist/extract/signatures.js +608 -0
  86. package/dist/extract/signatures.js.map +1 -0
  87. package/dist/extract/staleness.d.ts +16 -0
  88. package/dist/extract/staleness.js +108 -0
  89. package/dist/extract/staleness.js.map +1 -0
  90. package/dist/extract/tests.d.ts +16 -0
  91. package/dist/extract/tests.js +175 -0
  92. package/dist/extract/tests.js.map +1 -0
  93. package/dist/extract/usage-examples.d.ts +17 -0
  94. package/dist/extract/usage-examples.js +115 -0
  95. package/dist/extract/usage-examples.js.map +1 -0
  96. package/dist/generate/index-file.d.ts +29 -0
  97. package/dist/generate/index-file.js +168 -0
  98. package/dist/generate/index-file.js.map +1 -0
  99. package/dist/generate/rules.d.ts +6 -0
  100. package/dist/generate/rules.js +94 -0
  101. package/dist/generate/rules.js.map +1 -0
  102. package/dist/generate/skeleton.d.ts +14 -0
  103. package/dist/generate/skeleton.js +145 -0
  104. package/dist/generate/skeleton.js.map +1 -0
  105. package/dist/learn/tracker.d.ts +54 -0
  106. package/dist/learn/tracker.js +129 -0
  107. package/dist/learn/tracker.js.map +1 -0
  108. package/dist/utils/detect.d.ts +16 -0
  109. package/dist/utils/detect.js +188 -0
  110. package/dist/utils/detect.js.map +1 -0
  111. package/dist/utils/pagerank.d.ts +19 -0
  112. package/dist/utils/pagerank.js +52 -0
  113. package/dist/utils/pagerank.js.map +1 -0
  114. package/dist/utils/tokens.d.ts +11 -0
  115. package/dist/utils/tokens.js +27 -0
  116. package/dist/utils/tokens.js.map +1 -0
  117. 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>;