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,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
+ }