clud-bug 0.6.34 → 0.7.0-rc.2

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 (110) hide show
  1. package/bin/clud-bug.js +10 -1353
  2. package/dist/cli/agents-md.d.ts +16 -0
  3. package/dist/cli/agents-md.d.ts.map +1 -0
  4. package/dist/cli/agents-md.js +226 -0
  5. package/dist/cli/agents-md.js.map +1 -0
  6. package/dist/cli/audit.d.ts +13 -0
  7. package/dist/cli/audit.d.ts.map +1 -0
  8. package/dist/cli/audit.js +90 -0
  9. package/dist/cli/audit.js.map +1 -0
  10. package/dist/cli/branch-protection.d.ts +57 -0
  11. package/dist/cli/branch-protection.d.ts.map +1 -0
  12. package/dist/cli/branch-protection.js +118 -0
  13. package/dist/cli/branch-protection.js.map +1 -0
  14. package/dist/cli/edit-workflow.d.ts +18 -0
  15. package/dist/cli/edit-workflow.d.ts.map +1 -0
  16. package/dist/cli/edit-workflow.js +43 -0
  17. package/dist/cli/edit-workflow.js.map +1 -0
  18. package/dist/cli/index.d.ts +8 -0
  19. package/dist/cli/index.d.ts.map +1 -0
  20. package/dist/cli/index.js +18 -0
  21. package/dist/cli/index.js.map +1 -0
  22. package/dist/cli/main.d.ts +3 -0
  23. package/dist/cli/main.d.ts.map +1 -0
  24. package/dist/cli/main.js +1336 -0
  25. package/dist/cli/main.js.map +1 -0
  26. package/dist/cli/skill-usage.d.ts +109 -0
  27. package/dist/cli/skill-usage.d.ts.map +1 -0
  28. package/dist/cli/skill-usage.js +380 -0
  29. package/dist/cli/skill-usage.js.map +1 -0
  30. package/dist/cli/skills.d.ts +56 -0
  31. package/dist/cli/skills.d.ts.map +1 -0
  32. package/dist/cli/skills.js +292 -0
  33. package/dist/cli/skills.js.map +1 -0
  34. package/dist/cli/update.d.ts +29 -0
  35. package/dist/cli/update.d.ts.map +1 -0
  36. package/dist/cli/update.js +186 -0
  37. package/dist/cli/update.js.map +1 -0
  38. package/dist/cli/usage.d.ts +142 -0
  39. package/dist/cli/usage.d.ts.map +1 -0
  40. package/dist/cli/usage.js +348 -0
  41. package/dist/cli/usage.js.map +1 -0
  42. package/dist/core/audit.d.ts +8 -0
  43. package/dist/core/audit.d.ts.map +1 -0
  44. package/dist/core/audit.js +47 -0
  45. package/dist/core/audit.js.map +1 -0
  46. package/dist/core/detect.d.ts +77 -0
  47. package/dist/core/detect.d.ts.map +1 -0
  48. package/dist/core/detect.js +262 -0
  49. package/dist/core/detect.js.map +1 -0
  50. package/dist/core/index.d.ts +11 -0
  51. package/dist/core/index.d.ts.map +1 -0
  52. package/dist/core/index.js +31 -0
  53. package/dist/core/index.js.map +1 -0
  54. package/dist/core/prompt-builder.d.ts +164 -0
  55. package/dist/core/prompt-builder.d.ts.map +1 -0
  56. package/dist/core/prompt-builder.js +419 -0
  57. package/dist/core/prompt-builder.js.map +1 -0
  58. package/dist/core/prompts.d.ts +9 -0
  59. package/dist/core/prompts.d.ts.map +1 -0
  60. package/dist/core/prompts.js +401 -0
  61. package/dist/core/prompts.js.map +1 -0
  62. package/dist/core/render-review.d.ts +6 -0
  63. package/dist/core/render-review.d.ts.map +1 -0
  64. package/dist/core/render-review.js +219 -0
  65. package/dist/core/render-review.js.map +1 -0
  66. package/dist/core/render.d.ts +13 -0
  67. package/dist/core/render.d.ts.map +1 -0
  68. package/dist/core/render.js +80 -0
  69. package/dist/core/render.js.map +1 -0
  70. package/dist/core/review-schema-zod.d.ts +240 -0
  71. package/dist/core/review-schema-zod.d.ts.map +1 -0
  72. package/dist/core/review-schema-zod.js +218 -0
  73. package/dist/core/review-schema-zod.js.map +1 -0
  74. package/dist/core/review-schema.d.ts +42 -0
  75. package/dist/core/review-schema.d.ts.map +1 -0
  76. package/dist/core/review-schema.js +156 -0
  77. package/dist/core/review-schema.js.map +1 -0
  78. package/dist/core/review-writeback.d.ts +139 -0
  79. package/dist/core/review-writeback.d.ts.map +1 -0
  80. package/dist/core/review-writeback.js +313 -0
  81. package/dist/core/review-writeback.js.map +1 -0
  82. package/dist/core/skills.d.ts +122 -0
  83. package/dist/core/skills.d.ts.map +1 -0
  84. package/dist/core/skills.js +636 -0
  85. package/dist/core/skills.js.map +1 -0
  86. package/package.json +30 -4
  87. package/{lib/agents-md.js → src/cli/agents-md.ts} +25 -14
  88. package/{lib/audit.js → src/cli/audit.ts} +37 -44
  89. package/{lib/branch-protection.js → src/cli/branch-protection.ts} +75 -11
  90. package/{lib/edit-workflow.js → src/cli/edit-workflow.ts} +32 -11
  91. package/src/cli/index.ts +101 -0
  92. package/src/cli/main.ts +1376 -0
  93. package/{lib/skill-usage.js → src/cli/skill-usage.ts} +168 -94
  94. package/src/cli/skills.ts +386 -0
  95. package/{lib/update.js → src/cli/update.ts} +68 -27
  96. package/{lib/usage.js → src/cli/usage.ts} +167 -76
  97. package/src/core/audit.ts +53 -0
  98. package/{lib/detect.js → src/core/detect.ts} +100 -47
  99. package/src/core/index.ts +155 -0
  100. package/src/core/prompt-builder.ts +561 -0
  101. package/{lib/prompts.js → src/core/prompts.ts} +16 -2
  102. package/{lib/render-review.js → src/core/render-review.ts} +57 -25
  103. package/{lib/render.js → src/core/render.ts} +36 -10
  104. package/src/core/review-schema-zod.ts +262 -0
  105. package/{lib/review-schema.js → src/core/review-schema.ts} +68 -5
  106. package/src/core/review-writeback.ts +446 -0
  107. package/{lib/skills.js → src/core/skills.ts} +339 -342
  108. package/templates/workflow-py.yml.tmpl +2 -2
  109. package/templates/workflow-ts.yml.tmpl +2 -2
  110. package/templates/workflow.yml.tmpl +17 -8
