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,246 @@
1
+ import { resolve, join } from "path";
2
+ import { existsSync, readFileSync, readdirSync, statSync } from "fs";
3
+ import { execSync } from "child_process";
4
+ import { countTokens } from "../utils/tokens.js";
5
+ const MAX_CLAUDE_MD_CHARS = 40_000;
6
+ export async function doctorCommand(opts) {
7
+ const root = resolve(opts.repo);
8
+ console.log(" briefed doctor\n");
9
+ const checks = [];
10
+ // 1. CLAUDE.md exists and is within limits
11
+ const claudeMd = join(root, "CLAUDE.md");
12
+ if (existsSync(claudeMd)) {
13
+ const content = readFileSync(claudeMd, "utf-8");
14
+ const chars = content.length;
15
+ const tokens = countTokens(content);
16
+ if (!content.includes("<!-- briefed:start -->")) {
17
+ checks.push({
18
+ name: "CLAUDE.md has briefed section",
19
+ status: "fail",
20
+ detail: "CLAUDE.md exists but has no briefed section",
21
+ fix: "Run: npx briefed init",
22
+ });
23
+ }
24
+ else if (chars > MAX_CLAUDE_MD_CHARS) {
25
+ checks.push({
26
+ name: "CLAUDE.md size",
27
+ status: "warn",
28
+ detail: `${chars.toLocaleString()} chars (limit: ${MAX_CLAUDE_MD_CHARS.toLocaleString()}). Claude may not read it fully.`,
29
+ fix: "Run: npx briefed init --max-tokens 600",
30
+ });
31
+ }
32
+ else {
33
+ checks.push({
34
+ name: "CLAUDE.md",
35
+ status: "pass",
36
+ detail: `${chars.toLocaleString()} chars, ~${tokens} tokens`,
37
+ fix: null,
38
+ });
39
+ }
40
+ }
41
+ else {
42
+ checks.push({
43
+ name: "CLAUDE.md",
44
+ status: "fail",
45
+ detail: "Not found",
46
+ fix: "Run: npx briefed init",
47
+ });
48
+ }
49
+ // 2. .claude/rules/ exist
50
+ const rulesDir = join(root, ".claude", "rules");
51
+ if (existsSync(rulesDir)) {
52
+ const ruleFiles = readdirSync(rulesDir).filter((f) => f.startsWith("briefed-"));
53
+ if (ruleFiles.length > 0) {
54
+ let totalGotchas = 0;
55
+ for (const f of ruleFiles) {
56
+ const content = readFileSync(join(rulesDir, f), "utf-8");
57
+ totalGotchas += (content.match(/^- /gm) || []).length;
58
+ // Validate YAML frontmatter
59
+ if (!content.startsWith("---")) {
60
+ checks.push({
61
+ name: `Rule: ${f}`,
62
+ status: "warn",
63
+ detail: "Missing YAML frontmatter (paths won't be matched)",
64
+ fix: `Regenerate: npx briefed init`,
65
+ });
66
+ }
67
+ }
68
+ checks.push({
69
+ name: "Gotcha rules",
70
+ status: "pass",
71
+ detail: `${ruleFiles.length} files, ${totalGotchas} constraints`,
72
+ fix: null,
73
+ });
74
+ }
75
+ else {
76
+ checks.push({
77
+ name: "Gotcha rules",
78
+ status: "warn",
79
+ detail: "No briefed rules found (may be a simple project)",
80
+ fix: null,
81
+ });
82
+ }
83
+ }
84
+ else {
85
+ checks.push({
86
+ name: "Gotcha rules",
87
+ status: "fail",
88
+ detail: ".claude/rules/ directory not found",
89
+ fix: "Run: npx briefed init",
90
+ });
91
+ }
92
+ // 3. Hooks installed
93
+ const settingsPath = join(root, ".claude", "settings.json");
94
+ if (existsSync(settingsPath)) {
95
+ const settings = JSON.parse(readFileSync(settingsPath, "utf-8"));
96
+ const hooksStr = JSON.stringify(settings.hooks || {});
97
+ const hasSessionStart = hooksStr.includes("session-start");
98
+ const hasPromptSubmit = hooksStr.includes("prompt-submit");
99
+ const hasPostRead = hooksStr.includes("post-read");
100
+ if (hasSessionStart && hasPromptSubmit) {
101
+ checks.push({
102
+ name: "Hooks",
103
+ status: "pass",
104
+ detail: `SessionStart: ${hasSessionStart ? "yes" : "no"}, PromptSubmit: ${hasPromptSubmit ? "yes" : "no"}, Learning: ${hasPostRead ? "yes" : "no"}`,
105
+ fix: null,
106
+ });
107
+ }
108
+ else {
109
+ checks.push({
110
+ name: "Hooks",
111
+ status: "warn",
112
+ detail: `Missing: ${!hasSessionStart ? "SessionStart " : ""}${!hasPromptSubmit ? "PromptSubmit " : ""}`,
113
+ fix: "Run: npx briefed init (without --skip-hooks)",
114
+ });
115
+ }
116
+ // Verify hook scripts exist
117
+ const hooksDir = join(root, ".briefed", "hooks");
118
+ if (existsSync(hooksDir)) {
119
+ const scripts = readdirSync(hooksDir);
120
+ if (!scripts.includes("session-start.js") || !scripts.includes("prompt-submit.js")) {
121
+ checks.push({
122
+ name: "Hook scripts",
123
+ status: "fail",
124
+ detail: "Hook scripts missing from .briefed/hooks/",
125
+ fix: "Run: npx briefed init",
126
+ });
127
+ }
128
+ }
129
+ }
130
+ else {
131
+ checks.push({
132
+ name: "Hooks",
133
+ status: "fail",
134
+ detail: "No .claude/settings.json found",
135
+ fix: "Run: npx briefed init",
136
+ });
137
+ }
138
+ // 4. Module index + contracts exist
139
+ const indexPath = join(root, ".briefed", "index.json");
140
+ if (existsSync(indexPath)) {
141
+ const index = JSON.parse(readFileSync(indexPath, "utf-8"));
142
+ const moduleCount = index.modules?.length || 0;
143
+ checks.push({
144
+ name: "Module index",
145
+ status: "pass",
146
+ detail: `${moduleCount} modules indexed`,
147
+ fix: null,
148
+ });
149
+ }
150
+ else {
151
+ checks.push({
152
+ name: "Module index",
153
+ status: "fail",
154
+ detail: "Not found",
155
+ fix: "Run: npx briefed init",
156
+ });
157
+ }
158
+ // 5. Staleness check
159
+ if (existsSync(indexPath)) {
160
+ const indexMtime = statSync(indexPath).mtime;
161
+ const age = Date.now() - indexMtime.getTime();
162
+ const ageHours = Math.round(age / 3600000);
163
+ try {
164
+ const commitsSince = execSync(`git log --oneline --since="${indexMtime.toISOString()}" -- "*.ts" "*.tsx" "*.js" "*.jsx" "*.py" "*.go" "*.rs"`, { cwd: root, encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim();
165
+ const commitCount = commitsSince ? commitsSince.split("\n").length : 0;
166
+ if (commitCount > 10) {
167
+ checks.push({
168
+ name: "Freshness",
169
+ status: "warn",
170
+ detail: `${commitCount} commits since last index (${ageHours}h ago)`,
171
+ fix: "Run: npx briefed init",
172
+ });
173
+ }
174
+ else if (commitCount > 0) {
175
+ checks.push({
176
+ name: "Freshness",
177
+ status: "pass",
178
+ detail: `${commitCount} commits since last index (${ageHours}h ago)`,
179
+ fix: null,
180
+ });
181
+ }
182
+ else {
183
+ checks.push({
184
+ name: "Freshness",
185
+ status: "pass",
186
+ detail: `Up to date (indexed ${ageHours}h ago)`,
187
+ fix: null,
188
+ });
189
+ }
190
+ }
191
+ catch {
192
+ checks.push({
193
+ name: "Freshness",
194
+ status: "pass",
195
+ detail: `Indexed ${ageHours}h ago (not a git repo)`,
196
+ fix: null,
197
+ });
198
+ }
199
+ }
200
+ // 6. Git hook installed
201
+ try {
202
+ const gitDir = execSync("git rev-parse --git-dir", {
203
+ cwd: root, encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"]
204
+ }).trim();
205
+ const hookPath = join(root, gitDir, "hooks", "post-commit");
206
+ if (existsSync(hookPath) && readFileSync(hookPath, "utf-8").includes("briefed")) {
207
+ checks.push({ name: "Git hook", status: "pass", detail: "post-commit auto-update installed", fix: null });
208
+ }
209
+ else {
210
+ checks.push({ name: "Git hook", status: "warn", detail: "Not installed — context won't auto-update", fix: "Run: npx briefed init" });
211
+ }
212
+ }
213
+ catch {
214
+ checks.push({ name: "Git hook", status: "warn", detail: "Not a git repository", fix: null });
215
+ }
216
+ // 7. Cross-tool files
217
+ if (existsSync(join(root, ".cursorrules"))) {
218
+ checks.push({ name: "Cursor support", status: "pass", detail: ".cursorrules present", fix: null });
219
+ }
220
+ if (existsSync(join(root, "AGENTS.md"))) {
221
+ checks.push({ name: "Cross-tool support", status: "pass", detail: "AGENTS.md present", fix: null });
222
+ }
223
+ // Output
224
+ const icons = { pass: " OK", warn: " !!", fail: " XX" };
225
+ for (const check of checks) {
226
+ const icon = icons[check.status];
227
+ console.log(`${icon} ${check.name}: ${check.detail}`);
228
+ if (check.fix) {
229
+ console.log(` Fix: ${check.fix}`);
230
+ }
231
+ }
232
+ const passed = checks.filter((c) => c.status === "pass").length;
233
+ const warned = checks.filter((c) => c.status === "warn").length;
234
+ const failed = checks.filter((c) => c.status === "fail").length;
235
+ console.log(`\n ${passed} passed, ${warned} warnings, ${failed} failed`);
236
+ if (failed > 0) {
237
+ console.log(" Run `npx briefed init` to fix all issues.");
238
+ }
239
+ else if (warned > 0) {
240
+ console.log(" Everything works. Warnings are non-critical.");
241
+ }
242
+ else {
243
+ console.log(" Everything looks good!");
244
+ }
245
+ }
246
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ interface InitOptions {
2
+ repo: string;
3
+ maxTokens: string;
4
+ skipHooks?: boolean;
5
+ skipRules?: boolean;
6
+ }
7
+ export declare function initCommand(opts: InitOptions): Promise<void>;
8
+ export {};
@@ -0,0 +1,319 @@
1
+ import { resolve } from "path";
2
+ import { detectStack } from "../utils/detect.js";
3
+ import { scanFiles } from "../extract/scanner.js";
4
+ import { extractFile } from "../extract/signatures.js";
5
+ import { buildDepGraph } from "../extract/depgraph.js";
6
+ import { computeComplexity } from "../extract/complexity.js";
7
+ import { extractGotchas } from "../extract/gotchas.js";
8
+ import { findTestMappings } from "../extract/tests.js";
9
+ import { getBatchHistory } from "../extract/history.js";
10
+ import { detectConventions, formatConventions } from "../extract/conventions.js";
11
+ import { generateSkeleton } from "../generate/skeleton.js";
12
+ import { generateRuleFiles } from "../generate/rules.js";
13
+ import { generateModuleIndex, writeModuleIndex, generateSimpleContracts } from "../generate/index-file.js";
14
+ import { updateClaudeMd, saveSkeletonFile } from "../deliver/claudemd.js";
15
+ import { installHooks, generateHookScripts } from "../deliver/hooks.js";
16
+ import { writeCursorRules, writeAgentsMd } from "../deliver/cross-tool.js";
17
+ import { installGitHook } from "../deliver/git-hook.js";
18
+ import { detectMonorepo } from "../extract/monorepo.js";
19
+ import { isSensitiveFile } from "../extract/security.js";
20
+ import { findUsageExamples, formatUsageExamples } from "../extract/usage-examples.js";
21
+ import { detectErrorPatterns } from "../extract/error-patterns.js";
22
+ import { extractSchemas, formatSchemas } from "../extract/schema.js";
23
+ import { extractRoutes, formatRoutes } from "../extract/routes.js";
24
+ import { extractEnvVars, formatEnvVars } from "../extract/env.js";
25
+ import { extractScripts, formatScripts } from "../extract/scripts.js";
26
+ import { extractFrontend, formatFrontend } from "../extract/frontend.js";
27
+ import { extractInfra, formatInfra } from "../extract/infra.js";
28
+ import { countTokens, formatTokens } from "../utils/tokens.js";
29
+ import { writeFileSync, mkdirSync, existsSync } from "fs";
30
+ import { join } from "path";
31
+ export async function initCommand(opts) {
32
+ const root = resolve(opts.repo);
33
+ const maxTokens = parseInt(opts.maxTokens, 10);
34
+ console.log(`briefed init — scanning ${root}`);
35
+ const startTime = Date.now();
36
+ // Step 0: Detect monorepo
37
+ const mono = detectMonorepo(root);
38
+ if (mono.isMonorepo && mono.currentPackage) {
39
+ console.log(` Monorepo detected — scoping to package: ${mono.currentPackage.name}`);
40
+ }
41
+ else if (mono.isMonorepo) {
42
+ console.log(` Monorepo detected (${mono.packages.length} packages) — indexing from root`);
43
+ }
44
+ // Step 1: Detect stack
45
+ console.log(" Detecting stack...");
46
+ const stack = detectStack(root);
47
+ console.log(` Stack: ${[...stack.languages, ...stack.frameworks].join(", ")}${stack.dbORM ? ` + ${stack.dbORM}` : ""}`);
48
+ // Step 2: Discover files (with security filtering)
49
+ console.log(" Scanning files...");
50
+ const scan = scanFiles(root);
51
+ // Filter out sensitive files
52
+ const sensitiveCount = scan.files.filter((f) => isSensitiveFile(f.path)).length;
53
+ scan.files = scan.files.filter((f) => !isSensitiveFile(f.path));
54
+ if (sensitiveCount > 0) {
55
+ console.log(` Excluded ${sensitiveCount} sensitive files (.env, credentials, keys)`);
56
+ }
57
+ console.log(` Found ${scan.totalFiles} source files`);
58
+ if (scan.totalFiles === 0) {
59
+ console.log(" No source files found. Nothing to do.");
60
+ return;
61
+ }
62
+ // Step 3: Extract signatures and imports from each file
63
+ console.log(" Extracting signatures...");
64
+ const extractions = [];
65
+ let extractErrors = 0;
66
+ for (const file of scan.files) {
67
+ try {
68
+ const extraction = extractFile(file.absolutePath, root);
69
+ extraction.path = file.path; // use relative path
70
+ extractions.push(extraction);
71
+ }
72
+ catch {
73
+ extractErrors++;
74
+ }
75
+ }
76
+ const totalSymbols = extractions.reduce((s, e) => s + e.symbols.length, 0);
77
+ console.log(` Extracted ${totalSymbols} symbols from ${extractions.length} files${extractErrors > 0 ? ` (${extractErrors} errors)` : ""}`);
78
+ // Step 4: Build dependency graph
79
+ console.log(" Building dependency graph...");
80
+ const depGraph = buildDepGraph(extractions, root);
81
+ const edgeCount = [...depGraph.nodes.values()].reduce((s, n) => s + n.outEdges.length, 0);
82
+ console.log(` Graph: ${depGraph.nodes.size} nodes, ${edgeCount} edges`);
83
+ // Step 5: Compute complexity scores
84
+ console.log(" Computing complexity scores...");
85
+ const complexityScores = [];
86
+ for (const ext of extractions) {
87
+ try {
88
+ const score = computeComplexity(ext, depGraph);
89
+ complexityScores.push(score);
90
+ }
91
+ catch {
92
+ // Skip files that can't be scored
93
+ }
94
+ }
95
+ const avgComplexity = complexityScores.length > 0
96
+ ? complexityScores.reduce((s, c) => s + c.score, 0) / complexityScores.length
97
+ : 0;
98
+ console.log(` Average complexity: ${avgComplexity.toFixed(1)}/10`);
99
+ // Step 6: Generate L1 skeleton
100
+ console.log(" Generating skeleton...");
101
+ const skeleton = generateSkeleton(stack, extractions, depGraph, complexityScores, { maxTokens });
102
+ const skeletonTokens = countTokens(skeleton);
103
+ console.log(` Skeleton: ${formatTokens(skeletonTokens)} tokens`);
104
+ // Step 7: Extract gotchas
105
+ console.log(" Extracting gotchas...");
106
+ let allGotchas = [];
107
+ for (const file of scan.files) {
108
+ try {
109
+ const gotchas = extractGotchas(file.absolutePath);
110
+ allGotchas = allGotchas.concat(gotchas);
111
+ }
112
+ catch {
113
+ // Skip files that can't be analyzed
114
+ }
115
+ }
116
+ console.log(` Found ${allGotchas.length} gotchas`);
117
+ // Step 7b: Find test file mappings (+45.97% pass@1 from research)
118
+ console.log(" Mapping test files...");
119
+ const testMappings = findTestMappings(scan.files.map((f) => f.path), root);
120
+ console.log(` Mapped ${testMappings.length} source→test pairs (${testMappings.reduce((s, t) => s + t.testCount, 0)} test cases)`);
121
+ // Step 7c: Extract git history for complex files
122
+ console.log(" Extracting git history...");
123
+ const fileComplexityPairs = complexityScores.map((c) => ({
124
+ path: c.file,
125
+ complexity: c.score,
126
+ }));
127
+ const histories = getBatchHistory(fileComplexityPairs, root, 3);
128
+ console.log(` History extracted for ${histories.size} complex files`);
129
+ // Step 7d: Detect project conventions
130
+ console.log(" Detecting conventions...");
131
+ const conventions = detectConventions(extractions, root);
132
+ const convText = formatConventions(conventions);
133
+ const convCount = [...Object.values(conventions)].flat().length;
134
+ console.log(` Detected ${convCount} conventions`);
135
+ // Step 7e: Find usage examples (3x improvement from research)
136
+ console.log(" Finding usage examples...");
137
+ const usageExamples = findUsageExamples(extractions);
138
+ const usageText = formatUsageExamples(usageExamples);
139
+ console.log(` Found examples for ${usageExamples.size} symbols`);
140
+ // Step 7f: Detect error handling patterns (prevents 2x error rate)
141
+ console.log(" Detecting error patterns...");
142
+ const errorPatterns = detectErrorPatterns(scan.files.map((f) => f.absolutePath));
143
+ console.log(` Detected ${errorPatterns.summary.length} error handling patterns`);
144
+ // Domain-specific extractors — only run what's relevant to this project
145
+ const hasBackend = stack.frameworks.some((f) => ["express", "fastify", "hono", "nestjs", "django", "fastapi", "flask", "gin", "echo", "fiber"].includes(f)) || stack.languages.some((l) => ["go", "rust", "java", "python"].includes(l));
146
+ const hasFrontend = stack.frameworks.some((f) => ["react", "next.js", "vue", "nuxt", "svelte", "astro", "remix", "angular"].includes(f));
147
+ const hasORM = !!stack.dbORM;
148
+ const hasInfra = existsSync(join(root, "docker-compose.yml")) ||
149
+ existsSync(join(root, "docker-compose.yaml")) ||
150
+ existsSync(join(root, "compose.yml")) ||
151
+ existsSync(join(root, "Dockerfile")) ||
152
+ existsSync(join(root, "vercel.json")) ||
153
+ existsSync(join(root, "fly.toml")) ||
154
+ existsSync(join(root, "terraform")) ||
155
+ existsSync(join(root, "k8s"));
156
+ // Schemas — only if ORM detected
157
+ let schemas = [];
158
+ if (hasORM) {
159
+ console.log(" Extracting schemas...");
160
+ schemas = extractSchemas(root);
161
+ console.log(` Found ${schemas.length} models/tables`);
162
+ }
163
+ // Routes — only if backend framework detected
164
+ let routes = [];
165
+ if (hasBackend || stack.frameworks.includes("next.js")) {
166
+ console.log(" Extracting routes...");
167
+ routes = extractRoutes(root);
168
+ if (routes.length > 0)
169
+ console.log(` Found ${routes.length} API endpoints`);
170
+ }
171
+ // Env vars — always useful
172
+ console.log(" Extracting env vars...");
173
+ const envVars = extractEnvVars(root);
174
+ if (envVars.length > 0)
175
+ console.log(` Found ${envVars.length} env vars (${envVars.filter((v) => v.required).length} required)`);
176
+ // Scripts — always useful
177
+ const scripts = extractScripts(root);
178
+ // Frontend — only if frontend framework detected
179
+ let frontend = {
180
+ framework: null, pages: [], components: [], stateStores: [], styling: null, uiLibrary: null
181
+ };
182
+ if (hasFrontend) {
183
+ console.log(" Extracting frontend...");
184
+ frontend = extractFrontend(root);
185
+ console.log(` Frontend: ${frontend.framework}, ${frontend.pages.length} pages, ${frontend.components.length} components`);
186
+ }
187
+ // Infra — only if infra files detected
188
+ let infra = {
189
+ services: [], ports: [], volumes: [], networks: [], providers: [], deployment: null
190
+ };
191
+ if (hasInfra) {
192
+ console.log(" Extracting infrastructure...");
193
+ infra = extractInfra(root);
194
+ console.log(` Infra: ${infra.services.length} services, deployment: ${infra.deployment || "detected"}`);
195
+ }
196
+ // Step 8: Generate module index + contracts
197
+ console.log(" Generating module index...");
198
+ const moduleIndex = generateModuleIndex(extractions, depGraph, complexityScores, root);
199
+ writeModuleIndex(root, moduleIndex);
200
+ console.log(` Indexed ${moduleIndex.modules.length} modules`);
201
+ console.log(" Generating contracts...");
202
+ generateSimpleContracts(moduleIndex, extractions, depGraph, root);
203
+ // Step 9: Write outputs
204
+ // Append conventions and test info to skeleton
205
+ let enrichedSkeleton = skeleton;
206
+ if (convText) {
207
+ enrichedSkeleton += "\n" + convText;
208
+ }
209
+ if (testMappings.length > 0) {
210
+ enrichedSkeleton += "\nTests: " + testMappings.length + " source files have matching test files";
211
+ }
212
+ if (errorPatterns.summary.length > 0) {
213
+ enrichedSkeleton += "\nError handling:\n" + errorPatterns.summary.map((s) => ` - ${s}`).join("\n");
214
+ }
215
+ if (usageText) {
216
+ enrichedSkeleton += "\n" + usageText;
217
+ }
218
+ const scriptsText = formatScripts(scripts);
219
+ if (scriptsText)
220
+ enrichedSkeleton += "\n" + scriptsText;
221
+ const schemasText = formatSchemas(schemas);
222
+ if (schemasText)
223
+ enrichedSkeleton += "\n" + schemasText;
224
+ const routesText = formatRoutes(routes);
225
+ if (routesText)
226
+ enrichedSkeleton += "\n" + routesText;
227
+ const envText = formatEnvVars(envVars);
228
+ if (envText)
229
+ enrichedSkeleton += "\n" + envText;
230
+ const frontendText = formatFrontend(frontend);
231
+ if (frontendText)
232
+ enrichedSkeleton += "\n" + frontendText;
233
+ const infraText = formatInfra(infra);
234
+ if (infraText)
235
+ enrichedSkeleton += "\n" + infraText;
236
+ // Save test mappings to .briefed/ for hook use
237
+ const briefedDir = join(root, ".briefed");
238
+ if (!existsSync(briefedDir))
239
+ mkdirSync(briefedDir, { recursive: true });
240
+ writeFileSync(join(briefedDir, "test-map.json"), JSON.stringify(Object.fromEntries(testMappings.map((t) => [t.sourceFile, { test: t.testFile, count: t.testCount, names: t.testNames.slice(0, 10) }])), null, 2));
241
+ // Save histories to .briefed/ for hook use
242
+ if (histories.size > 0) {
243
+ const histObj = {};
244
+ for (const [file, hist] of histories) {
245
+ histObj[file] = {
246
+ frequency: hist.changeFrequency,
247
+ recent: hist.recentCommits.slice(0, 3).map((c) => c.message),
248
+ };
249
+ }
250
+ writeFileSync(join(briefedDir, "history.json"), JSON.stringify(histObj, null, 2));
251
+ }
252
+ console.log(" Writing skeleton to CLAUDE.md...");
253
+ updateClaudeMd(root, enrichedSkeleton);
254
+ saveSkeletonFile(root, enrichedSkeleton);
255
+ if (!opts.skipRules) {
256
+ console.log(" Writing gotchas to .claude/rules/...");
257
+ const ruleFiles = generateRuleFiles(allGotchas, root);
258
+ const rulesDir = join(root, ".claude", "rules");
259
+ if (!existsSync(rulesDir))
260
+ mkdirSync(rulesDir, { recursive: true });
261
+ for (const [filename, content] of ruleFiles) {
262
+ writeFileSync(join(rulesDir, filename), content);
263
+ }
264
+ console.log(` Wrote ${ruleFiles.size} rule files`);
265
+ }
266
+ if (!opts.skipHooks) {
267
+ console.log(" Installing hooks...");
268
+ generateHookScripts(root);
269
+ installHooks(root);
270
+ console.log(" Hooks installed in .claude/settings.json");
271
+ }
272
+ // Cross-tool output
273
+ console.log(" Writing cross-tool context...");
274
+ writeCursorRules(root, enrichedSkeleton, convText);
275
+ writeAgentsMd(root, enrichedSkeleton, convText);
276
+ // Git hook for auto-updates
277
+ const hookInstalled = installGitHook(root);
278
+ if (hookInstalled) {
279
+ console.log(" Git hook installed (auto-updates on every commit)");
280
+ }
281
+ // Step 10: Summary
282
+ const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);
283
+ console.log("");
284
+ console.log(` Done in ${elapsed}s`);
285
+ console.log("");
286
+ console.log(" Output:");
287
+ console.log(` CLAUDE.md — skeleton + conventions (~${formatTokens(countTokens(enrichedSkeleton))} tokens)`);
288
+ console.log(` .cursorrules — Cursor IDE context`);
289
+ console.log(` AGENTS.md — cross-tool context`);
290
+ console.log(` .claude/rules/ — gotchas (${allGotchas.length} constraints, path-scoped)`);
291
+ console.log(` .briefed/contracts/ — module contracts (${moduleIndex.modules.length} modules)`);
292
+ console.log(` .briefed/test-map.json — test mappings (${testMappings.length} pairs, ${testMappings.reduce((s, t) => s + t.testCount, 0)} tests)`);
293
+ console.log(` .briefed/history.json — git history (${histories.size} files)`);
294
+ if (!opts.skipHooks) {
295
+ console.log(` .claude/settings.json — adaptive hooks`);
296
+ }
297
+ if (hookInstalled) {
298
+ console.log(` .git/hooks/post-commit — auto-updates on every commit`);
299
+ }
300
+ // Context budget report
301
+ const skeletonTk = countTokens(enrichedSkeleton);
302
+ const ruleTokens = allGotchas.length > 0 ? countTokens(allGotchas.map((g) => g.text).join("\n")) : 0;
303
+ const totalAlwaysLoaded = skeletonTk;
304
+ const totalPerPrompt = 500; // average contract injection
305
+ const totalPerFile = Math.round(ruleTokens / Math.max(1, allGotchas.length)) * 3; // ~3 gotchas per file
306
+ console.log("");
307
+ console.log(" Context budget:");
308
+ console.log(` Always loaded: ~${formatTokens(totalAlwaysLoaded)} tokens (skeleton + conventions)`);
309
+ console.log(` Per prompt: ~${formatTokens(totalPerPrompt)} tokens (adaptive module contracts)`);
310
+ console.log(` Per file: ~${formatTokens(totalPerFile)} tokens (path-scoped gotchas)`);
311
+ console.log(` Estimated total: ~${formatTokens(totalAlwaysLoaded + totalPerPrompt + totalPerFile)} tokens/prompt`);
312
+ console.log("");
313
+ console.log(` Without briefed, Claude spends ~5K-10K tokens reading files for orientation.`);
314
+ console.log(` Estimated savings: ~${formatTokens(Math.max(0, 7000 - totalAlwaysLoaded - totalPerPrompt))} tokens/prompt`);
315
+ console.log("");
316
+ console.log(" Context auto-updates on every commit. No CI needed.");
317
+ console.log(" Works with: Claude Code, Cursor, Copilot, and any tool that reads AGENTS.md");
318
+ }
319
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ interface StatsOptions {
2
+ repo: string;
3
+ }
4
+ export declare function statsCommand(opts: StatsOptions): Promise<void>;
5
+ export {};