comp-gate 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 (130) hide show
  1. package/README.md +353 -0
  2. package/dist/agents/agents-md.d.ts +2 -0
  3. package/dist/agents/agents-md.d.ts.map +1 -0
  4. package/dist/agents/agents-md.js +25 -0
  5. package/dist/agents/agents-md.js.map +1 -0
  6. package/dist/agents/claude.d.ts +2 -0
  7. package/dist/agents/claude.d.ts.map +1 -0
  8. package/dist/agents/claude.js +45 -0
  9. package/dist/agents/claude.js.map +1 -0
  10. package/dist/agents/cursor.d.ts +2 -0
  11. package/dist/agents/cursor.d.ts.map +1 -0
  12. package/dist/agents/cursor.js +28 -0
  13. package/dist/agents/cursor.js.map +1 -0
  14. package/dist/agents/detect.d.ts +4 -0
  15. package/dist/agents/detect.d.ts.map +1 -0
  16. package/dist/agents/detect.js +96 -0
  17. package/dist/agents/detect.js.map +1 -0
  18. package/dist/agents/shared.d.ts +9 -0
  19. package/dist/agents/shared.d.ts.map +1 -0
  20. package/dist/agents/shared.js +83 -0
  21. package/dist/agents/shared.js.map +1 -0
  22. package/dist/agents/types.d.ts +14 -0
  23. package/dist/agents/types.d.ts.map +1 -0
  24. package/dist/agents/types.js +8 -0
  25. package/dist/agents/types.js.map +1 -0
  26. package/dist/agents/windsurf.d.ts +2 -0
  27. package/dist/agents/windsurf.d.ts.map +1 -0
  28. package/dist/agents/windsurf.js +27 -0
  29. package/dist/agents/windsurf.js.map +1 -0
  30. package/dist/bootstrap-summary.d.ts +2 -0
  31. package/dist/bootstrap-summary.d.ts.map +1 -0
  32. package/dist/bootstrap-summary.js +262 -0
  33. package/dist/bootstrap-summary.js.map +1 -0
  34. package/dist/categories.d.ts +13 -0
  35. package/dist/categories.d.ts.map +1 -0
  36. package/dist/categories.js +382 -0
  37. package/dist/categories.js.map +1 -0
  38. package/dist/cli.d.ts +3 -0
  39. package/dist/cli.d.ts.map +1 -0
  40. package/dist/cli.js +361 -0
  41. package/dist/cli.js.map +1 -0
  42. package/dist/config-init.d.ts +16 -0
  43. package/dist/config-init.d.ts.map +1 -0
  44. package/dist/config-init.js +53 -0
  45. package/dist/config-init.js.map +1 -0
  46. package/dist/config.d.ts +11 -0
  47. package/dist/config.d.ts.map +1 -0
  48. package/dist/config.js +127 -0
  49. package/dist/config.js.map +1 -0
  50. package/dist/constants.d.ts +2 -0
  51. package/dist/constants.d.ts.map +1 -0
  52. package/dist/constants.js +2 -0
  53. package/dist/constants.js.map +1 -0
  54. package/dist/detect.d.ts +4 -0
  55. package/dist/detect.d.ts.map +1 -0
  56. package/dist/detect.js +244 -0
  57. package/dist/detect.js.map +1 -0
  58. package/dist/diff.d.ts +11 -0
  59. package/dist/diff.d.ts.map +1 -0
  60. package/dist/diff.js +198 -0
  61. package/dist/diff.js.map +1 -0
  62. package/dist/generate.d.ts +7 -0
  63. package/dist/generate.d.ts.map +1 -0
  64. package/dist/generate.js +71 -0
  65. package/dist/generate.js.map +1 -0
  66. package/dist/gitignore.d.ts +12 -0
  67. package/dist/gitignore.d.ts.map +1 -0
  68. package/dist/gitignore.js +106 -0
  69. package/dist/gitignore.js.map +1 -0
  70. package/dist/hooks.d.ts +22 -0
  71. package/dist/hooks.d.ts.map +1 -0
  72. package/dist/hooks.js +199 -0
  73. package/dist/hooks.js.map +1 -0
  74. package/dist/init.d.ts +24 -0
  75. package/dist/init.d.ts.map +1 -0
  76. package/dist/init.js +218 -0
  77. package/dist/init.js.map +1 -0
  78. package/dist/paths.d.ts +13 -0
  79. package/dist/paths.d.ts.map +1 -0
  80. package/dist/paths.js +18 -0
  81. package/dist/paths.js.map +1 -0
  82. package/dist/prompts.d.ts +9 -0
  83. package/dist/prompts.d.ts.map +1 -0
  84. package/dist/prompts.js +88 -0
  85. package/dist/prompts.js.map +1 -0
  86. package/dist/repo-stats.d.ts +10 -0
  87. package/dist/repo-stats.d.ts.map +1 -0
  88. package/dist/repo-stats.js +117 -0
  89. package/dist/repo-stats.js.map +1 -0
  90. package/dist/setup-wizard.d.ts +34 -0
  91. package/dist/setup-wizard.d.ts.map +1 -0
  92. package/dist/setup-wizard.js +251 -0
  93. package/dist/setup-wizard.js.map +1 -0
  94. package/dist/testing.d.ts +6 -0
  95. package/dist/testing.d.ts.map +1 -0
  96. package/dist/testing.js +24 -0
  97. package/dist/testing.js.map +1 -0
  98. package/dist/types.d.ts +156 -0
  99. package/dist/types.d.ts.map +1 -0
  100. package/dist/types.js +31 -0
  101. package/dist/types.js.map +1 -0
  102. package/dist/verify.d.ts +38 -0
  103. package/dist/verify.d.ts.map +1 -0
  104. package/dist/verify.js +254 -0
  105. package/dist/verify.js.map +1 -0
  106. package/package.json +52 -0
  107. package/src/templates/PROMPTS.md +6 -0
  108. package/src/templates/SKILL.md +253 -0
  109. package/src/templates/SUMMARY.md +29 -0
  110. package/src/templates/agents/agents-md/section.md +11 -0
  111. package/src/templates/agents/claude/SKILL.md +8 -0
  112. package/src/templates/agents/claude/settings.fragment.json +16 -0
  113. package/src/templates/agents/claude/testing-SKILL.md +9 -0
  114. package/src/templates/agents/cursor/SKILL.md +9 -0
  115. package/src/templates/agents/cursor/hooks.json +23 -0
  116. package/src/templates/agents/cursor/testing-SKILL.md +9 -0
  117. package/src/templates/agents/windsurf/SKILL.md +8 -0
  118. package/src/templates/agents/windsurf/hooks.json +10 -0
  119. package/src/templates/agents/windsurf/testing-SKILL.md +9 -0
  120. package/src/templates/hooks/after-push.sh +17 -0
  121. package/src/templates/hooks/block-commit.sh +29 -0
  122. package/src/templates/hooks/block-push.sh +29 -0
  123. package/src/templates/hooks/claude-pre-tool.sh +59 -0
  124. package/src/templates/hooks/git-pre-commit.sh +35 -0
  125. package/src/templates/hooks/git-pre-push.sh +53 -0
  126. package/src/templates/hooks/statusline.sh +3 -0
  127. package/src/templates/hooks/windsurf-pre-run.sh +39 -0
  128. package/src/templates/hooks.json +23 -0
  129. package/src/templates/testing-SKILL.md +33 -0
  130. package/src/templates/testme.config.json +32 -0