@@ -0,0 +1,262 @@
1
+ import { readFile, readdir, stat } from 'node:fs/promises';
2
+ import { join, extname } from 'node:path';
3
+ // Lookup tables for the project-shape detectors. Each map is `as const` so
4
+ // downstream consumers can rely on the value types narrowing to the literal
5
+ // strings rather than `string` — `_internal.EXT_TO_LANG['.ts']` resolves to
6
+ // `'typescript'` for IDE navigation, not just `string`.
7
+ export const EXT_TO_LANG = {
8
+ '.ts': 'typescript', '.tsx': 'typescript',
9
+ '.js': 'javascript', '.jsx': 'javascript', '.mjs': 'javascript', '.cjs': 'javascript',
10
+ '.py': 'python',
11
+ '.go': 'go',
12
+ '.rs': 'rust',
13
+ '.rb': 'ruby',
14
+ '.java': 'java', '.kt': 'kotlin',
15
+ '.swift': 'swift',
16
+ '.php': 'php',
17
+ '.cs': 'csharp',
18
+ '.c': 'c', '.h': 'c',
19
+ '.cpp': 'cpp', '.cc': 'cpp', '.hpp': 'cpp',
20
+ };
21
+ // Dependency name → search term hint passed to skills.sh.
22
+ // Only well-known frameworks; obscure packages get filtered out so the
23
+ // skills.sh query doesn't get drowned in noise.
24
+ export const DEP_TO_TERM = {
25
+ 'next': 'nextjs', 'react': 'react', 'vue': 'vue', 'svelte': 'svelte',
26
+ '@angular/core': 'angular', 'solid-js': 'solid',
27
+ 'express': 'express', 'fastify': 'fastify', 'koa': 'koa', 'hono': 'hono',
28
+ 'prisma': 'prisma', '@prisma/client': 'prisma', 'drizzle-orm': 'drizzle',
29
+ 'mongoose': 'mongodb', 'mongodb': 'mongodb',
30
+ 'tailwindcss': 'tailwind',
31
+ 'vitest': 'vitest', 'jest': 'jest', 'playwright': 'playwright',
32
+ '@playwright/test': 'playwright',
33
+ 'typescript': 'typescript',
34
+ };
35
+ export const PY_DEP_TO_TERM = {
36
+ 'django': 'django', 'flask': 'flask', 'fastapi': 'fastapi',
37
+ 'click': 'click', 'typer': 'typer',
38
+ 'pytest': 'pytest', 'sqlalchemy': 'sqlalchemy',
39
+ 'pydantic': 'pydantic', 'numpy': 'numpy', 'pandas': 'pandas',
40
+ };
41
+ async function fileExists(path) {
42
+ try {
43
+ await stat(path);
44
+ return true;
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ }
50
+ async function readJsonSafe(path) {
51
+ try {
52
+ return JSON.parse(await readFile(path, 'utf8'));
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ }
58
+ async function readTextSafe(path) {
59
+ try {
60
+ return await readFile(path, 'utf8');
61
+ }
62
+ catch {
63
+ return null;
64
+ }
65
+ }
66
+ async function detectFromPackageJson(root) {
67
+ const pkg = await readJsonSafe(join(root, 'package.json'));
68
+ if (!pkg)
69
+ return null;
70
+ const deps = { ...(pkg.dependencies || {}), ...(pkg.devDependencies || {}) };
71
+ const terms = new Set();
72
+ for (const dep of Object.keys(deps)) {
73
+ const term = DEP_TO_TERM[dep];
74
+ if (term)
75
+ terms.add(term);
76
+ }
77
+ return {
78
+ name: pkg.name ?? null,
79
+ description: pkg.description || null,
80
+ languages: ['javascript', ...(deps.typescript || pkg.devDependencies?.typescript ? ['typescript'] : [])],
81
+ terms: [...terms],
82
+ };
83
+ }
84
+ async function detectFromPyproject(root) {
85
+ const text = await readTextSafe(join(root, 'pyproject.toml'));
86
+ if (!text)
87
+ return null;
88
+ const terms = new Set();
89
+ for (const [dep, term] of Object.entries(PY_DEP_TO_TERM)) {
90
+ // crude but adequate match — full TOML parse would be overkill for the
91
+ // dependency-name lookup we actually need
92
+ if (new RegExp(`["']${dep}[><=~ "']`, 'i').test(text))
93
+ terms.add(term);
94
+ }
95
+ const nameMatch = text.match(/^\s*name\s*=\s*["']([^"']+)["']/m);
96
+ const descMatch = text.match(/^\s*description\s*=\s*["']([^"']+)["']/m);
97
+ return {
98
+ name: nameMatch?.[1] ?? null,
99
+ description: descMatch?.[1] ?? null,
100
+ languages: ['python'],
101
+ terms: [...terms],
102
+ };
103
+ }
104
+ async function detectFromRequirements(root) {
105
+ const text = await readTextSafe(join(root, 'requirements.txt'));
106
+ if (!text)
107
+ return null;
108
+ const terms = new Set();
109
+ for (const line of text.split('\n')) {
110
+ const dep = (line.split(/[<>=~ #]/)[0] ?? '').trim().toLowerCase();
111
+ const term = PY_DEP_TO_TERM[dep];
112
+ if (term)
113
+ terms.add(term);
114
+ }
115
+ return { name: null, description: null, languages: ['python'], terms: [...terms] };
116
+ }
117
+ async function detectFromGoMod(root) {
118
+ const text = await readTextSafe(join(root, 'go.mod'));
119
+ if (!text)
120
+ return null;
121
+ const moduleMatch = text.match(/^module\s+(\S+)/m);
122
+ return {
123
+ name: moduleMatch?.[1]?.split('/').pop() ?? null,
124
+ description: null,
125
+ languages: ['go'],
126
+ terms: [],
127
+ };
128
+ }
129
+ async function detectFromCargo(root) {
130
+ const text = await readTextSafe(join(root, 'Cargo.toml'));
131
+ if (!text)
132
+ return null;
133
+ const nameMatch = text.match(/^\s*name\s*=\s*["']([^"']+)["']/m);
134
+ const descMatch = text.match(/^\s*description\s*=\s*["']([^"']+)["']/m);
135
+ return {
136
+ name: nameMatch?.[1] ?? null,
137
+ description: descMatch?.[1] ?? null,
138
+ languages: ['rust'],
139
+ terms: [],
140
+ };
141
+ }
142
+ async function detectFromGemfile(root) {
143
+ const text = await readTextSafe(join(root, 'Gemfile'));
144
+ if (!text)
145
+ return null;
146
+ return { name: null, description: null, languages: ['ruby'], terms: [] };
147
+ }
148
+ async function fileHistogram(root) {
149
+ const counts = {};
150
+ async function walk(dir, depth) {
151
+ if (depth > 3)
152
+ return;
153
+ let entries;
154
+ try {
155
+ entries = await readdir(dir, { withFileTypes: true });
156
+ }
157
+ catch {
158
+ return;
159
+ }
160
+ for (const entry of entries) {
161
+ if (entry.name.startsWith('.') || entry.name === 'node_modules' ||
162
+ entry.name === 'dist' || entry.name === 'build' ||
163
+ entry.name === '__pycache__' || entry.name === 'target')
164
+ continue;
165
+ const full = join(dir, entry.name);
166
+ if (entry.isDirectory()) {
167
+ await walk(full, depth + 1);
168
+ }
169
+ else {
170
+ const lang = EXT_TO_LANG[extname(entry.name)];
171
+ if (lang)
172
+ counts[lang] = (counts[lang] || 0) + 1;
173
+ }
174
+ }
175
+ }
176
+ await walk(root, 0);
177
+ return counts;
178
+ }
179
+ function firstParagraph(readme) {
180
+ if (!readme)
181
+ return null;
182
+ const lines = readme.split('\n').slice(0, 200);
183
+ const paragraphs = lines.join('\n').split(/\n\s*\n/);
184
+ for (const p of paragraphs) {
185
+ const cleaned = p.replace(/^#+\s*/, '').replace(/[*_`]/g, '').trim();
186
+ if (cleaned.length > 40)
187
+ return cleaned.slice(0, 500);
188
+ }
189
+ return null;
190
+ }
191
+ export async function detect(root) {
192
+ const detectors = [
193
+ detectFromPackageJson, detectFromPyproject, detectFromRequirements,
194
+ detectFromGoMod, detectFromCargo, detectFromGemfile,
195
+ ];
196
+ const results = (await Promise.all(detectors.map(d => d(root)))).filter((r) => r !== null);
197
+ const histogram = await fileHistogram(root);
198
+ const readme = await readTextSafe(join(root, 'README.md'))
199
+ || await readTextSafe(join(root, 'README'));
200
+ const languages = new Set();
201
+ const terms = new Set();
202
+ let name = null;
203
+ let description = null;
204
+ for (const r of results) {
205
+ for (const lang of r.languages)
206
+ languages.add(lang);
207
+ for (const term of r.terms)
208
+ terms.add(term);
209
+ if (!name && r.name)
210
+ name = r.name;
211
+ if (!description && r.description)
212
+ description = r.description;
213
+ }
214
+ for (const lang of Object.keys(histogram))
215
+ languages.add(lang);
216
+ if (!description)
217
+ description = firstParagraph(readme);
218
+ // Prefer the language with the most files when picking a primary
219
+ const sortedLangs = [...languages].sort((a, b) => (histogram[b] || 0) - (histogram[a] || 0));
220
+ return {
221
+ name,
222
+ description,
223
+ languages: sortedLangs,
224
+ histogram,
225
+ searchTerms: [...new Set([...terms, ...sortedLangs.slice(0, 2)])],
226
+ primaryLanguage: sortedLangs[0] ?? null,
227
+ };
228
+ }
229
+ export function buildDescriptionLine(signals) {
230
+ const parts = [];
231
+ if (signals.name)
232
+ parts.push(`This project is "${signals.name}".`);
233
+ if (signals.description) {
234
+ // v0.6.25 / issue #89: when signals.description comes from a
235
+ // README first paragraph or similar multi-paragraph source, the
236
+ // raw `\n` characters survive into the rendered YAML's
237
+ // APPEND_SYSTEM_PROMPT value. The renderer's indent-aware
238
+ // substitution preserves layout but a literal `\n` inside a YAML
239
+ // double-quoted string is interpreted as a newline, breaking
240
+ // the YAML. Collapse any whitespace run (including newlines + tabs)
241
+ // to a single space before further processing.
242
+ const desc = signals.description.replace(/\s+/g, ' ').trim();
243
+ parts.push(/[.!?]$/.test(desc) ? desc : `${desc}.`);
244
+ }
245
+ if (signals.primaryLanguage) {
246
+ const frameworks = [...new Set(signals.searchTerms || [])].filter((t) => !['typescript', 'javascript', 'python', 'go', 'rust', 'ruby'].includes(t));
247
+ const frameworkPart = frameworks.length ? ` using ${frameworks.join(', ')}` : '';
248
+ parts.push(`It's primarily ${signals.primaryLanguage}${frameworkPart}.`);
249
+ }
250
+ if (parts.length === 0)
251
+ return 'Project context unavailable — review on the merits of the diff alone.';
252
+ return parts.join(' ');
253
+ }
254
+ // Architect's anti-pattern fix (Phase 2): the JS source used a single
255
+ // `export const _internal = { … }` namespace as a test seam. The TS port
256
+ // promotes the table exports (EXT_TO_LANG, DEP_TO_TERM, PY_DEP_TO_TERM)
257
+ // to direct top-level exports, and exposes the two helper functions
258
+ // fileHistogram + firstParagraph as direct named exports too. Tests now
259
+ // import each symbol by name. No `_internal` re-export — that pattern is
260
+ // gone.
261
+ export { fileHistogram, firstParagraph };
262
+ //# sourceMappingURL=detect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect.js","sourceRoot":"","sources":["../../src/core/detect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ export { reviewPrompt, type ReviewPromptOptions, type ReviewPromptLanguage } from './prompts.js';
2
+ export { REVIEW_SCHEMA, serializedReviewSchema, type ReviewData, type ReviewFinding, type ReviewSummaryCounts, type ReviewStatusHeader, type FindingSeverity, type PerSkillScanItem, type DedicatedSection, } from './review-schema.js';
3
+ export { renderReview, SEVERITY_LABEL } from './render-review.js';
4
+ export { detect, buildDescriptionLine, EXT_TO_LANG, DEP_TO_TERM, PY_DEP_TO_TERM, fileHistogram, firstParagraph, type DetectedSignals, type DescriptionLineSignals, } from './detect.js';
5
+ export { render, renderFile, pickTemplate, templateLanguage, DEFAULTS, type RenderDefaults, type RenderVars, type TemplateLanguage, } from './render.js';
6
+ export { durationToGitSince, renderAuditHeader, type AuditHeaderInput, } from './audit.js';
7
+ export { reviewSchema, crossCheckSchema, findingItemSchema, findingSchema, perSkillScanItemSchema, dedicatedSectionSchema, summaryCountsSchema, severitySchema, statusHeaderSchema, crossCheckVerdictSchema, severityValues, statusHeaderValues, flattenFindings, unflattenFindings, deriveSummaryCounts, deriveSkillsReferenced, buildReviewFromFindings, type Review, type CrossCheck, type CrossCheckVerdictSchema, type Severity, type StatusHeader, type SummaryCounts, type FindingItem, type PerSkillScanItem as ZodPerSkillScanItem, type DedicatedSection as ZodDedicatedSection, type Finding as ZodFinding, } from './review-schema-zod.js';
8
+ export { buildReviewPrompt, buildCrossCheckPrompt, buildConsensusPrompt, skillMatchesDiff, globMatch, truncatePatch, sliceUtf8Bytes, MAX_PATCH_BYTES_PER_FILE, DEFAULT_MAX_SKILL_BYTES, type BuildReviewPromptInput, type BuildCrossCheckPromptInput, type BuiltPrompt, type ChangedFile, type ChangedFileStatus, type PullRequestDiff, type PromptAppliesToRule, type PromptSkillFrontmatter, type PromptLoadedSkill, } from './prompt-builder.js';
9
+ export { renderReviewFile, renderMultiPassMarkdown, reviewFilePath, reviewCommitMessage, PROTOCOL_VERSION, WRITTEN_BY, SEVERITY_EMOJI as REVIEW_FILE_SEVERITY_EMOJI, type RenderReviewFileInput, type RenderMultiPassMarkdownInput, type MultiPassReview, type UnifiedFinding, type PassAttribution, type PassSource, type ReviewPassMode, type MultiPassVerdict, } from './review-writeback.js';
10
+ export { API_BASE, MAX_SKILLS, SkillsClient, normalizeList, rankAndCap, readReviewMode, readAppliesTo, appliesToPr, partitionByReviewMode, extractPerSkillLine, selectReviewHeader, extractFirstReviewHeaderLine, selectReviewBody, extractStatsHeader, isCriticalReviewHeader, classifyPerSkillOutcome, parseFrontmatter, stripFrontmatter, type SkillDescriptor, type RankableSkill, type AppliesToRule, type SkillWithOptionalContent, type PrComment, type ReviewStatsHeader, type SkillFrontmatter, type SkillSource, type SkillReviewMode, } from './skills.js';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ // Public API surface for `clud-bug/core` (consumed via the package's
2
+ // `./core` exports map → `dist/core/index.js`).
3
+ //
4
+ // Each line re-exports one core module's public symbols. Modules are
5
+ // added incrementally as the v0.7.0 TypeScript migration converts each
6
+ // lib/* JS file.
7
+ export { reviewPrompt } from './prompts.js';
8
+ export { REVIEW_SCHEMA, serializedReviewSchema, } from './review-schema.js';
9
+ export { renderReview, SEVERITY_LABEL } from './render-review.js';
10
+ export { detect, buildDescriptionLine, EXT_TO_LANG, DEP_TO_TERM, PY_DEP_TO_TERM, fileHistogram, firstParagraph, } from './detect.js';
11
+ export { render, renderFile, pickTemplate, templateLanguage, DEFAULTS, } from './render.js';
12
+ export { durationToGitSince, renderAuditHeader, } from './audit.js';
13
+ // Zod-typed wire-shape review + internal-shape helpers for the
14
+ // AI-Gateway consumer (clud-bug-app). The CLI-shape JSON Schema +
15
+ // CLI summary-comment renderer above stay first-class; the Zod port
16
+ // below is additive.
17
+ //
18
+ // Naming: the wire-shape `FindingItem` collides with neither CLI nor
19
+ // App existing exports. The internal-shape `Finding` (FindingItem +
20
+ // severity) is re-exported as `ZodFinding` to disambiguate from the
21
+ // CLI's `ReviewFinding`.
22
+ export { reviewSchema, crossCheckSchema, findingItemSchema, findingSchema, perSkillScanItemSchema, dedicatedSectionSchema, summaryCountsSchema, severitySchema, statusHeaderSchema, crossCheckVerdictSchema, severityValues, statusHeaderValues, flattenFindings, unflattenFindings, deriveSummaryCounts, deriveSkillsReferenced, buildReviewFromFindings, } from './review-schema-zod.js';
23
+ // AI-Gateway prompt builder (App's review pass). The CLI-shape
24
+ // `reviewPrompt` workflow-string above stays; this is additive.
25
+ export { buildReviewPrompt, buildCrossCheckPrompt, buildConsensusPrompt, skillMatchesDiff, globMatch, truncatePatch, sliceUtf8Bytes, MAX_PATCH_BYTES_PER_FILE, DEFAULT_MAX_SKILL_BYTES, } from './prompt-builder.js';
26
+ // SPEC §1.8.1 doc-file renderer (`docs/reviews/PR-<n>.md`). Renamed
27
+ // from the App's `renderReview` to `renderReviewFile` to disambiguate
28
+ // from the CLI's `renderReview` (summary PR-comment shape) above.
29
+ export { renderReviewFile, renderMultiPassMarkdown, reviewFilePath, reviewCommitMessage, PROTOCOL_VERSION, WRITTEN_BY, SEVERITY_EMOJI as REVIEW_FILE_SEVERITY_EMOJI, } from './review-writeback.js';
30
+ export { API_BASE, MAX_SKILLS, SkillsClient, normalizeList, rankAndCap, readReviewMode, readAppliesTo, appliesToPr, partitionByReviewMode, extractPerSkillLine, selectReviewHeader, extractFirstReviewHeaderLine, selectReviewBody, extractStatsHeader, isCriticalReviewHeader, classifyPerSkillOutcome, parseFrontmatter, stripFrontmatter, } from './skills.js';
31
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,gDAAgD;AAChD,EAAE;AACF,qEAAqE;AACrE,uEAAuE;AACvE,iBAAiB;AAEjB,OAAO,EAAE,YAAY,EAAuD,MAAM,cAAc,CAAC;AACjG,OAAO,EACL,aAAa,EACb,sBAAsB,GAQvB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EACL,MAAM,EACN,oBAAoB,EACpB,WAAW,EACX,WAAW,EACX,cAAc,EACd,aAAa,EACb,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,MAAM,EACN,UAAU,EACV,YAAY,EACZ,gBAAgB,EAChB,QAAQ,GAIT,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,kBAAkB,EAClB,iBAAiB,GAElB,MAAM,YAAY,CAAC;AACpB,+DAA+D;AAC/D,kEAAkE;AAClE,oEAAoE;AACpE,qBAAqB;AACrB,EAAE;AACF,qEAAqE;AACrE,oEAAoE;AACpE,oEAAoE;AACpE,yBAAyB;AACzB,OAAO,EACL,YAAY,EACZ,gBAAgB,EAChB,iBAAiB,EACjB,aAAa,EACb,sBAAsB,EACtB,sBAAsB,EACtB,mBAAmB,EACnB,cAAc,EACd,kBAAkB,EAClB,uBAAuB,EACvB,cAAc,EACd,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,mBAAmB,EACnB,sBAAsB,EACtB,uBAAuB,GAWxB,MAAM,wBAAwB,CAAC;AAChC,+DAA+D;AAC/D,gEAAgE;AAChE,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,EACpB,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,cAAc,EACd,wBAAwB,EACxB,uBAAuB,GAUxB,MAAM,qBAAqB,CAAC;AAC7B,oEAAoE;AACpE,sEAAsE;AACtE,kEAAkE;AAClE,OAAO,EACL,gBAAgB,EAChB,uBAAuB,EACvB,cAAc,EACd,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,cAAc,IAAI,0BAA0B,GAS7C,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,aAAa,EACb,UAAU,EACV,cAAc,EACd,aAAa,EACb,WAAW,EACX,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,4BAA4B,EAC5B,gBAAgB,EAChB,kBAAkB,EAClB,sBAAsB,EACtB,uBAAuB,EACvB,gBAAgB,EAChB,gBAAgB,GAUjB,MAAM,aAAa,CAAC"}
@@ -0,0 +1,164 @@
1
+ import type { Finding } from './review-schema-zod.js';
2
+ /** Max bytes of patch per file to include in the prompt. Beyond this we
3
+ * truncate with a `... (N bytes omitted)` marker so the model knows the
4
+ * file kept going.
5
+ */
6
+ export declare const MAX_PATCH_BYTES_PER_FILE: number;
7
+ /** Default skill-body byte cap when the caller doesn't supply one.
8
+ * Matches SPEC §1.10 ceiling + the App's `MAX_SKILL_BYTES` env default
9
+ * (see clud-bug-app/lib/env.ts).
10
+ */
11
+ export declare const DEFAULT_MAX_SKILL_BYTES = 8192;
12
+ /**
13
+ * Status taxonomy mirrors `PullRequestFile["status"]` from `@octokit/rest`.
14
+ * We accept the wider GitHub union so callers can pass octokit's raw status
15
+ * verbatim.
16
+ */
17
+ export type ChangedFileStatus = 'added' | 'modified' | 'removed' | 'renamed' | 'copied' | 'changed' | 'unchanged';
18
+ export interface ChangedFile {
19
+ /** Repo-relative POSIX path. */
20
+ path: string;
21
+ /** GitHub's per-file status. */
22
+ status: ChangedFileStatus;
23
+ /** Lines added. */
24
+ additions: number;
25
+ /** Lines deleted. */
26
+ deletions: number;
27
+ /**
28
+ * Unified-diff patch for this file. May be empty for binary files or
29
+ * very large diffs (GitHub omits the patch above ~3000 lines). The
30
+ * App orchestrator treats absent patch as "skip this file from review".
31
+ */
32
+ patch: string | undefined;
33
+ }
34
+ export interface PullRequestDiff {
35
+ files: ChangedFile[];
36
+ /** PR HEAD SHA (40-char). Pinned to `<!-- review-sha: ... -->`. */
37
+ headSha: string;
38
+ /** PR BASE SHA (40-char). Used as the ref for skills-loader. */
39
+ baseSha: string;
40
+ /** PR base branch name (e.g. `main`). Used for human-readable logs. */
41
+ baseRef: string;
42
+ /** PR head branch name. Used for the writeback commit. */
43
+ headRef: string;
44
+ /** Sum of `additions + deletions` across `files`. */
45
+ totalChanges: number;
46
+ /** Total bytes of `patch` content combined. Drives the 100KB skip rule. */
47
+ totalPatchBytes: number;
48
+ }
49
+ /** Minimal applies_to rule type — matches `SkillFrontmatter.applies_to`. */
50
+ export interface PromptAppliesToRule {
51
+ paths?: string[];
52
+ extensions?: string[];
53
+ }
54
+ /** Minimal frontmatter shape the prompt builder needs from each skill. */
55
+ export interface PromptSkillFrontmatter {
56
+ name: string;
57
+ description: string;
58
+ applies_to?: PromptAppliesToRule;
59
+ }
60
+ /** Minimal LoadedSkill shape — slug + parsed frontmatter + body. */
61
+ export interface PromptLoadedSkill {
62
+ slug: string;
63
+ frontmatter: PromptSkillFrontmatter;
64
+ body: string;
65
+ }
66
+ export interface BuildReviewPromptInput {
67
+ repo: {
68
+ owner: string;
69
+ name: string;
70
+ };
71
+ pr: {
72
+ number: number;
73
+ title?: string;
74
+ baseRef: string;
75
+ headRef: string;
76
+ };
77
+ diff: PullRequestDiff;
78
+ skills: PromptLoadedSkill[];
79
+ /**
80
+ * Per-skill body byte cap. Defaults to `DEFAULT_MAX_SKILL_BYTES` (8192)
81
+ * matching SPEC §1.10 + the App's `MAX_SKILL_BYTES` env. Callers running
82
+ * the App provide it from `getEnv().MAX_SKILL_BYTES`; callers outside
83
+ * the App may omit it.
84
+ */
85
+ maxSkillBytes?: number;
86
+ }
87
+ export interface BuiltPrompt {
88
+ system: string;
89
+ prompt: string;
90
+ /** Slugs actually included (used for skills_referenced fallback). */
91
+ includedSkillSlugs: string[];
92
+ /** Files skipped because their patch was empty (binary, too large). */
93
+ skippedFiles: string[];
94
+ }
95
+ /**
96
+ * Builds the system + user prompt pair for the review call.
97
+ */
98
+ export declare function buildReviewPrompt(input: BuildReviewPromptInput): BuiltPrompt;
99
+ /**
100
+ * Returns true when the diff includes at least one file matching the
101
+ * applies_to clause. Absent applies_to → matches everything.
102
+ */
103
+ export declare function skillMatchesDiff(appliesTo: PromptAppliesToRule | undefined, changedPaths: string[]): boolean;
104
+ /**
105
+ * Very small glob matcher supporting `**` (any path segment) and `*`
106
+ * (any chars within a segment). Sufficient for the SPEC §1.10 examples
107
+ * (`src/**`, `*.ts`). Not a drop-in replacement for `minimatch`; if we
108
+ * need negation / brace expansion later, swap to minimatch — but adding
109
+ * a dependency for two characters of syntax isn't worth it yet.
110
+ *
111
+ * Exported because the App's skill-routing code reuses it for an
112
+ * orchestrator-side pre-filter that runs before prompt construction.
113
+ */
114
+ export declare function globMatch(pattern: string, path: string): boolean;
115
+ /**
116
+ * Truncates a patch to `MAX_PATCH_BYTES_PER_FILE`, appending a marker so
117
+ * the model knows it didn't see the whole file.
118
+ *
119
+ * Cut via UTF-8 byte buffer (see sliceUtf8Bytes) so multi-byte content
120
+ * — emoji in commit-author lines, CJK identifiers — doesn't blow past
121
+ * the byte cap. clud-bug-review #158 flagged the original code-unit
122
+ * slice as a contract violation when content went non-ASCII.
123
+ */
124
+ export declare function truncatePatch(patch: string): string;
125
+ /**
126
+ * Slice a string to at most `maxBytes` UTF-8 bytes, trimming any trailing
127
+ * partial codepoint (so the output is always a valid UTF-8 string).
128
+ *
129
+ * Why we need this: `String.prototype.slice(0, N)` keeps N UTF-16 code
130
+ * units, not N bytes. A skill body of CJK characters at maxSkillBytes=8192
131
+ * would actually carry 3*8192 ≈ 24KiB of UTF-8 bytes — silently busting
132
+ * the cap the call site exists to enforce. Buffer-based slicing is
133
+ * authoritative; we then decode back as UTF-8 with `fatal: false` so a
134
+ * trailing partial codepoint becomes a single replacement character that
135
+ * we strip below.
136
+ *
137
+ * For pure-ASCII content (the dominant case for skill files + diffs), this
138
+ * is bit-equivalent to String.slice. The fix only kicks in on multibyte.
139
+ */
140
+ export declare function sliceUtf8Bytes(input: string, maxBytes: number): string;
141
+ export interface BuildCrossCheckPromptInput extends BuildReviewPromptInput {
142
+ /** Pass 1's findings — the cross-check pass annotates these. */
143
+ pass1Findings: Finding[];
144
+ }
145
+ /**
146
+ * Builds a cross-check prompt: Pass 2 sees Pass 1's findings as a numbered
147
+ * list + the same skills + the same diff.
148
+ *
149
+ * The prompt asks Pass 2 to:
150
+ * - emit a verdict per Pass-1 finding (referenced by 0-indexed number)
151
+ * - emit an independent findings list (issues Pass 1 missed)
152
+ *
153
+ * The aggregator turns the verdicts into per-finding attribution lines.
154
+ */
155
+ export declare function buildCrossCheckPrompt(input: BuildCrossCheckPromptInput): BuiltPrompt;
156
+ /**
157
+ * Builds a consensus prompt: Pass N runs fully independent of Pass 1. The
158
+ * orchestrator diffs their outputs and keeps the intersection.
159
+ *
160
+ * This is essentially `buildReviewPrompt` with a tweaked system prompt
161
+ * — the user message is identical so the model can't tell which pass it is.
162
+ */
163
+ export declare function buildConsensusPrompt(input: BuildReviewPromptInput): BuiltPrompt;
164
+ //# sourceMappingURL=prompt-builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-builder.d.ts","sourceRoot":"","sources":["../../src/core/prompt-builder.ts"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAEtD;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAAY,CAAC;AAElD;;;GAGG;AACH,eAAO,MAAM,uBAAuB,OAAO,CAAC;AAE5C;;;;GAIG;AACH,MAAM,MAAM,iBAAiB,GACzB,OAAO,GACP,UAAU,GACV,SAAS,GACT,SAAS,GACT,QAAQ,GACR,SAAS,GACT,WAAW,CAAC;AAEhB,MAAM,WAAW,WAAW;IAC1B,gCAAgC;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,gCAAgC;IAChC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,mBAAmB;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,KAAK,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,WAAW,EAAE,CAAC;IACrB,mEAAmE;IACnE,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,OAAO,EAAE,MAAM,CAAC;IAChB,0DAA0D;IAC1D,OAAO,EAAE,MAAM,CAAC;IAChB,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAC;IACrB,2EAA2E;IAC3E,eAAe,EAAE,MAAM,CAAC;CACzB;AAED,4EAA4E;AAC5E,MAAM,WAAW,mBAAmB;IAClC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,0EAA0E;AAC1E,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC;AAED,oEAAoE;AACpE,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,sBAAsB,CAAC;IACpC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACtC,EAAE,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IACzE,IAAI,EAAE,eAAe,CAAC;IACtB,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,qEAAqE;IACrE,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,uEAAuE;IACvE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AA4BD;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,sBAAsB,GAAG,WAAW,CAgD5E;AA0DD;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,mBAAmB,GAAG,SAAS,EAC1C,YAAY,EAAE,MAAM,EAAE,GACrB,OAAO,CAWT;AAED;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAUhE;AA0BD;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAMnD;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAStE;AA8ED,MAAM,WAAW,0BAA2B,SAAQ,sBAAsB;IACxE,gEAAgE;IAChE,aAAa,EAAE,OAAO,EAAE,CAAC;CAC1B;AAED;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,0BAA0B,GAChC,WAAW,CA8Cb;AAED;;;;;;GAMG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,sBAAsB,GAAG,WAAW,CAM/E"}