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.
- package/bin/clud-bug.js +10 -1353
- package/dist/cli/agents-md.d.ts +16 -0
- package/dist/cli/agents-md.d.ts.map +1 -0
- package/dist/cli/agents-md.js +226 -0
- package/dist/cli/agents-md.js.map +1 -0
- package/dist/cli/audit.d.ts +13 -0
- package/dist/cli/audit.d.ts.map +1 -0
- package/dist/cli/audit.js +90 -0
- package/dist/cli/audit.js.map +1 -0
- package/dist/cli/branch-protection.d.ts +57 -0
- package/dist/cli/branch-protection.d.ts.map +1 -0
- package/dist/cli/branch-protection.js +118 -0
- package/dist/cli/branch-protection.js.map +1 -0
- package/dist/cli/edit-workflow.d.ts +18 -0
- package/dist/cli/edit-workflow.d.ts.map +1 -0
- package/dist/cli/edit-workflow.js +43 -0
- package/dist/cli/edit-workflow.js.map +1 -0
- package/dist/cli/index.d.ts +8 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +18 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/main.d.ts +3 -0
- package/dist/cli/main.d.ts.map +1 -0
- package/dist/cli/main.js +1336 -0
- package/dist/cli/main.js.map +1 -0
- package/dist/cli/skill-usage.d.ts +109 -0
- package/dist/cli/skill-usage.d.ts.map +1 -0
- package/dist/cli/skill-usage.js +380 -0
- package/dist/cli/skill-usage.js.map +1 -0
- package/dist/cli/skills.d.ts +56 -0
- package/dist/cli/skills.d.ts.map +1 -0
- package/dist/cli/skills.js +292 -0
- package/dist/cli/skills.js.map +1 -0
- package/dist/cli/update.d.ts +29 -0
- package/dist/cli/update.d.ts.map +1 -0
- package/dist/cli/update.js +186 -0
- package/dist/cli/update.js.map +1 -0
- package/dist/cli/usage.d.ts +142 -0
- package/dist/cli/usage.d.ts.map +1 -0
- package/dist/cli/usage.js +348 -0
- package/dist/cli/usage.js.map +1 -0
- package/dist/core/audit.d.ts +8 -0
- package/dist/core/audit.d.ts.map +1 -0
- package/dist/core/audit.js +47 -0
- package/dist/core/audit.js.map +1 -0
- package/dist/core/detect.d.ts +77 -0
- package/dist/core/detect.d.ts.map +1 -0
- package/dist/core/detect.js +262 -0
- package/dist/core/detect.js.map +1 -0
- package/dist/core/index.d.ts +11 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +31 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/prompt-builder.d.ts +164 -0
- package/dist/core/prompt-builder.d.ts.map +1 -0
- package/dist/core/prompt-builder.js +419 -0
- package/dist/core/prompt-builder.js.map +1 -0
- package/dist/core/prompts.d.ts +9 -0
- package/dist/core/prompts.d.ts.map +1 -0
- package/dist/core/prompts.js +401 -0
- package/dist/core/prompts.js.map +1 -0
- package/dist/core/render-review.d.ts +6 -0
- package/dist/core/render-review.d.ts.map +1 -0
- package/dist/core/render-review.js +219 -0
- package/dist/core/render-review.js.map +1 -0
- package/dist/core/render.d.ts +13 -0
- package/dist/core/render.d.ts.map +1 -0
- package/dist/core/render.js +80 -0
- package/dist/core/render.js.map +1 -0
- package/dist/core/review-schema-zod.d.ts +240 -0
- package/dist/core/review-schema-zod.d.ts.map +1 -0
- package/dist/core/review-schema-zod.js +218 -0
- package/dist/core/review-schema-zod.js.map +1 -0
- package/dist/core/review-schema.d.ts +42 -0
- package/dist/core/review-schema.d.ts.map +1 -0
- package/dist/core/review-schema.js +156 -0
- package/dist/core/review-schema.js.map +1 -0
- package/dist/core/review-writeback.d.ts +139 -0
- package/dist/core/review-writeback.d.ts.map +1 -0
- package/dist/core/review-writeback.js +313 -0
- package/dist/core/review-writeback.js.map +1 -0
- package/dist/core/skills.d.ts +122 -0
- package/dist/core/skills.d.ts.map +1 -0
- package/dist/core/skills.js +636 -0
- package/dist/core/skills.js.map +1 -0
- package/package.json +30 -4
- package/{lib/agents-md.js → src/cli/agents-md.ts} +25 -14
- package/{lib/audit.js → src/cli/audit.ts} +37 -44
- package/{lib/branch-protection.js → src/cli/branch-protection.ts} +75 -11
- package/{lib/edit-workflow.js → src/cli/edit-workflow.ts} +32 -11
- package/src/cli/index.ts +101 -0
- package/src/cli/main.ts +1376 -0
- package/{lib/skill-usage.js → src/cli/skill-usage.ts} +168 -94
- package/src/cli/skills.ts +386 -0
- package/{lib/update.js → src/cli/update.ts} +68 -27
- package/{lib/usage.js → src/cli/usage.ts} +167 -76
- package/src/core/audit.ts +53 -0
- package/{lib/detect.js → src/core/detect.ts} +100 -47
- package/src/core/index.ts +155 -0
- package/src/core/prompt-builder.ts +561 -0
- package/{lib/prompts.js → src/core/prompts.ts} +16 -2
- package/{lib/render-review.js → src/core/render-review.ts} +57 -25
- package/{lib/render.js → src/core/render.ts} +36 -10
- package/src/core/review-schema-zod.ts +262 -0
- package/{lib/review-schema.js → src/core/review-schema.ts} +68 -5
- package/src/core/review-writeback.ts +446 -0
- package/{lib/skills.js → src/core/skills.ts} +339 -342
- package/templates/workflow-py.yml.tmpl +2 -2
- package/templates/workflow-ts.yml.tmpl +2 -2
- 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"}
|