package/dist/detect.js ADDED
@@ -0,0 +1,244 @@
1
+ import { existsSync, readFileSync } from "node:fs";
2
+ import path from "node:path";
3
+ import { extractTerms } from "./diff.js";
4
+ import { loadSummary } from "./prompts.js";
5
+ import { DOMAIN_CATEGORY_KEYS } from "./types.js";
6
+ const DOMAIN_KEYWORDS = {
7
+ changeRationale: [],
8
+ symbols: [],
9
+ architecture: [],
10
+ runtime: [],
11
+ dataStructures: [],
12
+ dependencies: [],
13
+ testing: [],
14
+ errorHandling: [],
15
+ apiContracts: [],
16
+ security: [],
17
+ performance: [],
18
+ database: [],
19
+ machineLearning: [
20
+ "machine learning",
21
+ "pytorch",
22
+ "tensorflow",
23
+ "sklearn",
24
+ "scikit-learn",
25
+ "keras",
26
+ "huggingface",
27
+ "notebook",
28
+ "model training",
29
+ "inference",
30
+ ],
31
+ cybersecurity: [
32
+ "cybersecurity",
33
+ "security audit",
34
+ "owasp",
35
+ "pentest",
36
+ "vulnerability",
37
+ "threat model",
38
+ "encryption",
39
+ ],
40
+ frontend: ["react", "vue", "svelte", "angular", "frontend", "component", "jsx", "tsx"],
41
+ backend: ["express", "fastapi", "django", "flask", "nestjs", "backend", "middleware", "api route"],
42
+ devops: ["docker", "kubernetes", "terraform", "github actions", "ci/cd", "devops", "helm"],
43
+ mobile: ["react-native", "android", "ios", "swift", "kotlin", "mobile app", "flutter"],
44
+ dataEngineering: ["airflow", "spark", "dbt", "etl", "data pipeline", "data engineering", "warehouse"],
45
+ };
46
+ const MANIFEST_SIGNALS = [
47
+ { file: "package.json", category: "frontend", patterns: /\b(react|vue|svelte|@angular)\b/i },
48
+ { file: "package.json", category: "backend", patterns: /\b(express|fastify|nestjs|koa)\b/i },
49
+ { file: "package.json", category: "machineLearning", patterns: /\b(tensorflow|@tensorflow)\b/i },
50
+ { file: "pyproject.toml", category: "machineLearning", patterns: /\b(torch|tensorflow|scikit-learn|sklearn)\b/i },
51
+ { file: "requirements.txt", category: "machineLearning", patterns: /\b(torch|tensorflow|scikit-learn|sklearn)\b/i },
52
+ { file: "go.mod", category: "backend", patterns: /\b(gin|echo|fiber)\b/i },
53
+ ];
54
+ const PATH_SIGNALS = [
55
+ { pattern: /(^|\/)models\//i, category: "machineLearning", reason: "models/ directory in diff" },
56
+ { pattern: /\.ipynb$/i, category: "machineLearning", reason: "Jupyter notebook in diff" },
57
+ { pattern: /(^|\/)\.github\/workflows\//i, category: "devops", reason: "CI workflow in diff" },
58
+ { pattern: /Dockerfile/i, category: "devops", reason: "Dockerfile in diff" },
59
+ { pattern: /(^|\/)terraform\//i, category: "devops", reason: "terraform/ directory in diff" },
60
+ { pattern: /(^|\/)android\//i, category: "mobile", reason: "android/ directory in diff" },
61
+ { pattern: /(^|\/)ios\//i, category: "mobile", reason: "ios/ directory in diff" },
62
+ { pattern: /(^|\/)components\//i, category: "frontend", reason: "components/ directory in diff" },
63
+ { pattern: /(^|\/)routes\//i, category: "backend", reason: "routes/ directory in diff" },
64
+ { pattern: /(^|\/)migrations\//i, category: "database", reason: "migrations/ directory in diff" },
65
+ { pattern: /\.(sql)$/i, category: "database", reason: "SQL file in diff" },
66
+ { pattern: /(owasp|pentest|security)/i, category: "cybersecurity", reason: "security-related path in diff" },
67
+ { pattern: /(airflow|spark|dbt|etl)/i, category: "dataEngineering", reason: "data pipeline path in diff" },
68
+ ];
69
+ function readText(filePath) {
70
+ if (!existsSync(filePath)) {
71
+ return "";
72
+ }
73
+ return readFileSync(filePath, "utf8");
74
+ }
75
+ function parseDomainSection(summary) {
76
+ let inDomain = false;
77
+ const focusTerms = [];
78
+ let primary = null;
79
+ for (const line of summary.split("\n")) {
80
+ if (/^##\s+Domain\s*$/i.test(line)) {
81
+ inDomain = true;
82
+ continue;
83
+ }
84
+ if (inDomain && /^##\s+/.test(line)) {
85
+ break;
86
+ }
87
+ if (!inDomain) {
88
+ continue;
89
+ }
90
+ const primaryMatch = line.match(/^-\s*Primary:\s*(.+)$/i);
91
+ if (primaryMatch) {
92
+ primary = primaryMatch[1].trim();
93
+ focusTerms.push(...extractTerms(primary));
94
+ continue;
95
+ }
96
+ const focusMatch = line.match(/^-\s*Focus areas:\s*(.+)$/i);
97
+ if (focusMatch) {
98
+ focusTerms.push(...extractTerms(focusMatch[1]));
99
+ }
100
+ }
101
+ return { domain: primary, focusTerms };
102
+ }
103
+ function scoreCategoryFromText(text, category) {
104
+ const keywords = DOMAIN_KEYWORDS[category];
105
+ if (keywords.length === 0) {
106
+ return null;
107
+ }
108
+ const lower = text.toLowerCase();
109
+ for (const keyword of keywords) {
110
+ if (lower.includes(keyword.toLowerCase())) {
111
+ return { confidence: 0.85, reason: `Matched "${keyword}" in project metadata` };
112
+ }
113
+ }
114
+ return null;
115
+ }
116
+ function mapDomainToCategories(domain) {
117
+ const lower = domain.toLowerCase();
118
+ const mapped = [];
119
+ if (/machine learning|ml|model|pytorch|tensorflow/.test(lower)) {
120
+ mapped.push("machineLearning", "dataStructures");
121
+ }
122
+ if (/cyber|security|pentest|owasp/.test(lower)) {
123
+ mapped.push("cybersecurity", "security");
124
+ }
125
+ if (/frontend|react|vue|ui/.test(lower)) {
126
+ mapped.push("frontend");
127
+ }
128
+ if (/backend|api|server/.test(lower)) {
129
+ mapped.push("backend", "apiContracts");
130
+ }
131
+ if (/devops|infra|deploy|ci/.test(lower)) {
132
+ mapped.push("devops", "runtime");
133
+ }
134
+ if (/mobile|android|ios/.test(lower)) {
135
+ mapped.push("mobile");
136
+ }
137
+ if (/data engineering|etl|pipeline|warehouse/.test(lower)) {
138
+ mapped.push("dataEngineering", "database");
139
+ }
140
+ return mapped;
141
+ }
142
+ export function detectProject(cwd, analysis) {
143
+ const summary = loadSummary();
144
+ const suggested = {};
145
+ const { domain: summaryDomain, focusTerms } = parseDomainSection(summary);
146
+ const configDomain = summaryDomain;
147
+ const corpus = [summary, focusTerms.join(" ")].filter(Boolean).join("\n");
148
+ for (const category of DOMAIN_CATEGORY_KEYS) {
149
+ const hit = scoreCategoryFromText(corpus, category);
150
+ if (hit) {
151
+ suggested[category] = { enabled: true, ...hit };
152
+ }
153
+ }
154
+ if (configDomain) {
155
+ for (const category of mapDomainToCategories(configDomain)) {
156
+ suggested[category] = {
157
+ enabled: true,
158
+ confidence: 0.95,
159
+ reason: `SUMMARY.md Domain: ${configDomain}`,
160
+ };
161
+ }
162
+ }
163
+ for (const signal of MANIFEST_SIGNALS) {
164
+ const manifestPath = path.join(cwd, signal.file);
165
+ const content = readText(manifestPath);
166
+ if (!content || !signal.patterns.test(content)) {
167
+ continue;
168
+ }
169
+ suggested[signal.category] = {
170
+ enabled: true,
171
+ confidence: 0.9,
172
+ reason: `Matched pattern in ${signal.file}`,
173
+ };
174
+ }
175
+ if (analysis) {
176
+ for (const file of analysis.files) {
177
+ for (const signal of PATH_SIGNALS) {
178
+ if (!signal.pattern.test(file.path)) {
179
+ continue;
180
+ }
181
+ const existing = suggested[signal.category];
182
+ if (!existing || existing.confidence < 0.8) {
183
+ suggested[signal.category] = {
184
+ enabled: true,
185
+ confidence: 0.8,
186
+ reason: signal.reason,
187
+ };
188
+ }
189
+ }
190
+ }
191
+ }
192
+ const coreBoosts = {
193
+ testing: "test",
194
+ dependencies: "package",
195
+ database: "migration",
196
+ security: "auth",
197
+ runtime: "docker",
198
+ };
199
+ if (analysis) {
200
+ for (const [category, token] of Object.entries(coreBoosts)) {
201
+ const hit = analysis.files.some((file) => file.path.toLowerCase().includes(token));
202
+ if (hit) {
203
+ suggested[category] = {
204
+ enabled: true,
205
+ confidence: 0.7,
206
+ reason: `Diff touches ${token}-related files`,
207
+ };
208
+ }
209
+ }
210
+ }
211
+ return {
212
+ suggestedCategories: suggested,
213
+ domain: configDomain,
214
+ };
215
+ }
216
+ export function applyDetectionToConfig(config, detection) {
217
+ if (!config.autoDetect && !config.domain) {
218
+ return config;
219
+ }
220
+ const categories = { ...config.categories };
221
+ const detectedMeta = {};
222
+ for (const [key, suggestion] of Object.entries(detection.suggestedCategories)) {
223
+ const category = key;
224
+ detectedMeta[category] = {
225
+ confidence: suggestion.confidence,
226
+ reason: suggestion.reason,
227
+ };
228
+ if (config.autoDetect && suggestion.confidence >= 0.8) {
229
+ categories[category] = suggestion.enabled;
230
+ }
231
+ }
232
+ if (config.domain) {
233
+ for (const category of mapDomainToCategories(config.domain)) {
234
+ categories[category] = true;
235
+ }
236
+ }
237
+ return {
238
+ ...config,
239
+ categories,
240
+ domain: config.domain ?? detection.domain,
241
+ _detected: detectedMeta,
242
+ };
243
+ }
244
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../src/detect.ts"],"names":[],"mappings":"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"}
package/dist/diff.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ import type { DiffAnalysis } from "./types.js";
2
+ export declare function resolveBaseRef(cwd: string, branch?: string): string;
3
+ export declare function getHeadSha(cwd: string): string;
4
+ export declare function hasUncommittedChanges(cwd: string): boolean;
5
+ export declare function isGitAncestor(ancestor: string, descendant: string, cwd: string): boolean;
6
+ export declare function getDiffText(cwd: string, baseRef: string, branch?: string): string;
7
+ export declare function hashDiff(diffText: string): string;
8
+ export declare function parseDiff(diffText: string, baseRef: string): DiffAnalysis;
9
+ export declare function analyzeDiff(cwd: string, branch?: string): DiffAnalysis;
10
+ export declare function extractTerms(text: string): string[];
11
+ //# sourceMappingURL=diff.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAc,MAAM,YAAY,CAAC;AAyB3D,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,MAAM,CAsBnE;AAED,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE9C;AAED,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAUxF;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,MAAM,CA2CjF;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAEjD;AAYD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,CAmCzE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,SAAS,GAAG,YAAY,CAItE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBnD"}
package/dist/diff.js ADDED
@@ -0,0 +1,198 @@
1
+ import { createHash } from "node:crypto";
2
+ import { execFileSync } from "node:child_process";
3
+ const SYMBOL_PATTERNS = [
4
+ /^\+\s*(?:export\s+)?(?:async\s+)?function\s+(\w+)/,
5
+ /^\+\s*(?:export\s+)?class\s+(\w+)/,
6
+ /^\+\s*(?:export\s+)?(?:const|let|var)\s+(\w+)\s*=/,
7
+ /^\+\s*def\s+(\w+)\s*\(/,
8
+ /^\+\s*func\s+(\w+)\s*\(/,
9
+ /^\+\s*type\s+(\w+)\s+/,
10
+ /^\+\s*interface\s+(\w+)\s*/,
11
+ /^\+\s*enum\s+(\w+)\s*/,
12
+ ];
13
+ function runGit(args, cwd) {
14
+ try {
15
+ return execFileSync("git", args, {
16
+ cwd,
17
+ encoding: "utf8",
18
+ stdio: ["ignore", "pipe", "pipe"],
19
+ }).trim();
20
+ }
21
+ catch {
22
+ return "";
23
+ }
24
+ }
25
+ export function resolveBaseRef(cwd, branch = "main") {
26
+ const upstream = runGit(["rev-parse", "--abbrev-ref", `${branch}@{upstream}`], cwd);
27
+ if (upstream) {
28
+ const remoteBranch = upstream.replace(/^[^/]+\//, "");
29
+ if (remoteBranch) {
30
+ return `origin/${remoteBranch}`;
31
+ }
32
+ }
33
+ if (runGit(["rev-parse", "--verify", `origin/${branch}`], cwd)) {
34
+ return `origin/${branch}`;
35
+ }
36
+ if (runGit(["rev-parse", "--verify", branch], cwd)) {
37
+ return branch;
38
+ }
39
+ if (runGit(["rev-parse", "--verify", "master"], cwd)) {
40
+ return "master";
41
+ }
42
+ return branch;
43
+ }
44
+ export function getHeadSha(cwd) {
45
+ return runGit(["rev-parse", "HEAD"], cwd);
46
+ }
47
+ export function hasUncommittedChanges(cwd) {
48
+ return Boolean(runGit(["diff", "--cached"], cwd) || runGit(["diff"], cwd));
49
+ }
50
+ export function isGitAncestor(ancestor, descendant, cwd) {
51
+ try {
52
+ execFileSync("git", ["merge-base", "--is-ancestor", ancestor, descendant], {
53
+ cwd,
54
+ stdio: "ignore",
55
+ });
56
+ return true;
57
+ }
58
+ catch {
59
+ return false;
60
+ }
61
+ }
62
+ export function getDiffText(cwd, baseRef, branch = "main") {
63
+ const parts = [];
64
+ const rangeCandidates = new Set();
65
+ if (baseRef && baseRef !== "HEAD") {
66
+ rangeCandidates.add(`${baseRef}...HEAD`);
67
+ }
68
+ rangeCandidates.add(`origin/${branch}...HEAD`);
69
+ rangeCandidates.add(`${branch}...HEAD`);
70
+ rangeCandidates.add("main...HEAD");
71
+ rangeCandidates.add("master...HEAD");
72
+ for (const range of rangeCandidates) {
73
+ const rangeDiff = runGit(["diff", range], cwd);
74
+ if (rangeDiff) {
75
+ parts.push(rangeDiff);
76
+ break;
77
+ }
78
+ }
79
+ const staged = runGit(["diff", "--cached"], cwd);
80
+ const unstaged = runGit(["diff"], cwd);
81
+ if (staged) {
82
+ parts.push(staged);
83
+ }
84
+ if (unstaged) {
85
+ parts.push(unstaged);
86
+ }
87
+ if (parts.length > 0) {
88
+ return parts.join("\n");
89
+ }
90
+ const rootDiff = runGit(["diff", "--root", "HEAD"], cwd);
91
+ if (rootDiff) {
92
+ return rootDiff;
93
+ }
94
+ const showDiff = runGit(["show", "HEAD", "--format=", "-p"], cwd);
95
+ if (showDiff) {
96
+ return showDiff;
97
+ }
98
+ return "";
99
+ }
100
+ export function hashDiff(diffText) {
101
+ return createHash("sha256").update(diffText).digest("hex");
102
+ }
103
+ function extractSymbolsFromHunk(line) {
104
+ for (const pattern of SYMBOL_PATTERNS) {
105
+ const match = line.match(pattern);
106
+ if (match?.[1]) {
107
+ return match[1];
108
+ }
109
+ }
110
+ return null;
111
+ }
112
+ export function parseDiff(diffText, baseRef) {
113
+ const files = new Map();
114
+ let currentFile = null;
115
+ for (const line of diffText.split("\n")) {
116
+ const fileMatch = line.match(/^diff --git a\/(.+?) b\/(.+)$/);
117
+ if (fileMatch) {
118
+ currentFile = fileMatch[2];
119
+ if (!files.has(currentFile)) {
120
+ files.set(currentFile, new Set());
121
+ }
122
+ continue;
123
+ }
124
+ if (!currentFile || !line.startsWith("+")) {
125
+ continue;
126
+ }
127
+ const symbol = extractSymbolsFromHunk(line);
128
+ if (symbol) {
129
+ files.get(currentFile)?.add(symbol);
130
+ }
131
+ }
132
+ const fileChanges = [...files.entries()].map(([filePath, symbols]) => ({
133
+ path: filePath,
134
+ symbols: [...symbols],
135
+ }));
136
+ return {
137
+ diffHash: hashDiff(diffText),
138
+ baseRef,
139
+ rawDiff: diffText,
140
+ files: fileChanges,
141
+ };
142
+ }
143
+ export function analyzeDiff(cwd, branch = "main") {
144
+ const baseRef = resolveBaseRef(cwd, branch);
145
+ const rawDiff = getDiffText(cwd, baseRef, branch);
146
+ return parseDiff(rawDiff, baseRef);
147
+ }
148
+ export function extractTerms(text) {
149
+ const terms = new Set();
150
+ for (const match of text.matchAll(/`([^`]+)`|\b[A-Za-z][A-Za-z0-9_]{2,}\b/g)) {
151
+ const term = (match[1] ?? match[0]).trim();
152
+ if (term.length < 3) {
153
+ continue;
154
+ }
155
+ const lower = term.toLowerCase();
156
+ if (STOP_WORDS.has(lower)) {
157
+ continue;
158
+ }
159
+ terms.add(term);
160
+ }
161
+ return [...terms].slice(0, 8);
162
+ }
163
+ const STOP_WORDS = new Set([
164
+ "the",
165
+ "and",
166
+ "for",
167
+ "with",
168
+ "this",
169
+ "that",
170
+ "from",
171
+ "into",
172
+ "added",
173
+ "updated",
174
+ "changed",
175
+ "removed",
176
+ "file",
177
+ "files",
178
+ "function",
179
+ "class",
180
+ "const",
181
+ "let",
182
+ "var",
183
+ "import",
184
+ "export",
185
+ "return",
186
+ "session",
187
+ "changes",
188
+ "change",
189
+ "using",
190
+ "when",
191
+ "what",
192
+ "why",
193
+ "how",
194
+ "new",
195
+ "fix",
196
+ "bug",
197
+ ]);
198
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { CategoryKey, GenerateOptions, Session, TestmeConfig } from "./types.js";
2
+ export declare function resolveConfig(cwd: string, options?: GenerateOptions): TestmeConfig;
3
+ export declare function buildQuestions(cwd: string, branch?: string, options?: GenerateOptions): Session;
4
+ export declare function generateSession(cwd: string, branch?: string, options?: GenerateOptions): Session;
5
+ export declare function warnIfBelowMin(session: Session, config: TestmeConfig): string | null;
6
+ export declare function parseCategoryList(value: string): CategoryKey[];
7
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAY,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAEhG,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,YAAY,CAUtF;AAED,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,EACX,MAAM,SAAS,EACf,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAyCT;AAED,wBAAgB,eAAe,CAC7B,GAAG,EAAE,MAAM,EACX,MAAM,SAAS,EACf,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAYT;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,GAAG,IAAI,CAKpF;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,EAAE,CAK9D"}
@@ -0,0 +1,71 @@
1
+ import { mkdirSync, writeFileSync } from "node:fs";
2
+ import { allocateQuestions, buildCandidates, relevantFiles } from "./categories.js";
3
+ import { applyGenerateOptions, enabledCategories, loadConfig } from "./config.js";
4
+ import { analyzeDiff } from "./diff.js";
5
+ import { applyDetectionToConfig, detectProject } from "./detect.js";
6
+ import { loadPromptsSections, loadSummary } from "./prompts.js";
7
+ import { SESSION_PATH, TESTME_DIR } from "./paths.js";
8
+ export function resolveConfig(cwd, options = {}) {
9
+ let config = loadConfig(cwd);
10
+ const analysis = analyzeDiff(cwd);
11
+ if (config.autoDetect || config.domain) {
12
+ const detection = detectProject(cwd, analysis);
13
+ config = applyDetectionToConfig(config, detection);
14
+ }
15
+ return applyGenerateOptions(config, options);
16
+ }
17
+ export function buildQuestions(cwd, branch = "main", options = {}) {
18
+ const analysis = analyzeDiff(cwd, branch);
19
+ const config = resolveConfig(cwd, options);
20
+ const files = relevantFiles(analysis.files);
21
+ const ctx = {
22
+ analysis,
23
+ files,
24
+ summary: loadSummary(),
25
+ promptsSections: loadPromptsSections(),
26
+ rawDiff: analysis.rawDiff,
27
+ };
28
+ const activeCategories = enabledCategories(config);
29
+ const allCandidates = activeCategories.flatMap((category) => buildCandidates(category, ctx));
30
+ let selected = allocateQuestions(allCandidates, config.questions.max, config.questions.min);
31
+ if (selected.length === 0 && files.length > 0) {
32
+ const fallback = buildCandidates("changeRationale", ctx);
33
+ selected = allocateQuestions(fallback, config.questions.max, 1);
34
+ }
35
+ const questions = selected.map((candidate, index) => ({
36
+ id: `q${index + 1}`,
37
+ type: candidate.type,
38
+ category: candidate.category,
39
+ prompt: candidate.prompt,
40
+ files: candidate.files,
41
+ rubric: candidate.rubric,
42
+ }));
43
+ return {
44
+ diffHash: analysis.diffHash,
45
+ baseRef: analysis.baseRef,
46
+ generatedAt: new Date().toISOString(),
47
+ questions,
48
+ };
49
+ }
50
+ export function generateSession(cwd, branch = "main", options = {}) {
51
+ const session = buildQuestions(cwd, branch, options);
52
+ if (session.questions.length === 0) {
53
+ throw new Error("No changes detected to generate questions from. Make changes or update PROMPTS.md.");
54
+ }
55
+ mkdirSync(TESTME_DIR, { recursive: true });
56
+ writeFileSync(SESSION_PATH, `${JSON.stringify(session, null, 2)}\n`, "utf8");
57
+ return session;
58
+ }
59
+ export function warnIfBelowMin(session, config) {
60
+ if (session.questions.length < config.questions.min) {
61
+ return `Warning: only ${session.questions.length} question(s) generated (min ${config.questions.min}). Enrich PROMPTS.md or enable more categories.`;
62
+ }
63
+ return null;
64
+ }
65
+ export function parseCategoryList(value) {
66
+ return value
67
+ .split(",")
68
+ .map((item) => item.trim())
69
+ .filter(Boolean);
70
+ }
71
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACpE,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAGtD,MAAM,UAAU,aAAa,CAAC,GAAW,EAAE,UAA2B,EAAE;IACtE,IAAI,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;IAC7B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAElC,IAAI,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,aAAa,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,GAAG,sBAAsB,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAED,OAAO,oBAAoB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,cAAc,CAC5B,GAAW,EACX,MAAM,GAAG,MAAM,EACf,UAA2B,EAAE;IAE7B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC5C,MAAM,GAAG,GAAG;QACV,QAAQ;QACR,KAAK;QACL,OAAO,EAAE,WAAW,EAAE;QACtB,eAAe,EAAE,mBAAmB,EAAE;QACtC,OAAO,EAAE,QAAQ,CAAC,OAAO;KAC1B,CAAC;IAEF,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,aAAa,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;IAE7F,IAAI,QAAQ,GAAG,iBAAiB,CAC9B,aAAa,EACb,MAAM,CAAC,SAAS,CAAC,GAAG,EACpB,MAAM,CAAC,SAAS,CAAC,GAAG,CACrB,CAAC;IAEF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,eAAe,CAAC,iBAAiB,EAAE,GAAG,CAAC,CAAC;QACzD,QAAQ,GAAG,iBAAiB,CAAC,QAAQ,EAAE,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IAClE,CAAC;IAED,MAAM,SAAS,GAAe,QAAQ,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;QAChE,EAAE,EAAE,IAAI,KAAK,GAAG,CAAC,EAAE;QACnB,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,QAAQ,EAAE,SAAS,CAAC,QAAQ;QAC5B,MAAM,EAAE,SAAS,CAAC,MAAM;QACxB,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,MAAM,EAAE,SAAS,CAAC,MAAM;KACzB,CAAC,CAAC,CAAC;IAEJ,OAAO;QACL,QAAQ,EAAE,QAAQ,CAAC,QAAQ;QAC3B,OAAO,EAAE,QAAQ,CAAC,OAAO;QACzB,WAAW,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACrC,SAAS;KACV,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,GAAW,EACX,MAAM,GAAG,MAAM,EACf,UAA2B,EAAE;IAE7B,MAAM,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IAErD,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CACb,oFAAoF,CACrF,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3C,aAAa,CAAC,YAAY,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7E,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAgB,EAAE,MAAoB;IACnE,IAAI,OAAO,CAAC,SAAS,CAAC,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACpD,OAAO,iBAAiB,OAAO,CAAC,SAAS,CAAC,MAAM,+BAA+B,MAAM,CAAC,SAAS,CAAC,GAAG,iDAAiD,CAAC;IACvJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC7C,OAAO,KAAK;SACT,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,OAAO,CAAkB,CAAC;AACtC,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { AgentId } from "./agents/types.js";
2
+ export declare const GITIGNORE_MARKER = "# testme local setup";
3
+ export declare function isTestmeHookReference(value: string): boolean;
4
+ export declare function hookConfigHasNonTestmeContent(filePath: string): boolean;
5
+ export interface GitignorePlan {
6
+ lines: string[];
7
+ gitignoreHookConfigs: boolean;
8
+ warnings: string[];
9
+ }
10
+ export declare function buildGitignorePlan(cwd: string, agents: AgentId[], localOnly?: boolean): GitignorePlan;
11
+ export declare function ensureTestmeGitignore(cwd: string, agents: AgentId[], localOnly?: boolean): string[];
12
+ //# sourceMappingURL=gitignore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitignore.d.ts","sourceRoot":"","sources":["../src/gitignore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AAEjD,eAAO,MAAM,gBAAgB,yBAAyB,CAAC;AAevD,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE5D;AA8BD,wBAAgB,6BAA6B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAkBvE;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,OAAO,EAAE,EACjB,SAAS,UAAO,GACf,aAAa,CAkCf;AAED,wBAAgB,qBAAqB,CACnC,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,OAAO,EAAE,EACjB,SAAS,UAAO,GACf,MAAM,EAAE,CAqBV"}