@convext/cli 1.0.15 → 1.0.17
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/README.md +2 -2
- package/dist/api.d.ts +62 -21
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +71 -10
- package/dist/api.js.map +1 -1
- package/dist/cli.js +23 -4
- package/dist/cli.js.map +1 -1
- package/dist/commands/check.d.ts +1 -1
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +37 -46
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/mcp.d.ts.map +1 -1
- package/dist/commands/mcp.js +34 -85
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/stats.d.ts +7 -0
- package/dist/commands/stats.d.ts.map +1 -0
- package/dist/commands/stats.js +159 -0
- package/dist/commands/stats.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -1
- package/dist/commands/sync.d.ts.map +1 -1
- package/dist/commands/sync.js +128 -22
- package/dist/commands/sync.js.map +1 -1
- package/dist/utils/hooks.d.ts +46 -0
- package/dist/utils/hooks.d.ts.map +1 -0
- package/dist/utils/hooks.js +270 -0
- package/dist/utils/hooks.js.map +1 -0
- package/dist/utils/telemetry.d.ts +58 -0
- package/dist/utils/telemetry.d.ts.map +1 -0
- package/dist/utils/telemetry.js +156 -0
- package/dist/utils/telemetry.js.map +1 -0
- package/package.json +1 -1
package/dist/commands/sync.js
CHANGED
|
@@ -2,11 +2,14 @@ import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import chalk from "chalk";
|
|
4
4
|
import ora from "ora";
|
|
5
|
-
import { getProjectContext, getProjectMarkdown, assignRuleSets, } from "../api.js";
|
|
5
|
+
import { getProjectContext, getProjectMarkdown, getProjectRulesWithEnforcement, assignRuleSets, uploadTelemetry, } from "../api.js";
|
|
6
6
|
import { backupFile, ensureParentDir } from "../utils/fileManager.js";
|
|
7
7
|
import { promptConfirm, promptCheckbox } from "../utils/prompts.js";
|
|
8
8
|
import { scanRepository } from "../utils/scanner.js";
|
|
9
|
+
import { generateHooks, writeHooks, mergeClaudeCodeSettings } from "../utils/hooks.js";
|
|
10
|
+
import { readEvents, rotateLog } from "../utils/telemetry.js";
|
|
9
11
|
import { initCommand } from "./init.js";
|
|
12
|
+
import { getApiUrl } from "../config.js";
|
|
10
13
|
function loadLocalProjectConfig() {
|
|
11
14
|
const configPath = join(process.cwd(), ".convext", "config.json");
|
|
12
15
|
if (!existsSync(configPath)) {
|
|
@@ -15,7 +18,7 @@ function loadLocalProjectConfig() {
|
|
|
15
18
|
try {
|
|
16
19
|
const content = readFileSync(configPath, "utf-8");
|
|
17
20
|
const config = JSON.parse(content);
|
|
18
|
-
if (config.
|
|
21
|
+
if (config.slug && typeof config.slug === "string") {
|
|
19
22
|
return config;
|
|
20
23
|
}
|
|
21
24
|
return null;
|
|
@@ -44,7 +47,7 @@ const DOTFILE_CONFIGS = {
|
|
|
44
47
|
function ensureDirectoryExists(filePath) {
|
|
45
48
|
ensureParentDir(filePath);
|
|
46
49
|
}
|
|
47
|
-
async function maybeAssignRuleSets(
|
|
50
|
+
async function maybeAssignRuleSets(projectSlug, context, insights) {
|
|
48
51
|
const available = dedupeRuleSets([
|
|
49
52
|
...(context.available_rule_sets?.organization ?? []),
|
|
50
53
|
...(context.available_rule_sets?.global ?? []),
|
|
@@ -75,7 +78,7 @@ async function maybeAssignRuleSets(projectId, context, insights) {
|
|
|
75
78
|
console.log(chalk.red("No valid rule set slugs selected."));
|
|
76
79
|
return false;
|
|
77
80
|
}
|
|
78
|
-
const assignment = await assignRuleSets(
|
|
81
|
+
const assignment = await assignRuleSets(projectSlug, slugs);
|
|
79
82
|
if (assignment.assigned > 0) {
|
|
80
83
|
console.log(chalk.green(`\n✓ Assigned ${assignment.assigned} rule set(s): ${assignment.rule_sets.map((rs) => rs.name).join(", ")}`));
|
|
81
84
|
return true;
|
|
@@ -110,6 +113,13 @@ function dedupeRuleSets(ruleSets) {
|
|
|
110
113
|
}
|
|
111
114
|
return result;
|
|
112
115
|
}
|
|
116
|
+
// Extract project slug from a potentially compound slug
|
|
117
|
+
function extractProjectSlug(slug) {
|
|
118
|
+
if (slug.includes("/")) {
|
|
119
|
+
return slug.split("/")[1];
|
|
120
|
+
}
|
|
121
|
+
return slug;
|
|
122
|
+
}
|
|
113
123
|
function hasChanges(filePath, newContent) {
|
|
114
124
|
if (!existsSync(filePath)) {
|
|
115
125
|
return true;
|
|
@@ -122,22 +132,22 @@ export async function syncCommand(options) {
|
|
|
122
132
|
const log = (msg) => verbose && console.log(chalk.gray(`[verbose] ${msg}`));
|
|
123
133
|
// Check for local project config first
|
|
124
134
|
const localConfig = loadLocalProjectConfig();
|
|
125
|
-
let
|
|
126
|
-
if (!
|
|
127
|
-
|
|
128
|
-
log(`Using project
|
|
135
|
+
let projectSlug = options.projectSlug;
|
|
136
|
+
if (!projectSlug && localConfig) {
|
|
137
|
+
projectSlug = localConfig.slug;
|
|
138
|
+
log(`Using project slug ${projectSlug} from .convext/config.json`);
|
|
129
139
|
}
|
|
130
|
-
// If no project
|
|
131
|
-
if (!
|
|
140
|
+
// If no project slug, prompt to initialize
|
|
141
|
+
if (!projectSlug) {
|
|
132
142
|
console.log(chalk.yellow("\nNo project configured for this directory."));
|
|
133
|
-
console.log(chalk.gray("A .convext.json file links this repo to your Convext project.\n"));
|
|
143
|
+
console.log(chalk.gray("A .convext/config.json file links this repo to your Convext project.\n"));
|
|
134
144
|
const shouldInit = await promptConfirm("Would you like to initialize/connect this project now?", true);
|
|
135
145
|
if (shouldInit) {
|
|
136
146
|
await initCommand({});
|
|
137
147
|
// Re-load the config after init
|
|
138
148
|
const newConfig = loadLocalProjectConfig();
|
|
139
149
|
if (newConfig) {
|
|
140
|
-
|
|
150
|
+
projectSlug = newConfig.slug;
|
|
141
151
|
console.log(""); // Add spacing
|
|
142
152
|
}
|
|
143
153
|
else {
|
|
@@ -148,7 +158,7 @@ export async function syncCommand(options) {
|
|
|
148
158
|
}
|
|
149
159
|
else {
|
|
150
160
|
console.log(chalk.gray("\nTo initialize later, run: ") + chalk.cyan("convext init"));
|
|
151
|
-
console.log(chalk.gray("Or specify a project
|
|
161
|
+
console.log(chalk.gray("Or specify a project slug: ") + chalk.cyan("convext sync --project <slug>"));
|
|
152
162
|
return;
|
|
153
163
|
}
|
|
154
164
|
}
|
|
@@ -160,14 +170,14 @@ export async function syncCommand(options) {
|
|
|
160
170
|
log(`Found frameworks: ${Array.from(insights.frameworks).join(", ") || "none"}`);
|
|
161
171
|
let projectMeta;
|
|
162
172
|
spinner.text = "Fetching project context...";
|
|
163
|
-
log(`Fetching context for project
|
|
173
|
+
log(`Fetching context for project slug: ${projectSlug}`);
|
|
164
174
|
try {
|
|
165
|
-
projectMeta = await getProjectContext(
|
|
175
|
+
projectMeta = await getProjectContext(projectSlug);
|
|
166
176
|
log(`Project context response: ${JSON.stringify(projectMeta, null, 2)}`);
|
|
167
177
|
// Check if API returned an error (project not found)
|
|
168
178
|
if (projectMeta.error) {
|
|
169
179
|
spinner.fail("Project not found on server");
|
|
170
|
-
console.log(chalk.yellow(`\nProject
|
|
180
|
+
console.log(chalk.yellow(`\nProject "${projectSlug}" no longer exists on the server.`));
|
|
171
181
|
console.log(chalk.gray("This can happen if the project was deleted or the database was reset.\n"));
|
|
172
182
|
const shouldReinit = await promptConfirm("Would you like to re-register this project?", true);
|
|
173
183
|
if (shouldReinit) {
|
|
@@ -182,9 +192,9 @@ export async function syncCommand(options) {
|
|
|
182
192
|
// Re-load the config after init
|
|
183
193
|
const newConfig = loadLocalProjectConfig();
|
|
184
194
|
if (newConfig) {
|
|
185
|
-
|
|
195
|
+
projectSlug = newConfig.slug;
|
|
186
196
|
spinner.start("Fetching project context...");
|
|
187
|
-
projectMeta = await getProjectContext(
|
|
197
|
+
projectMeta = await getProjectContext(projectSlug);
|
|
188
198
|
}
|
|
189
199
|
else {
|
|
190
200
|
console.log(chalk.yellow("\nProject registration was cancelled."));
|
|
@@ -211,13 +221,13 @@ export async function syncCommand(options) {
|
|
|
211
221
|
// Check if project has explicitly assigned rulesets (not just inheriting globals)
|
|
212
222
|
const assignedRuleSets = projectMeta.assigned_rule_sets ?? [];
|
|
213
223
|
const hasExplicitAssignments = assignedRuleSets.length > 0;
|
|
214
|
-
if (!hasExplicitAssignments &&
|
|
224
|
+
if (!hasExplicitAssignments && projectSlug && projectMeta) {
|
|
215
225
|
console.log(chalk.yellow("\nNo rule sets are explicitly assigned to this project."));
|
|
216
226
|
console.log(chalk.gray("Select rule sets based on your tech stack:\n"));
|
|
217
|
-
const assigned = await maybeAssignRuleSets(
|
|
227
|
+
const assigned = await maybeAssignRuleSets(projectSlug, projectMeta, insights);
|
|
218
228
|
if (assigned) {
|
|
219
229
|
spinner.start("Reloading project context...");
|
|
220
|
-
projectMeta = await getProjectContext(
|
|
230
|
+
projectMeta = await getProjectContext(projectSlug);
|
|
221
231
|
spinner.succeed("Rule sets assigned and context refreshed");
|
|
222
232
|
}
|
|
223
233
|
else {
|
|
@@ -238,7 +248,9 @@ export async function syncCommand(options) {
|
|
|
238
248
|
log("Fetching pre-rendered markdown from server...");
|
|
239
249
|
let serverMarkdown;
|
|
240
250
|
try {
|
|
241
|
-
|
|
251
|
+
// Use simple project slug (without org prefix) for the API endpoint
|
|
252
|
+
const simpleSlug = extractProjectSlug(projectSlug);
|
|
253
|
+
const contextResponse = await getProjectMarkdown(simpleSlug);
|
|
242
254
|
serverMarkdown = contextResponse.markdown;
|
|
243
255
|
log(`Got ${contextResponse.rules_count} rules, ${contextResponse.standards_count} standards`);
|
|
244
256
|
}
|
|
@@ -304,6 +316,14 @@ export async function syncCommand(options) {
|
|
|
304
316
|
else {
|
|
305
317
|
console.log("\n" + chalk.gray("All files are up to date"));
|
|
306
318
|
}
|
|
319
|
+
// Generate hooks if requested
|
|
320
|
+
if (options.hooks && projectSlug) {
|
|
321
|
+
await syncHooks(projectSlug, cwd, options.dryRun ?? false, verbose);
|
|
322
|
+
}
|
|
323
|
+
// Upload telemetry if requested
|
|
324
|
+
if (options.telemetry && projectSlug) {
|
|
325
|
+
await syncTelemetry(projectSlug, options.dryRun ?? false, verbose);
|
|
326
|
+
}
|
|
307
327
|
}
|
|
308
328
|
catch (error) {
|
|
309
329
|
spinner.fail("Sync failed");
|
|
@@ -319,4 +339,90 @@ export async function syncCommand(options) {
|
|
|
319
339
|
process.exit(1);
|
|
320
340
|
}
|
|
321
341
|
}
|
|
342
|
+
async function syncHooks(projectSlug, cwd, dryRun, verbose) {
|
|
343
|
+
const log = (msg) => verbose && console.log(chalk.gray(`[verbose] ${msg}`));
|
|
344
|
+
console.log("\n" + chalk.bold("Generating Hooks:"));
|
|
345
|
+
try {
|
|
346
|
+
log("Fetching rules with enforcement patterns...");
|
|
347
|
+
const { rules } = await getProjectRulesWithEnforcement(projectSlug);
|
|
348
|
+
const enforceableRules = rules.filter((r) => r.enforcement?.block_paths?.length ||
|
|
349
|
+
r.enforcement?.block_content?.length ||
|
|
350
|
+
r.enforcement?.block_dependencies?.length);
|
|
351
|
+
log(`Found ${enforceableRules.length} enforceable rules out of ${rules.length} total`);
|
|
352
|
+
if (enforceableRules.length === 0) {
|
|
353
|
+
console.log(chalk.yellow(" No enforceable rules found. Hooks not generated."));
|
|
354
|
+
console.log(chalk.gray(" Add enforcement patterns to your rules in the Convext UI."));
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
const hookConfig = {
|
|
358
|
+
projectSlug,
|
|
359
|
+
apiUrl: getApiUrl(),
|
|
360
|
+
rules: enforceableRules,
|
|
361
|
+
};
|
|
362
|
+
const hooks = generateHooks(hookConfig, cwd);
|
|
363
|
+
if (dryRun) {
|
|
364
|
+
console.log(chalk.cyan(" [DRY RUN] Would generate:"));
|
|
365
|
+
for (const file of hooks.files) {
|
|
366
|
+
console.log(chalk.gray(` - ${file.path}`));
|
|
367
|
+
}
|
|
368
|
+
console.log(chalk.gray(" - .claude/settings.json (hooks config)"));
|
|
369
|
+
return;
|
|
370
|
+
}
|
|
371
|
+
const written = writeHooks(hooks, cwd);
|
|
372
|
+
for (const path of written) {
|
|
373
|
+
console.log(chalk.green(` ✓ ${path}`));
|
|
374
|
+
}
|
|
375
|
+
// Update Claude Code settings
|
|
376
|
+
const settingsPath = join(cwd, ".claude", "settings.json");
|
|
377
|
+
ensureParentDir(settingsPath);
|
|
378
|
+
let existingSettings = {};
|
|
379
|
+
if (existsSync(settingsPath)) {
|
|
380
|
+
try {
|
|
381
|
+
existingSettings = JSON.parse(readFileSync(settingsPath, "utf-8"));
|
|
382
|
+
}
|
|
383
|
+
catch {
|
|
384
|
+
existingSettings = {};
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
const mergedSettings = mergeClaudeCodeSettings(existingSettings, hooks.settings);
|
|
388
|
+
writeFileSync(settingsPath, JSON.stringify(mergedSettings, null, 2), "utf-8");
|
|
389
|
+
console.log(chalk.green(` ✓ .claude/settings.json (hooks config)`));
|
|
390
|
+
console.log(chalk.green(`\n✓ Generated ${written.length} hook(s) with ${enforceableRules.length} enforceable rules`));
|
|
391
|
+
}
|
|
392
|
+
catch (error) {
|
|
393
|
+
console.log(chalk.red(" ✗ Failed to generate hooks"));
|
|
394
|
+
if (error instanceof Error) {
|
|
395
|
+
console.log(chalk.gray(` Error: ${error.message}`));
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
async function syncTelemetry(projectSlug, dryRun, verbose) {
|
|
400
|
+
const log = (msg) => verbose && console.log(chalk.gray(`[verbose] ${msg}`));
|
|
401
|
+
console.log("\n" + chalk.bold("Syncing Telemetry:"));
|
|
402
|
+
try {
|
|
403
|
+
const events = readEvents();
|
|
404
|
+
if (events.length === 0) {
|
|
405
|
+
console.log(chalk.gray(" No local telemetry to upload."));
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
log(`Found ${events.length} local events`);
|
|
409
|
+
if (dryRun) {
|
|
410
|
+
console.log(chalk.cyan(` [DRY RUN] Would upload ${events.length} event(s)`));
|
|
411
|
+
return;
|
|
412
|
+
}
|
|
413
|
+
const result = await uploadTelemetry(projectSlug, events);
|
|
414
|
+
console.log(chalk.green(` ✓ Uploaded ${result.uploaded} event(s)`));
|
|
415
|
+
// Archive uploaded events
|
|
416
|
+
const archivePath = rotateLog();
|
|
417
|
+
if (archivePath) {
|
|
418
|
+
console.log(chalk.gray(` ↻ Archived to ${archivePath}`));
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
catch (error) {
|
|
422
|
+
console.log(chalk.red(" ✗ Failed to upload telemetry"));
|
|
423
|
+
if (error instanceof Error) {
|
|
424
|
+
console.log(chalk.gray(` Error: ${error.message}`));
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
}
|
|
322
428
|
//# sourceMappingURL=sync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export interface EnforcementRule {
|
|
2
|
+
slug: string;
|
|
3
|
+
title: string;
|
|
4
|
+
severity: string;
|
|
5
|
+
enforcement: {
|
|
6
|
+
block_paths?: Array<{
|
|
7
|
+
pattern: string;
|
|
8
|
+
message: string;
|
|
9
|
+
}>;
|
|
10
|
+
block_content?: Array<{
|
|
11
|
+
pattern: string;
|
|
12
|
+
message: string;
|
|
13
|
+
}>;
|
|
14
|
+
block_dependencies?: Array<{
|
|
15
|
+
gem?: string;
|
|
16
|
+
package?: string;
|
|
17
|
+
message: string;
|
|
18
|
+
}>;
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
export interface HookConfig {
|
|
22
|
+
projectSlug: string;
|
|
23
|
+
apiUrl: string;
|
|
24
|
+
rules: EnforcementRule[];
|
|
25
|
+
}
|
|
26
|
+
export interface GeneratedHooks {
|
|
27
|
+
files: Array<{
|
|
28
|
+
path: string;
|
|
29
|
+
content: string;
|
|
30
|
+
executable?: boolean;
|
|
31
|
+
}>;
|
|
32
|
+
settings: Record<string, unknown>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Generate all hook files for a project
|
|
36
|
+
*/
|
|
37
|
+
export declare function generateHooks(config: HookConfig, cwd?: string): GeneratedHooks;
|
|
38
|
+
/**
|
|
39
|
+
* Write generated hooks to disk
|
|
40
|
+
*/
|
|
41
|
+
export declare function writeHooks(hooks: GeneratedHooks, cwd?: string): string[];
|
|
42
|
+
/**
|
|
43
|
+
* Merge hook settings into existing Claude Code settings
|
|
44
|
+
*/
|
|
45
|
+
export declare function mergeClaudeCodeSettings(existing: Record<string, unknown>, hookSettings: Record<string, unknown>): Record<string, unknown>;
|
|
46
|
+
//# sourceMappingURL=hooks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../src/utils/hooks.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE;QACX,WAAW,CAAC,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC1D,aAAa,CAAC,EAAE,KAAK,CAAC;YAAE,OAAO,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QAC5D,kBAAkB,CAAC,EAAE,KAAK,CAAC;YAAE,GAAG,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAC;YAAC,OAAO,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KACjF,CAAC;CACH;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,eAAe,EAAE,CAAC;CAC1B;AA0ND,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,CAAC,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;IACtE,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,GAAE,MAAsB,GAAG,cAAc,CAuC7F;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE,cAAc,EAAE,GAAG,GAAE,MAAsB,GAAG,MAAM,EAAE,CAevF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAUzB"}
|
|
@@ -0,0 +1,270 @@
|
|
|
1
|
+
import { existsSync, writeFileSync, chmodSync, mkdirSync } from 'node:fs';
|
|
2
|
+
import { join, dirname } from 'node:path';
|
|
3
|
+
function ensureDir(dirPath) {
|
|
4
|
+
if (!existsSync(dirPath)) {
|
|
5
|
+
mkdirSync(dirPath, { recursive: true });
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Generate the validate_write hook for Claude Code
|
|
10
|
+
* This hook runs before Write/Edit tool calls
|
|
11
|
+
*/
|
|
12
|
+
function generateValidateWriteHook(config) {
|
|
13
|
+
const pathPatterns = config.rules
|
|
14
|
+
.filter((r) => r.enforcement?.block_paths?.length)
|
|
15
|
+
.flatMap((r) => r.enforcement.block_paths.map((p) => ({
|
|
16
|
+
ruleSlug: r.slug,
|
|
17
|
+
ruleTitle: r.title,
|
|
18
|
+
severity: r.severity,
|
|
19
|
+
pattern: p.pattern,
|
|
20
|
+
message: p.message,
|
|
21
|
+
})));
|
|
22
|
+
const contentPatterns = config.rules
|
|
23
|
+
.filter((r) => r.enforcement?.block_content?.length)
|
|
24
|
+
.flatMap((r) => r.enforcement.block_content.map((p) => ({
|
|
25
|
+
ruleSlug: r.slug,
|
|
26
|
+
ruleTitle: r.title,
|
|
27
|
+
severity: r.severity,
|
|
28
|
+
pattern: p.pattern,
|
|
29
|
+
message: p.message,
|
|
30
|
+
})));
|
|
31
|
+
return `#!/usr/bin/env ruby
|
|
32
|
+
# frozen_string_literal: true
|
|
33
|
+
# Generated by Convext - validates file writes against project rules
|
|
34
|
+
# Hook: PreToolUse for Write, Edit tools
|
|
35
|
+
|
|
36
|
+
require 'json'
|
|
37
|
+
require 'time'
|
|
38
|
+
|
|
39
|
+
TELEMETRY_FILE = '.convext/telemetry.jsonl'
|
|
40
|
+
PROJECT_SLUG = '${config.projectSlug}'
|
|
41
|
+
|
|
42
|
+
def log_telemetry(event)
|
|
43
|
+
event[:timestamp] = Time.now.utc.iso8601
|
|
44
|
+
event[:project_slug] = PROJECT_SLUG
|
|
45
|
+
event[:source] = 'hook'
|
|
46
|
+
event[:tool] = 'claude-code'
|
|
47
|
+
|
|
48
|
+
File.open(TELEMETRY_FILE, 'a') { |f| f.puts(event.to_json) }
|
|
49
|
+
rescue StandardError
|
|
50
|
+
# Silently fail - telemetry should never break the hook
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Parse input from Claude Code
|
|
54
|
+
input = JSON.parse(ARGV[0] || '{}')
|
|
55
|
+
tool_name = input['tool_name']
|
|
56
|
+
tool_input = input['tool_input'] || {}
|
|
57
|
+
|
|
58
|
+
# Only check Write and Edit tools
|
|
59
|
+
exit 0 unless %w[Write Edit].include?(tool_name)
|
|
60
|
+
|
|
61
|
+
file_path = tool_input['file_path'] || ''
|
|
62
|
+
content = tool_input['content'] || tool_input['new_string'] || ''
|
|
63
|
+
|
|
64
|
+
# Path pattern checks
|
|
65
|
+
PATH_PATTERNS = ${JSON.stringify(pathPatterns, null, 2)}
|
|
66
|
+
|
|
67
|
+
PATH_PATTERNS.each do |check|
|
|
68
|
+
if file_path.match?(Regexp.new(check['pattern']))
|
|
69
|
+
log_telemetry({
|
|
70
|
+
event_type: 'violation',
|
|
71
|
+
rule_slug: check['ruleSlug'],
|
|
72
|
+
rule_title: check['ruleTitle'],
|
|
73
|
+
action: 'blocked',
|
|
74
|
+
result: 'blocked',
|
|
75
|
+
file: file_path
|
|
76
|
+
})
|
|
77
|
+
warn "BLOCKED: #{check['message']}"
|
|
78
|
+
warn "Rule: #{check['ruleTitle']} (#{check['severity']})"
|
|
79
|
+
exit 2
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
# Content pattern checks
|
|
84
|
+
CONTENT_PATTERNS = ${JSON.stringify(contentPatterns, null, 2)}
|
|
85
|
+
|
|
86
|
+
CONTENT_PATTERNS.each do |check|
|
|
87
|
+
if content.match?(Regexp.new(check['pattern']))
|
|
88
|
+
log_telemetry({
|
|
89
|
+
event_type: 'violation',
|
|
90
|
+
rule_slug: check['ruleSlug'],
|
|
91
|
+
rule_title: check['ruleTitle'],
|
|
92
|
+
action: 'blocked',
|
|
93
|
+
result: 'blocked',
|
|
94
|
+
file: file_path
|
|
95
|
+
})
|
|
96
|
+
warn "BLOCKED: #{check['message']}"
|
|
97
|
+
warn "Rule: #{check['ruleTitle']} (#{check['severity']})"
|
|
98
|
+
exit 2
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
# Passed all checks
|
|
103
|
+
log_telemetry({
|
|
104
|
+
event_type: 'compliance_check',
|
|
105
|
+
action: 'file_write',
|
|
106
|
+
result: 'passed',
|
|
107
|
+
file: file_path
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
exit 0
|
|
111
|
+
`;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Generate the validate_bash hook for Claude Code
|
|
115
|
+
* This hook runs before Bash tool calls
|
|
116
|
+
*/
|
|
117
|
+
function generateValidateBashHook(config) {
|
|
118
|
+
return `#!/usr/bin/env ruby
|
|
119
|
+
# frozen_string_literal: true
|
|
120
|
+
# Generated by Convext - validates bash commands against project rules
|
|
121
|
+
# Hook: PreToolUse for Bash tool
|
|
122
|
+
|
|
123
|
+
require 'json'
|
|
124
|
+
require 'time'
|
|
125
|
+
|
|
126
|
+
TELEMETRY_FILE = '.convext/telemetry.jsonl'
|
|
127
|
+
PROJECT_SLUG = '${config.projectSlug}'
|
|
128
|
+
|
|
129
|
+
def log_telemetry(event)
|
|
130
|
+
event[:timestamp] = Time.now.utc.iso8601
|
|
131
|
+
event[:project_slug] = PROJECT_SLUG
|
|
132
|
+
event[:source] = 'hook'
|
|
133
|
+
event[:tool] = 'claude-code'
|
|
134
|
+
|
|
135
|
+
File.open(TELEMETRY_FILE, 'a') { |f| f.puts(event.to_json) }
|
|
136
|
+
rescue StandardError
|
|
137
|
+
# Silently fail
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Parse input from Claude Code
|
|
141
|
+
input = JSON.parse(ARGV[0] || '{}')
|
|
142
|
+
tool_name = input['tool_name']
|
|
143
|
+
tool_input = input['tool_input'] || {}
|
|
144
|
+
|
|
145
|
+
exit 0 unless tool_name == 'Bash'
|
|
146
|
+
|
|
147
|
+
command = tool_input['command'] || ''
|
|
148
|
+
|
|
149
|
+
# Block dangerous git operations
|
|
150
|
+
BLOCKED_PATTERNS = [
|
|
151
|
+
{ pattern: /git\\s+push\\s+.*--force(?!-with-lease)/, message: 'Force push without lease is not allowed' },
|
|
152
|
+
{ pattern: /git\\s+push\\s+(-f|--force)\\s/, message: 'Force push is not allowed' },
|
|
153
|
+
{ pattern: /git\\s+reset\\s+--hard\\s+origin/, message: 'Hard reset to origin is dangerous' },
|
|
154
|
+
{ pattern: /rm\\s+-rf\\s+\\//, message: 'Recursive delete from root is not allowed' },
|
|
155
|
+
]
|
|
156
|
+
|
|
157
|
+
BLOCKED_PATTERNS.each do |check|
|
|
158
|
+
if command.match?(check[:pattern])
|
|
159
|
+
log_telemetry({
|
|
160
|
+
event_type: 'violation',
|
|
161
|
+
rule_title: 'dangerous-command',
|
|
162
|
+
action: 'blocked',
|
|
163
|
+
result: 'blocked',
|
|
164
|
+
payload: { command: command[0..100] }
|
|
165
|
+
})
|
|
166
|
+
warn "BLOCKED: #{check[:message]}"
|
|
167
|
+
exit 2
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
exit 0
|
|
172
|
+
`;
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Generate the session_start hook for Claude Code
|
|
176
|
+
*/
|
|
177
|
+
function generateSessionStartHook(config) {
|
|
178
|
+
return `#!/bin/bash
|
|
179
|
+
# Generated by Convext - logs session start
|
|
180
|
+
# Hook: SessionStart
|
|
181
|
+
|
|
182
|
+
TELEMETRY_FILE=".convext/telemetry.jsonl"
|
|
183
|
+
mkdir -p .convext
|
|
184
|
+
|
|
185
|
+
echo '{"timestamp":"'$(date -u +%Y-%m-%dT%H:%M:%SZ)'","event_type":"session_start","source":"hook","tool":"claude-code","project_slug":"${config.projectSlug}"}' >> "$TELEMETRY_FILE"
|
|
186
|
+
`;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Generate Claude Code settings.json with hooks configuration
|
|
190
|
+
*/
|
|
191
|
+
function generateClaudeCodeSettings(hooksDir) {
|
|
192
|
+
return {
|
|
193
|
+
hooks: {
|
|
194
|
+
PreToolUse: [
|
|
195
|
+
{
|
|
196
|
+
matcher: 'Write|Edit',
|
|
197
|
+
hooks: [`${hooksDir}/validate_write.rb`],
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
matcher: 'Bash',
|
|
201
|
+
hooks: [`${hooksDir}/validate_bash.rb`],
|
|
202
|
+
},
|
|
203
|
+
],
|
|
204
|
+
SessionStart: [`${hooksDir}/session_start.sh`],
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Generate all hook files for a project
|
|
210
|
+
*/
|
|
211
|
+
export function generateHooks(config, cwd = process.cwd()) {
|
|
212
|
+
const hooksDir = join(cwd, '.convext', 'hooks');
|
|
213
|
+
const relativeHooksDir = '.convext/hooks';
|
|
214
|
+
const files = [];
|
|
215
|
+
// Only generate hooks if there are enforceable rules
|
|
216
|
+
const hasEnforceableRules = config.rules.some((r) => r.enforcement?.block_paths?.length ||
|
|
217
|
+
r.enforcement?.block_content?.length ||
|
|
218
|
+
r.enforcement?.block_dependencies?.length);
|
|
219
|
+
if (hasEnforceableRules) {
|
|
220
|
+
files.push({
|
|
221
|
+
path: join(hooksDir, 'validate_write.rb'),
|
|
222
|
+
content: generateValidateWriteHook(config),
|
|
223
|
+
executable: true,
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
// Always generate bash validation (blocks dangerous commands)
|
|
227
|
+
files.push({
|
|
228
|
+
path: join(hooksDir, 'validate_bash.rb'),
|
|
229
|
+
content: generateValidateBashHook(config),
|
|
230
|
+
executable: true,
|
|
231
|
+
});
|
|
232
|
+
// Always generate session start hook
|
|
233
|
+
files.push({
|
|
234
|
+
path: join(hooksDir, 'session_start.sh'),
|
|
235
|
+
content: generateSessionStartHook(config),
|
|
236
|
+
executable: true,
|
|
237
|
+
});
|
|
238
|
+
const settings = generateClaudeCodeSettings(relativeHooksDir);
|
|
239
|
+
return { files, settings };
|
|
240
|
+
}
|
|
241
|
+
/**
|
|
242
|
+
* Write generated hooks to disk
|
|
243
|
+
*/
|
|
244
|
+
export function writeHooks(hooks, cwd = process.cwd()) {
|
|
245
|
+
const written = [];
|
|
246
|
+
for (const file of hooks.files) {
|
|
247
|
+
ensureDir(dirname(file.path));
|
|
248
|
+
writeFileSync(file.path, file.content, 'utf-8');
|
|
249
|
+
if (file.executable) {
|
|
250
|
+
chmodSync(file.path, 0o755);
|
|
251
|
+
}
|
|
252
|
+
written.push(file.path);
|
|
253
|
+
}
|
|
254
|
+
return written;
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Merge hook settings into existing Claude Code settings
|
|
258
|
+
*/
|
|
259
|
+
export function mergeClaudeCodeSettings(existing, hookSettings) {
|
|
260
|
+
const existingHooks = existing.hooks || {};
|
|
261
|
+
const newHooks = hookSettings.hooks || {};
|
|
262
|
+
return {
|
|
263
|
+
...existing,
|
|
264
|
+
hooks: {
|
|
265
|
+
...existingHooks,
|
|
266
|
+
...newHooks,
|
|
267
|
+
},
|
|
268
|
+
};
|
|
269
|
+
}
|
|
270
|
+
//# sourceMappingURL=hooks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/utils/hooks.ts"],"names":[],"mappings":"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"}
|