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,188 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "fs";
|
|
2
|
+
import { join } from "path";
|
|
3
|
+
/** Detect the project's tech stack from config files */
|
|
4
|
+
export function detectStack(root) {
|
|
5
|
+
const info = {
|
|
6
|
+
languages: [],
|
|
7
|
+
frameworks: [],
|
|
8
|
+
packageManager: null,
|
|
9
|
+
entryPoints: [],
|
|
10
|
+
dbORM: null,
|
|
11
|
+
testFramework: null,
|
|
12
|
+
};
|
|
13
|
+
// Node.js / TypeScript / JavaScript
|
|
14
|
+
const pkgJsonPath = join(root, "package.json");
|
|
15
|
+
if (existsSync(pkgJsonPath)) {
|
|
16
|
+
info.languages.push("typescript", "javascript");
|
|
17
|
+
const pkg = JSON.parse(readFileSync(pkgJsonPath, "utf-8"));
|
|
18
|
+
const allDeps = {
|
|
19
|
+
...pkg.dependencies,
|
|
20
|
+
...pkg.devDependencies,
|
|
21
|
+
};
|
|
22
|
+
// Package manager
|
|
23
|
+
if (existsSync(join(root, "bun.lockb")) || existsSync(join(root, "bun.lock")))
|
|
24
|
+
info.packageManager = "bun";
|
|
25
|
+
else if (existsSync(join(root, "pnpm-lock.yaml")))
|
|
26
|
+
info.packageManager = "pnpm";
|
|
27
|
+
else if (existsSync(join(root, "yarn.lock")))
|
|
28
|
+
info.packageManager = "yarn";
|
|
29
|
+
else
|
|
30
|
+
info.packageManager = "npm";
|
|
31
|
+
// Frameworks
|
|
32
|
+
if (allDeps["next"])
|
|
33
|
+
info.frameworks.push("next.js");
|
|
34
|
+
if (allDeps["react"])
|
|
35
|
+
info.frameworks.push("react");
|
|
36
|
+
if (allDeps["vue"])
|
|
37
|
+
info.frameworks.push("vue");
|
|
38
|
+
if (allDeps["svelte"] || allDeps["@sveltejs/kit"])
|
|
39
|
+
info.frameworks.push("svelte");
|
|
40
|
+
if (allDeps["express"])
|
|
41
|
+
info.frameworks.push("express");
|
|
42
|
+
if (allDeps["fastify"])
|
|
43
|
+
info.frameworks.push("fastify");
|
|
44
|
+
if (allDeps["hono"])
|
|
45
|
+
info.frameworks.push("hono");
|
|
46
|
+
if (allDeps["@nestjs/core"])
|
|
47
|
+
info.frameworks.push("nestjs");
|
|
48
|
+
if (allDeps["nuxt"])
|
|
49
|
+
info.frameworks.push("nuxt");
|
|
50
|
+
if (allDeps["astro"])
|
|
51
|
+
info.frameworks.push("astro");
|
|
52
|
+
if (allDeps["remix"] || allDeps["@remix-run/node"])
|
|
53
|
+
info.frameworks.push("remix");
|
|
54
|
+
// DB/ORM
|
|
55
|
+
if (allDeps["prisma"] || allDeps["@prisma/client"])
|
|
56
|
+
info.dbORM = "prisma";
|
|
57
|
+
else if (allDeps["drizzle-orm"])
|
|
58
|
+
info.dbORM = "drizzle";
|
|
59
|
+
else if (allDeps["typeorm"])
|
|
60
|
+
info.dbORM = "typeorm";
|
|
61
|
+
else if (allDeps["sequelize"])
|
|
62
|
+
info.dbORM = "sequelize";
|
|
63
|
+
else if (allDeps["knex"])
|
|
64
|
+
info.dbORM = "knex";
|
|
65
|
+
else if (allDeps["mongoose"])
|
|
66
|
+
info.dbORM = "mongoose";
|
|
67
|
+
// Test frameworks
|
|
68
|
+
if (allDeps["vitest"])
|
|
69
|
+
info.testFramework = "vitest";
|
|
70
|
+
else if (allDeps["jest"])
|
|
71
|
+
info.testFramework = "jest";
|
|
72
|
+
else if (allDeps["mocha"])
|
|
73
|
+
info.testFramework = "mocha";
|
|
74
|
+
else if (allDeps["playwright"] || allDeps["@playwright/test"])
|
|
75
|
+
info.testFramework = "playwright";
|
|
76
|
+
// Entry points
|
|
77
|
+
if (allDeps["next"]) {
|
|
78
|
+
if (existsSync(join(root, "src/app")))
|
|
79
|
+
info.entryPoints.push("src/app/layout.tsx");
|
|
80
|
+
else if (existsSync(join(root, "app")))
|
|
81
|
+
info.entryPoints.push("app/layout.tsx");
|
|
82
|
+
else
|
|
83
|
+
info.entryPoints.push("pages/index.tsx");
|
|
84
|
+
}
|
|
85
|
+
if (pkg.main)
|
|
86
|
+
info.entryPoints.push(pkg.main);
|
|
87
|
+
}
|
|
88
|
+
// Python
|
|
89
|
+
if (existsSync(join(root, "pyproject.toml")) ||
|
|
90
|
+
existsSync(join(root, "requirements.txt")) ||
|
|
91
|
+
existsSync(join(root, "setup.py"))) {
|
|
92
|
+
if (!info.languages.includes("python"))
|
|
93
|
+
info.languages.push("python");
|
|
94
|
+
if (existsSync(join(root, "pyproject.toml"))) {
|
|
95
|
+
const pyproj = readFileSync(join(root, "pyproject.toml"), "utf-8");
|
|
96
|
+
if (pyproj.includes("django"))
|
|
97
|
+
info.frameworks.push("django");
|
|
98
|
+
if (pyproj.includes("fastapi"))
|
|
99
|
+
info.frameworks.push("fastapi");
|
|
100
|
+
if (pyproj.includes("flask"))
|
|
101
|
+
info.frameworks.push("flask");
|
|
102
|
+
if (pyproj.includes("sqlalchemy"))
|
|
103
|
+
info.dbORM = "sqlalchemy";
|
|
104
|
+
if (pyproj.includes("pytest"))
|
|
105
|
+
info.testFramework = "pytest";
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
// Go
|
|
109
|
+
if (existsSync(join(root, "go.mod"))) {
|
|
110
|
+
info.languages.push("go");
|
|
111
|
+
const gomod = readFileSync(join(root, "go.mod"), "utf-8");
|
|
112
|
+
if (gomod.includes("gin-gonic"))
|
|
113
|
+
info.frameworks.push("gin");
|
|
114
|
+
if (gomod.includes("echo"))
|
|
115
|
+
info.frameworks.push("echo");
|
|
116
|
+
if (gomod.includes("fiber"))
|
|
117
|
+
info.frameworks.push("fiber");
|
|
118
|
+
if (existsSync(join(root, "main.go")))
|
|
119
|
+
info.entryPoints.push("main.go");
|
|
120
|
+
else if (existsSync(join(root, "cmd")))
|
|
121
|
+
info.entryPoints.push("cmd/");
|
|
122
|
+
}
|
|
123
|
+
// Rust
|
|
124
|
+
if (existsSync(join(root, "Cargo.toml"))) {
|
|
125
|
+
info.languages.push("rust");
|
|
126
|
+
if (existsSync(join(root, "src/main.rs")))
|
|
127
|
+
info.entryPoints.push("src/main.rs");
|
|
128
|
+
else if (existsSync(join(root, "src/lib.rs")))
|
|
129
|
+
info.entryPoints.push("src/lib.rs");
|
|
130
|
+
}
|
|
131
|
+
// Java / Kotlin
|
|
132
|
+
if (existsSync(join(root, "pom.xml")) || existsSync(join(root, "build.gradle")) || existsSync(join(root, "build.gradle.kts"))) {
|
|
133
|
+
info.languages.push("java");
|
|
134
|
+
}
|
|
135
|
+
return info;
|
|
136
|
+
}
|
|
137
|
+
/** Map file extension to language name */
|
|
138
|
+
export function extToLanguage(ext) {
|
|
139
|
+
const map = {
|
|
140
|
+
".ts": "typescript",
|
|
141
|
+
".tsx": "typescript",
|
|
142
|
+
".js": "javascript",
|
|
143
|
+
".jsx": "javascript",
|
|
144
|
+
".mjs": "javascript",
|
|
145
|
+
".cjs": "javascript",
|
|
146
|
+
".py": "python",
|
|
147
|
+
".go": "go",
|
|
148
|
+
".rs": "rust",
|
|
149
|
+
".java": "java",
|
|
150
|
+
".kt": "kotlin",
|
|
151
|
+
".c": "c",
|
|
152
|
+
".h": "c",
|
|
153
|
+
".cpp": "cpp",
|
|
154
|
+
".cc": "cpp",
|
|
155
|
+
".cs": "csharp",
|
|
156
|
+
".rb": "ruby",
|
|
157
|
+
".php": "php",
|
|
158
|
+
".swift": "swift",
|
|
159
|
+
".scala": "scala",
|
|
160
|
+
".ex": "elixir",
|
|
161
|
+
".exs": "elixir",
|
|
162
|
+
};
|
|
163
|
+
return map[ext] || null;
|
|
164
|
+
}
|
|
165
|
+
/** File extensions we should parse */
|
|
166
|
+
export const PARSEABLE_EXTENSIONS = new Set([
|
|
167
|
+
".ts", ".tsx", ".js", ".jsx", ".mjs", ".cjs",
|
|
168
|
+
".py",
|
|
169
|
+
".go",
|
|
170
|
+
".rs",
|
|
171
|
+
".java", ".kt",
|
|
172
|
+
".c", ".h", ".cpp", ".cc",
|
|
173
|
+
".cs",
|
|
174
|
+
".rb",
|
|
175
|
+
".php",
|
|
176
|
+
".swift",
|
|
177
|
+
".scala",
|
|
178
|
+
".ex", ".exs",
|
|
179
|
+
]);
|
|
180
|
+
/** Directories to always skip */
|
|
181
|
+
export const SKIP_DIRS = new Set([
|
|
182
|
+
"node_modules", ".git", "dist", "build", ".next", ".nuxt",
|
|
183
|
+
"__pycache__", ".pytest_cache", "venv", ".venv", "env",
|
|
184
|
+
"vendor", "target", ".cargo",
|
|
185
|
+
"coverage", ".nyc_output",
|
|
186
|
+
".briefed", ".claude",
|
|
187
|
+
]);
|
|
188
|
+
//# sourceMappingURL=detect.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/utils/detect.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple PageRank implementation for dependency graph ranking.
|
|
3
|
+
* Identifies which files are most central to the codebase.
|
|
4
|
+
*/
|
|
5
|
+
export interface GraphNode {
|
|
6
|
+
id: string;
|
|
7
|
+
outEdges: string[];
|
|
8
|
+
inEdges: string[];
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Compute PageRank scores for a file dependency graph.
|
|
12
|
+
* Returns map of file path → score (higher = more central).
|
|
13
|
+
*/
|
|
14
|
+
export declare function computePageRank(nodes: Map<string, GraphNode>, iterations?: number, damping?: number): Map<string, number>;
|
|
15
|
+
/**
|
|
16
|
+
* Get reference count (in-degree) for each node.
|
|
17
|
+
* Simpler than PageRank but still useful for ranking.
|
|
18
|
+
*/
|
|
19
|
+
export declare function computeRefCounts(nodes: Map<string, GraphNode>): Map<string, number>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple PageRank implementation for dependency graph ranking.
|
|
3
|
+
* Identifies which files are most central to the codebase.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Compute PageRank scores for a file dependency graph.
|
|
7
|
+
* Returns map of file path → score (higher = more central).
|
|
8
|
+
*/
|
|
9
|
+
export function computePageRank(nodes, iterations = 20, damping = 0.85) {
|
|
10
|
+
const n = nodes.size;
|
|
11
|
+
if (n === 0)
|
|
12
|
+
return new Map();
|
|
13
|
+
// Initialize scores
|
|
14
|
+
const scores = new Map();
|
|
15
|
+
const initialScore = 1 / n;
|
|
16
|
+
for (const id of nodes.keys()) {
|
|
17
|
+
scores.set(id, initialScore);
|
|
18
|
+
}
|
|
19
|
+
// Iterate
|
|
20
|
+
for (let i = 0; i < iterations; i++) {
|
|
21
|
+
const newScores = new Map();
|
|
22
|
+
const base = (1 - damping) / n;
|
|
23
|
+
for (const [id, node] of nodes) {
|
|
24
|
+
let incomingScore = 0;
|
|
25
|
+
for (const sourceId of node.inEdges) {
|
|
26
|
+
const sourceNode = nodes.get(sourceId);
|
|
27
|
+
if (sourceNode && sourceNode.outEdges.length > 0) {
|
|
28
|
+
const sourceScore = scores.get(sourceId) || 0;
|
|
29
|
+
incomingScore += sourceScore / sourceNode.outEdges.length;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
newScores.set(id, base + damping * incomingScore);
|
|
33
|
+
}
|
|
34
|
+
// Update scores
|
|
35
|
+
for (const [id, score] of newScores) {
|
|
36
|
+
scores.set(id, score);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return scores;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Get reference count (in-degree) for each node.
|
|
43
|
+
* Simpler than PageRank but still useful for ranking.
|
|
44
|
+
*/
|
|
45
|
+
export function computeRefCounts(nodes) {
|
|
46
|
+
const counts = new Map();
|
|
47
|
+
for (const [id, node] of nodes) {
|
|
48
|
+
counts.set(id, node.inEdges.length);
|
|
49
|
+
}
|
|
50
|
+
return counts;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=pagerank.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pagerank.js","sourceRoot":"","sources":["../../src/utils/pagerank.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAQH;;;GAGG;AACH,MAAM,UAAU,eAAe,CAC7B,KAA6B,EAC7B,aAAqB,EAAE,EACvB,UAAkB,IAAI;IAEtB,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC;IACrB,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,GAAG,EAAE,CAAC;IAE9B,oBAAoB;IACpB,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,YAAY,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;QAC9B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,YAAY,CAAC,CAAC;IAC/B,CAAC;IAED,UAAU;IACV,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;QAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAE/B,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;YAC/B,IAAI,aAAa,GAAG,CAAC,CAAC;YACtB,KAAK,MAAM,QAAQ,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;gBACpC,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACvC,IAAI,UAAU,IAAI,UAAU,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;oBAC9C,aAAa,IAAI,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC5D,CAAC;YACH,CAAC;YACD,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,GAAG,OAAO,GAAG,aAAa,CAAC,CAAC;QACpD,CAAC;QAED,gBAAgB;QAChB,KAAK,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAA6B;IAC5D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,KAAK,EAAE,CAAC;QAC/B,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACtC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token estimation without external dependencies.
|
|
3
|
+
* Uses a byte-based heuristic that closely approximates cl100k_base encoding.
|
|
4
|
+
* Accurate to within ~10% for English text and code.
|
|
5
|
+
*/
|
|
6
|
+
/** Estimate token count for a string */
|
|
7
|
+
export declare function countTokens(text: string): number;
|
|
8
|
+
/** Format token count for display */
|
|
9
|
+
export declare function formatTokens(count: number): string;
|
|
10
|
+
/** Format byte count for display */
|
|
11
|
+
export declare function formatBytes(bytes: number): string;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token estimation without external dependencies.
|
|
3
|
+
* Uses a byte-based heuristic that closely approximates cl100k_base encoding.
|
|
4
|
+
* Accurate to within ~10% for English text and code.
|
|
5
|
+
*/
|
|
6
|
+
/** Estimate token count for a string */
|
|
7
|
+
export function countTokens(text) {
|
|
8
|
+
// cl100k_base averages ~4 chars per token for English/code
|
|
9
|
+
// Adjust for common code patterns: shorter tokens for symbols, longer for identifiers
|
|
10
|
+
const bytes = Buffer.byteLength(text, "utf-8");
|
|
11
|
+
return Math.ceil(bytes / 3.7);
|
|
12
|
+
}
|
|
13
|
+
/** Format token count for display */
|
|
14
|
+
export function formatTokens(count) {
|
|
15
|
+
if (count >= 1000)
|
|
16
|
+
return `${(count / 1000).toFixed(1)}K`;
|
|
17
|
+
return count.toString();
|
|
18
|
+
}
|
|
19
|
+
/** Format byte count for display */
|
|
20
|
+
export function formatBytes(bytes) {
|
|
21
|
+
if (bytes >= 1_000_000)
|
|
22
|
+
return `${(bytes / 1_000_000).toFixed(1)}MB`;
|
|
23
|
+
if (bytes >= 1_000)
|
|
24
|
+
return `${(bytes / 1_000).toFixed(1)}KB`;
|
|
25
|
+
return `${bytes}B`;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../src/utils/tokens.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,wCAAwC;AACxC,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,2DAA2D;IAC3D,sFAAsF;IACtF,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;AAChC,CAAC;AAED,qCAAqC;AACrC,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,IAAI,KAAK,IAAI,IAAI;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1D,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;AAC1B,CAAC;AAED,oCAAoC;AACpC,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,IAAI,KAAK,IAAI,SAAS;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,SAAS,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACrE,IAAI,KAAK,IAAI,KAAK;QAAE,OAAO,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,OAAO,GAAG,KAAK,GAAG,CAAC;AACrB,CAAC"}
|
package/package.json
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "briefed",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Adaptive Context Engine — compile your codebase into focused, token-efficient context for AI coding tools",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"bin": {
|
|
7
|
+
"briefed": "./dist/cli.js"
|
|
8
|
+
},
|
|
9
|
+
"scripts": {
|
|
10
|
+
"build": "tsc",
|
|
11
|
+
"dev": "tsc --watch",
|
|
12
|
+
"start": "node dist/cli.js",
|
|
13
|
+
"lint": "tsc --noEmit",
|
|
14
|
+
"bench": "node dist/cli.js bench",
|
|
15
|
+
"prepublishOnly": "npm run build"
|
|
16
|
+
},
|
|
17
|
+
"keywords": ["ai", "context", "claude", "cursor", "copilot", "llm", "codebase", "developer-tools"],
|
|
18
|
+
"author": "Wesley",
|
|
19
|
+
"license": "MIT",
|
|
20
|
+
"homepage": "https://github.com/WesOps/briefed",
|
|
21
|
+
"repository": {
|
|
22
|
+
"type": "git",
|
|
23
|
+
"url": "https://github.com/WesOps/briefed.git"
|
|
24
|
+
},
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/WesOps/briefed/issues"
|
|
27
|
+
},
|
|
28
|
+
"engines": { "node": ">=20" },
|
|
29
|
+
"files": ["dist", "README.md", "LICENSE"],
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"commander": "^13.1.0",
|
|
32
|
+
"web-tree-sitter": "^0.24.7",
|
|
33
|
+
"glob": "^11.0.1",
|
|
34
|
+
"simple-git": "^3.27.0",
|
|
35
|
+
"minimatch": "^10.0.1",
|
|
36
|
+
"js-yaml": "^4.1.0"
|
|
37
|
+
},
|
|
38
|
+
"devDependencies": {
|
|
39
|
+
"@types/js-yaml": "^4.0.9",
|
|
40
|
+
"@types/node": "^22.13.0",
|
|
41
|
+
"typescript": "^5.7.3"
|
|
42
|
+
}
|
|
43
|
+
}
|