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,145 @@
1
+ import { readFileSync } from "fs";
2
+ /**
3
+ * Extract gotchas from a source file.
4
+ * These are non-obvious constraints that cause bugs when AI misses them.
5
+ */
6
+ export function extractGotchas(filePath) {
7
+ const content = readFileSync(filePath, "utf-8");
8
+ const lines = content.split("\n");
9
+ const gotchas = [];
10
+ for (let i = 0; i < lines.length; i++) {
11
+ const line = lines[i];
12
+ const trimmed = line.trim();
13
+ // Important comments (not just any TODO — ones with meaningful constraints)
14
+ const commentMatch = trimmed.match(/(?:\/\/|#|\/\*)\s*(TODO|HACK|FIXME|NOTE|IMPORTANT|WARNING|WARN|BUG|XXX|SAFETY|INVARIANT)\s*:?\s*(.+)/i);
15
+ if (commentMatch) {
16
+ const text = commentMatch[2].trim().replace(/\*\/\s*$/, "");
17
+ // Filter out trivial TODOs like "TODO: add tests" or "TODO: refactor"
18
+ if (text.length > 15 && !isTrivialComment(text)) {
19
+ gotchas.push({
20
+ file: filePath,
21
+ line: i + 1,
22
+ category: "important_comment",
23
+ text: `${commentMatch[1]}: ${text}`,
24
+ });
25
+ }
26
+ }
27
+ // Guard clauses — throw/raise at start of function
28
+ const guardMatch = trimmed.match(/(?:throw\s+new\s+(\w+Error)\s*\(|raise\s+(\w+)\s*\(|panic\s*\()['"](.+?)['"]/);
29
+ if (guardMatch) {
30
+ const errorType = guardMatch[1] || guardMatch[2] || "panic";
31
+ const message = guardMatch[3] || "";
32
+ // Look at context — is this inside an if block (guard pattern)?
33
+ const prevLines = lines.slice(Math.max(0, i - 3), i).join(" ");
34
+ if (prevLines.match(/if\s*\(/)) {
35
+ gotchas.push({
36
+ file: filePath,
37
+ line: i + 1,
38
+ category: "guard_clause",
39
+ text: `Throws ${errorType}: ${message}`,
40
+ });
41
+ }
42
+ }
43
+ // State transitions — switch on status/state
44
+ const stateMatch = trimmed.match(/switch\s*\(\s*\w+\.(status|state|phase|stage|step)\s*\)/i);
45
+ if (stateMatch) {
46
+ // Extract case values
47
+ const cases = [];
48
+ for (let j = i + 1; j < Math.min(i + 30, lines.length); j++) {
49
+ const caseLine = lines[j].trim();
50
+ if (caseLine === "}")
51
+ break;
52
+ const caseMatch = caseLine.match(/case\s+['"]?(\w+)['"]?\s*:/);
53
+ if (caseMatch)
54
+ cases.push(caseMatch[1]);
55
+ }
56
+ if (cases.length > 0) {
57
+ gotchas.push({
58
+ file: filePath,
59
+ line: i + 1,
60
+ category: "state_transition",
61
+ text: `Status transitions: ${cases.join(" → ")}`,
62
+ });
63
+ }
64
+ }
65
+ // Enum-based state machines
66
+ const enumStateMatch = trimmed.match(/enum\s+(\w*(?:Status|State|Phase|Stage)\w*)/);
67
+ if (enumStateMatch) {
68
+ const values = [];
69
+ for (let j = i + 1; j < Math.min(i + 20, lines.length); j++) {
70
+ const valLine = lines[j].trim();
71
+ if (valLine === "}" || valLine === "}")
72
+ break;
73
+ const valMatch = valLine.match(/^(\w+)\s*[=,]/);
74
+ if (valMatch)
75
+ values.push(valMatch[1]);
76
+ }
77
+ if (values.length > 0) {
78
+ gotchas.push({
79
+ file: filePath,
80
+ line: i + 1,
81
+ category: "state_transition",
82
+ text: `${enumStateMatch[1]} values: ${values.join(", ")}`,
83
+ });
84
+ }
85
+ }
86
+ // Side effects — event emission
87
+ const eventMatch = trimmed.match(/(?:emit|publish|dispatch|send|fire|trigger)\s*\(\s*['"](\w+)['"]/i);
88
+ if (eventMatch) {
89
+ gotchas.push({
90
+ file: filePath,
91
+ line: i + 1,
92
+ category: "side_effect",
93
+ text: `Emits event: ${eventMatch[1]}`,
94
+ });
95
+ }
96
+ // Soft delete patterns
97
+ const softDeleteMatch = trimmed.match(/(?:deletedAt|deleted_at|isDeleted|is_deleted|archivedAt|archived_at)\s*[!=:]/);
98
+ if (softDeleteMatch && !trimmed.startsWith("//") && !trimmed.startsWith("#")) {
99
+ gotchas.push({
100
+ file: filePath,
101
+ line: i + 1,
102
+ category: "soft_delete",
103
+ text: "Uses soft deletes — queries must filter deleted records",
104
+ });
105
+ }
106
+ // Unique constraint checks
107
+ const uniqueMatch = trimmed.match(/(?:findFirst|findOne|findUnique|exists|count)\s*\(/);
108
+ if (uniqueMatch) {
109
+ // Check if followed by a throw (uniqueness enforcement)
110
+ const nextLines = lines.slice(i, Math.min(i + 5, lines.length)).join(" ");
111
+ if (nextLines.match(/(?:throw|raise|Conflict|Already\s+exists|Duplicate)/i)) {
112
+ gotchas.push({
113
+ file: filePath,
114
+ line: i + 1,
115
+ category: "unique_constraint",
116
+ text: "Enforces uniqueness — throws on duplicate",
117
+ });
118
+ }
119
+ }
120
+ }
121
+ // Deduplicate soft_delete entries (only keep first per file)
122
+ const seen = new Set();
123
+ return gotchas.filter((g) => {
124
+ if (g.category === "soft_delete") {
125
+ const key = `${g.file}:${g.category}`;
126
+ if (seen.has(key))
127
+ return false;
128
+ seen.add(key);
129
+ }
130
+ return true;
131
+ });
132
+ }
133
+ function isTrivialComment(text) {
134
+ const trivial = [
135
+ /^add\s+(tests?|logging|docs|types?|comments?)/i,
136
+ /^refactor/i,
137
+ /^clean\s*up/i,
138
+ /^remove\s+this/i,
139
+ /^fix\s+this\s+later/i,
140
+ /^implement/i,
141
+ /^move\s+to/i,
142
+ ];
143
+ return trivial.some((r) => r.test(text));
144
+ }
145
+ //# sourceMappingURL=gotchas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gotchas.js","sourceRoot":"","sources":["../../src/extract/gotchas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ export interface FileHistory {
2
+ file: string;
3
+ recentCommits: CommitInfo[];
4
+ changeFrequency: number;
5
+ lastChanged: string | null;
6
+ }
7
+ export interface CommitInfo {
8
+ hash: string;
9
+ message: string;
10
+ date: string;
11
+ author: string;
12
+ }
13
+ /**
14
+ * Extract recent git history for files.
15
+ * Shows WHY code is the way it is — addresses the "wrong problem mapping" failure (21% of LLM errors).
16
+ */
17
+ export declare function getFileHistory(filePath: string, root: string, maxCommits?: number): FileHistory | null;
18
+ /**
19
+ * Get history for multiple files efficiently.
20
+ * Only processes files above a complexity threshold (don't waste time on simple files).
21
+ */
22
+ export declare function getBatchHistory(files: Array<{
23
+ path: string;
24
+ complexity: number;
25
+ }>, root: string, complexityThreshold?: number): Map<string, FileHistory>;
26
+ /**
27
+ * Format file history for context injection.
28
+ */
29
+ export declare function formatHistory(history: FileHistory): string;
@@ -0,0 +1,91 @@
1
+ import { execSync } from "child_process";
2
+ /**
3
+ * Extract recent git history for files.
4
+ * Shows WHY code is the way it is — addresses the "wrong problem mapping" failure (21% of LLM errors).
5
+ */
6
+ export function getFileHistory(filePath, root, maxCommits = 5) {
7
+ try {
8
+ const result = execSync(`git log --format="%H|%s|%ai|%an" -n ${maxCommits} --follow -- "${filePath}"`, { cwd: root, encoding: "utf-8", timeout: 5000, stdio: ["pipe", "pipe", "pipe"] }).trim();
9
+ if (!result)
10
+ return null;
11
+ const commits = result
12
+ .split("\n")
13
+ .filter(Boolean)
14
+ .map((line) => {
15
+ const [hash, message, date, author] = line.split("|");
16
+ return {
17
+ hash: hash?.slice(0, 7) || "",
18
+ message: (message || "").trim(),
19
+ date: (date || "").trim(),
20
+ author: (author || "").trim(),
21
+ };
22
+ })
23
+ .filter((c) => c.message && !isTrivialCommit(c.message));
24
+ // Count commits in last 30 days
25
+ let recentCount = 0;
26
+ try {
27
+ const countResult = execSync(`git log --since="30 days ago" --oneline --follow -- "${filePath}"`, { cwd: root, encoding: "utf-8", timeout: 5000, stdio: ["pipe", "pipe", "pipe"] }).trim();
28
+ recentCount = countResult ? countResult.split("\n").length : 0;
29
+ }
30
+ catch {
31
+ // ignore
32
+ }
33
+ return {
34
+ file: filePath,
35
+ recentCommits: commits,
36
+ changeFrequency: recentCount,
37
+ lastChanged: commits[0]?.date || null,
38
+ };
39
+ }
40
+ catch {
41
+ return null;
42
+ }
43
+ }
44
+ /**
45
+ * Get history for multiple files efficiently.
46
+ * Only processes files above a complexity threshold (don't waste time on simple files).
47
+ */
48
+ export function getBatchHistory(files, root, complexityThreshold = 3) {
49
+ const histories = new Map();
50
+ // Only get history for complex files (above threshold)
51
+ const importantFiles = files.filter((f) => f.complexity >= complexityThreshold);
52
+ for (const file of importantFiles) {
53
+ const history = getFileHistory(file.path, root);
54
+ if (history && history.recentCommits.length > 0) {
55
+ histories.set(file.path, history);
56
+ }
57
+ }
58
+ return histories;
59
+ }
60
+ /**
61
+ * Format file history for context injection.
62
+ */
63
+ export function formatHistory(history) {
64
+ if (history.recentCommits.length === 0)
65
+ return "";
66
+ const lines = [];
67
+ lines.push(`recent_changes: ${history.changeFrequency} commits in 30 days`);
68
+ for (const commit of history.recentCommits.slice(0, 3)) {
69
+ lines.push(` - ${commit.message} (${commit.date.split(" ")[0]})`);
70
+ }
71
+ return lines.join("\n");
72
+ }
73
+ /**
74
+ * Filter out trivial/noisy commit messages.
75
+ */
76
+ function isTrivialCommit(message) {
77
+ const trivial = [
78
+ /^merge\s/i,
79
+ /^wip$/i,
80
+ /^fixup/i,
81
+ /^squash/i,
82
+ /^revert\s+"?revert/i,
83
+ /^bump\s+version/i,
84
+ /^update\s+dependencies/i,
85
+ /^chore\(deps\)/i,
86
+ /^auto-commit/i,
87
+ /^initial commit$/i,
88
+ ];
89
+ return trivial.some((r) => r.test(message.trim()));
90
+ }
91
+ //# sourceMappingURL=history.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/extract/history.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ export interface InfraInfo {
2
+ services: InfraService[];
3
+ ports: Array<{
4
+ service: string;
5
+ port: number;
6
+ protocol: string;
7
+ }>;
8
+ volumes: string[];
9
+ networks: string[];
10
+ providers: string[];
11
+ deployment: string | null;
12
+ }
13
+ export interface InfraService {
14
+ name: string;
15
+ image: string | null;
16
+ type: string;
17
+ source: string;
18
+ }
19
+ /**
20
+ * Extract infrastructure configuration.
21
+ * Sources: docker-compose, Dockerfile, Terraform, K8s manifests, Vercel/Netlify config.
22
+ */
23
+ export declare function extractInfra(root: string): InfraInfo;
24
+ /**
25
+ * Format infra info for skeleton inclusion.
26
+ */
27
+ export declare function formatInfra(info: InfraInfo): string;
@@ -0,0 +1,226 @@
1
+ import { readFileSync, existsSync } from "fs";
2
+ import { join } from "path";
3
+ import { glob } from "glob";
4
+ /**
5
+ * Extract infrastructure configuration.
6
+ * Sources: docker-compose, Dockerfile, Terraform, K8s manifests, Vercel/Netlify config.
7
+ */
8
+ export function extractInfra(root) {
9
+ const info = {
10
+ services: [],
11
+ ports: [],
12
+ volumes: [],
13
+ networks: [],
14
+ providers: [],
15
+ deployment: null,
16
+ };
17
+ // Docker Compose
18
+ const composeFiles = ["docker-compose.yml", "docker-compose.yaml", "compose.yml", "compose.yaml"];
19
+ for (const cf of composeFiles) {
20
+ const path = join(root, cf);
21
+ if (existsSync(path)) {
22
+ parseDockerCompose(readFileSync(path, "utf-8"), cf, info);
23
+ }
24
+ }
25
+ // Dockerfile
26
+ const dockerfiles = glob.sync("{Dockerfile,*.Dockerfile,docker/Dockerfile*}", { cwd: root });
27
+ if (dockerfiles.length > 0) {
28
+ for (const df of dockerfiles) {
29
+ parseDockerfile(readFileSync(join(root, df), "utf-8"), df, info);
30
+ }
31
+ }
32
+ // Deployment platform detection
33
+ if (existsSync(join(root, "vercel.json"))) {
34
+ info.providers.push("vercel");
35
+ info.deployment = "vercel";
36
+ }
37
+ if (existsSync(join(root, "netlify.toml"))) {
38
+ info.providers.push("netlify");
39
+ info.deployment = "netlify";
40
+ }
41
+ if (existsSync(join(root, "fly.toml"))) {
42
+ info.providers.push("fly.io");
43
+ info.deployment = "fly.io";
44
+ }
45
+ if (existsSync(join(root, "railway.json")) || existsSync(join(root, "railway.toml"))) {
46
+ info.providers.push("railway");
47
+ info.deployment = "railway";
48
+ }
49
+ if (existsSync(join(root, "render.yaml"))) {
50
+ info.providers.push("render");
51
+ info.deployment = "render";
52
+ }
53
+ if (existsSync(join(root, "Procfile"))) {
54
+ info.providers.push("heroku");
55
+ info.deployment = "heroku";
56
+ }
57
+ // Terraform
58
+ const tfFiles = glob.sync("**/*.tf", { cwd: root, ignore: [".terraform/**"] });
59
+ if (tfFiles.length > 0) {
60
+ for (const tf of tfFiles.slice(0, 10)) {
61
+ parseTerraform(readFileSync(join(root, tf), "utf-8"), tf, info);
62
+ }
63
+ }
64
+ // Kubernetes
65
+ const k8sFiles = glob.sync("**/{deployment,service,ingress,configmap}*.{yml,yaml}", {
66
+ cwd: root,
67
+ ignore: ["node_modules/**"],
68
+ });
69
+ if (k8sFiles.length > 0) {
70
+ info.providers.push("kubernetes");
71
+ for (const k8s of k8sFiles.slice(0, 10)) {
72
+ parseK8s(readFileSync(join(root, k8s), "utf-8"), k8s, info);
73
+ }
74
+ }
75
+ return info;
76
+ }
77
+ function parseDockerCompose(content, source, info) {
78
+ // Simple YAML parsing for services
79
+ const serviceRegex = /^\s{2}(\w[\w-]*)\s*:\s*$/gm;
80
+ const imageRegex = /image:\s*['"]?([^\s'"]+)/g;
81
+ const portRegex = /['"]?(\d+):(\d+)['"]?/g;
82
+ const volumeRegex = /volumes:\s*\n((?:\s+-\s+.+\n)*)/g;
83
+ let currentService = "";
84
+ for (const line of content.split("\n")) {
85
+ const svcMatch = line.match(/^ (\w[\w-]*):\s*$/);
86
+ if (svcMatch) {
87
+ currentService = svcMatch[1];
88
+ const type = classifyService(currentService);
89
+ info.services.push({
90
+ name: currentService,
91
+ image: null,
92
+ type,
93
+ source,
94
+ });
95
+ }
96
+ if (currentService) {
97
+ const imgMatch = line.match(/image:\s*['"]?([^\s'"]+)/);
98
+ if (imgMatch) {
99
+ const svc = info.services.find((s) => s.name === currentService);
100
+ if (svc)
101
+ svc.image = imgMatch[1];
102
+ }
103
+ const portMatch = line.match(/['"]?(\d+):(\d+)['"]?/);
104
+ if (portMatch) {
105
+ info.ports.push({
106
+ service: currentService,
107
+ port: parseInt(portMatch[2]),
108
+ protocol: "tcp",
109
+ });
110
+ }
111
+ }
112
+ }
113
+ }
114
+ function parseDockerfile(content, source, info) {
115
+ const exposeMatch = content.matchAll(/EXPOSE\s+(\d+)/g);
116
+ for (const m of exposeMatch) {
117
+ info.ports.push({
118
+ service: source,
119
+ port: parseInt(m[1]),
120
+ protocol: "tcp",
121
+ });
122
+ }
123
+ }
124
+ function parseTerraform(content, source, info) {
125
+ // Detect providers
126
+ const providerMatch = content.matchAll(/provider\s+"(\w+)"/g);
127
+ for (const m of providerMatch) {
128
+ if (!info.providers.includes(m[1]))
129
+ info.providers.push(m[1]);
130
+ }
131
+ // Detect resources
132
+ const resourceMatch = content.matchAll(/resource\s+"(\w+)"\s+"(\w+)"/g);
133
+ for (const m of resourceMatch) {
134
+ const resourceType = m[1];
135
+ const resourceName = m[2];
136
+ if (resourceType.includes("instance") || resourceType.includes("service") ||
137
+ resourceType.includes("function") || resourceType.includes("container")) {
138
+ info.services.push({
139
+ name: resourceName,
140
+ image: null,
141
+ type: classifyTerraformResource(resourceType),
142
+ source,
143
+ });
144
+ }
145
+ }
146
+ }
147
+ function parseK8s(content, source, info) {
148
+ const nameMatch = content.match(/name:\s*['"]?(\w[\w-]*)/);
149
+ const kindMatch = content.match(/kind:\s*(\w+)/);
150
+ if (nameMatch && kindMatch) {
151
+ if (kindMatch[1] === "Deployment" || kindMatch[1] === "StatefulSet") {
152
+ info.services.push({
153
+ name: nameMatch[1],
154
+ image: null,
155
+ type: "app",
156
+ source,
157
+ });
158
+ }
159
+ }
160
+ const portMatches = content.matchAll(/port:\s*(\d+)/g);
161
+ for (const m of portMatches) {
162
+ info.ports.push({
163
+ service: nameMatch?.[1] || source,
164
+ port: parseInt(m[1]),
165
+ protocol: "tcp",
166
+ });
167
+ }
168
+ }
169
+ function classifyService(name) {
170
+ const n = name.toLowerCase();
171
+ if (n.includes("postgres") || n.includes("mysql") || n.includes("mongo") || n.includes("db") || n.includes("database"))
172
+ return "database";
173
+ if (n.includes("redis") || n.includes("memcache") || n.includes("cache"))
174
+ return "cache";
175
+ if (n.includes("rabbit") || n.includes("kafka") || n.includes("queue") || n.includes("nats"))
176
+ return "queue";
177
+ if (n.includes("nginx") || n.includes("traefik") || n.includes("proxy") || n.includes("caddy"))
178
+ return "proxy";
179
+ if (n.includes("minio") || n.includes("s3") || n.includes("storage"))
180
+ return "storage";
181
+ return "app";
182
+ }
183
+ function classifyTerraformResource(type) {
184
+ if (type.includes("rds") || type.includes("database"))
185
+ return "database";
186
+ if (type.includes("cache") || type.includes("redis"))
187
+ return "cache";
188
+ if (type.includes("sqs") || type.includes("queue"))
189
+ return "queue";
190
+ if (type.includes("s3") || type.includes("bucket"))
191
+ return "storage";
192
+ if (type.includes("lambda") || type.includes("function"))
193
+ return "function";
194
+ if (type.includes("lb") || type.includes("load_balancer"))
195
+ return "proxy";
196
+ return "app";
197
+ }
198
+ /**
199
+ * Format infra info for skeleton inclusion.
200
+ */
201
+ export function formatInfra(info) {
202
+ const lines = [];
203
+ if (info.deployment) {
204
+ lines.push(`Deployment: ${info.deployment}`);
205
+ }
206
+ if (info.services.length > 0) {
207
+ lines.push("Infrastructure:");
208
+ for (const s of info.services) {
209
+ let line = ` ${s.name} (${s.type})`;
210
+ if (s.image)
211
+ line += ` — ${s.image}`;
212
+ lines.push(line);
213
+ }
214
+ }
215
+ if (info.ports.length > 0) {
216
+ const portList = info.ports.map((p) => `${p.service}:${p.port}`).join(", ");
217
+ lines.push(`Ports: ${portList}`);
218
+ }
219
+ if (info.providers.length > 0 && !info.deployment) {
220
+ lines.push(`Providers: ${info.providers.join(", ")}`);
221
+ }
222
+ if (lines.length === 0)
223
+ return "";
224
+ return lines.join("\n");
225
+ }
226
+ //# sourceMappingURL=infra.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"infra.js","sourceRoot":"","sources":["../../src/extract/infra.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export interface WorkspaceInfo {
2
+ isMonorepo: boolean;
3
+ root: string;
4
+ packages: WorkspacePackage[];
5
+ currentPackage: WorkspacePackage | null;
6
+ }
7
+ export interface WorkspacePackage {
8
+ name: string;
9
+ path: string;
10
+ absolutePath: string;
11
+ }
12
+ /**
13
+ * Detect if we're in a monorepo and identify packages.
14
+ * Supports: npm workspaces, pnpm workspaces, yarn workspaces, turborepo, nx, lerna.
15
+ */
16
+ export declare function detectMonorepo(cwd: string): WorkspaceInfo;