@prism-d1/cli 1.1.2 → 1.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/github-workflows/prism-agent-eval.yml +2 -1
- package/dist/assets/github-workflows/prism-eval-gate-kiro.yml +12 -2
- package/dist/assets/gitlab-workflows/prism-eval-gate.yml +8 -0
- package/dist/assets/infra/bin/app.ts +61 -37
- package/dist/assets/infra/lib/constructs/otel-collector-construct.ts +96 -0
- package/dist/assets/infra/lib/constructs/security-agent-construct.ts +35 -30
- package/dist/assets/infra/lib/dashboard-stack.ts +27 -0
- package/dist/assets/infra/lib/lambda/otel-receiver.ts +278 -8
- package/dist/assets/infra/lib/lambda/pricing/litellm-snapshot.json +3769 -0
- package/dist/assets/infra/lib/lambda/pricing/price-source.ts +56 -0
- package/dist/assets/infra/lib/lambda/pricing/price-table.ts +240 -0
- package/dist/assets/infra/lib/lambda/pricing/prices-key.ts +6 -0
- package/dist/assets/infra/lib/lambda/pricing/reprice.ts +108 -0
- package/dist/assets/infra/lib/lambda/pricing-refresh.ts +352 -0
- package/dist/assets/infra/lib/lambda/velocity-widget.ts +124 -1
- package/dist/assets/infra/lib/metrics-pipeline-stack.ts +2 -110
- package/dist/assets/infra/lib/security-agent-resources.ts +136 -0
- package/dist/assets/infra/lib/security-agent-stack.ts +69 -0
- package/dist/assets/infra/package.json +4 -1
- package/dist/assets/metric-hooks/prepare-commit-msg +3 -1
- package/dist/assets/pentest-cdk/bin/app.ts +12 -0
- package/dist/assets/pentest-cdk/cdk.json +7 -0
- package/dist/assets/pentest-cdk/lib/pentest-target-stack.ts +206 -0
- package/dist/assets/pentest-cdk/package.json +18 -0
- package/dist/assets/pentest-cdk/tsconfig.json +12 -0
- package/dist/src/codewatch/config.d.ts +17 -0
- package/dist/src/codewatch/config.d.ts.map +1 -0
- package/dist/src/codewatch/config.js +40 -0
- package/dist/src/codewatch/config.js.map +1 -0
- package/dist/src/codewatch/gitleaks.d.ts +49 -0
- package/dist/src/codewatch/gitleaks.d.ts.map +1 -0
- package/dist/src/codewatch/gitleaks.js +160 -0
- package/dist/src/codewatch/gitleaks.js.map +1 -0
- package/dist/src/codewatch/globalHooks.d.ts +52 -0
- package/dist/src/codewatch/globalHooks.d.ts.map +1 -0
- package/dist/src/codewatch/globalHooks.js +235 -0
- package/dist/src/codewatch/globalHooks.js.map +1 -0
- package/dist/src/codewatch/hooks.d.ts +38 -0
- package/dist/src/codewatch/hooks.d.ts.map +1 -0
- package/dist/src/codewatch/hooks.js +176 -0
- package/dist/src/codewatch/hooks.js.map +1 -0
- package/dist/src/codewatch/prepush.d.ts +37 -0
- package/dist/src/codewatch/prepush.d.ts.map +1 -0
- package/dist/src/codewatch/prepush.js +231 -0
- package/dist/src/codewatch/prepush.js.map +1 -0
- package/dist/src/codewatch/results.d.ts +210 -0
- package/dist/src/codewatch/results.d.ts.map +1 -0
- package/dist/src/codewatch/results.js +127 -0
- package/dist/src/codewatch/results.js.map +1 -0
- package/dist/src/codewatch/reviewers/claude.d.ts +9 -0
- package/dist/src/codewatch/reviewers/claude.d.ts.map +1 -0
- package/dist/src/codewatch/reviewers/claude.js +48 -0
- package/dist/src/codewatch/reviewers/claude.js.map +1 -0
- package/dist/src/codewatch/reviewers/index.d.ts +39 -0
- package/dist/src/codewatch/reviewers/index.d.ts.map +1 -0
- package/dist/src/codewatch/reviewers/index.js +97 -0
- package/dist/src/codewatch/reviewers/index.js.map +1 -0
- package/dist/src/codewatch/reviewers/kiro.d.ts +14 -0
- package/dist/src/codewatch/reviewers/kiro.d.ts.map +1 -0
- package/dist/src/codewatch/reviewers/kiro.js +32 -0
- package/dist/src/codewatch/reviewers/kiro.js.map +1 -0
- package/dist/src/codewatch/reviewers/types.d.ts +56 -0
- package/dist/src/codewatch/reviewers/types.d.ts.map +1 -0
- package/dist/src/codewatch/reviewers/types.js +91 -0
- package/dist/src/codewatch/reviewers/types.js.map +1 -0
- package/dist/src/codewatch/rules.d.ts +12 -0
- package/dist/src/codewatch/rules.d.ts.map +1 -0
- package/dist/src/codewatch/rules.js +27 -0
- package/dist/src/codewatch/rules.js.map +1 -0
- package/dist/src/commands/_top/dashboard.d.ts +17 -0
- package/dist/src/commands/_top/dashboard.d.ts.map +1 -0
- package/dist/src/commands/_top/dashboard.js +76 -0
- package/dist/src/commands/_top/dashboard.js.map +1 -0
- package/dist/src/commands/_top/version.d.ts +62 -0
- package/dist/src/commands/_top/version.d.ts.map +1 -0
- package/dist/src/commands/_top/version.js +175 -0
- package/dist/src/commands/_top/version.js.map +1 -0
- package/dist/src/commands/bedrock-protection/scan-account.d.ts.map +1 -1
- package/dist/src/commands/bedrock-protection/scan-account.js +2 -1
- package/dist/src/commands/bedrock-protection/scan-account.js.map +1 -1
- package/dist/src/commands/bedrock-protection/scan-org.d.ts.map +1 -1
- package/dist/src/commands/bedrock-protection/scan-org.js +16 -4
- package/dist/src/commands/bedrock-protection/scan-org.js.map +1 -1
- package/dist/src/commands/bootstrapper/install-eval-harness.d.ts.map +1 -1
- package/dist/src/commands/bootstrapper/install-eval-harness.js +15 -48
- package/dist/src/commands/bootstrapper/install-eval-harness.js.map +1 -1
- package/dist/src/commands/bootstrapper/install-git-hooks.d.ts +13 -0
- package/dist/src/commands/bootstrapper/install-git-hooks.d.ts.map +1 -1
- package/dist/src/commands/bootstrapper/install-git-hooks.js +28 -147
- package/dist/src/commands/bootstrapper/install-git-hooks.js.map +1 -1
- package/dist/src/commands/bootstrapper/setup-otel-sync.d.ts +12 -6
- package/dist/src/commands/bootstrapper/setup-otel-sync.d.ts.map +1 -1
- package/dist/src/commands/bootstrapper/setup-otel-sync.js +18 -443
- package/dist/src/commands/bootstrapper/setup-otel-sync.js.map +1 -1
- package/dist/src/commands/codewatch/pre-commit.d.ts +7 -0
- package/dist/src/commands/codewatch/pre-commit.d.ts.map +1 -0
- package/dist/src/commands/codewatch/pre-commit.js +30 -0
- package/dist/src/commands/codewatch/pre-commit.js.map +1 -0
- package/dist/src/commands/codewatch/pre-push.d.ts +16 -0
- package/dist/src/commands/codewatch/pre-push.d.ts.map +1 -0
- package/dist/src/commands/codewatch/pre-push.js +32 -0
- package/dist/src/commands/codewatch/pre-push.js.map +1 -0
- package/dist/src/commands/codewatch/report.d.ts +22 -0
- package/dist/src/commands/codewatch/report.d.ts.map +1 -0
- package/dist/src/commands/codewatch/report.js +64 -0
- package/dist/src/commands/codewatch/report.js.map +1 -0
- package/dist/src/commands/enable/codeburn.d.ts +59 -0
- package/dist/src/commands/enable/codeburn.d.ts.map +1 -0
- package/dist/src/commands/enable/codeburn.js +531 -0
- package/dist/src/commands/enable/codeburn.js.map +1 -0
- package/dist/src/commands/enable/codewatch.d.ts +15 -0
- package/dist/src/commands/enable/codewatch.d.ts.map +1 -0
- package/dist/src/commands/enable/codewatch.js +186 -0
- package/dist/src/commands/enable/codewatch.js.map +1 -0
- package/dist/src/commands/enable/security.d.ts +41 -0
- package/dist/src/commands/enable/security.d.ts.map +1 -0
- package/dist/src/commands/enable/security.js +130 -0
- package/dist/src/commands/enable/security.js.map +1 -0
- package/dist/src/commands/export/otel.d.ts +31 -0
- package/dist/src/commands/export/otel.d.ts.map +1 -0
- package/dist/src/commands/export/otel.js +52 -0
- package/dist/src/commands/export/otel.js.map +1 -0
- package/dist/src/commands/git/claude-session-context.d.ts.map +1 -1
- package/dist/src/commands/git/claude-session-context.js +2 -1
- package/dist/src/commands/git/claude-session-context.js.map +1 -1
- package/dist/src/commands/git/commit-trailers.js +1 -1
- package/dist/src/commands/git/commit-trailers.js.map +1 -1
- package/dist/src/commands/security/code-review.d.ts +22 -0
- package/dist/src/commands/security/code-review.d.ts.map +1 -0
- package/dist/src/commands/security/code-review.js +43 -0
- package/dist/src/commands/security/code-review.js.map +1 -0
- package/dist/src/commands/security/findings.d.ts +15 -0
- package/dist/src/commands/security/findings.d.ts.map +1 -0
- package/dist/src/commands/security/findings.js +31 -0
- package/dist/src/commands/security/findings.js.map +1 -0
- package/dist/src/commands/security/pentest.d.ts +18 -0
- package/dist/src/commands/security/pentest.d.ts.map +1 -0
- package/dist/src/commands/security/pentest.js +32 -0
- package/dist/src/commands/security/pentest.js.map +1 -0
- package/dist/src/commands/security/threat-model.d.ts +16 -0
- package/dist/src/commands/security/threat-model.d.ts.map +1 -0
- package/dist/src/commands/security/threat-model.js +24 -0
- package/dist/src/commands/security/threat-model.js.map +1 -0
- package/dist/src/commands/security/threats.d.ts +12 -0
- package/dist/src/commands/security/threats.d.ts.map +1 -0
- package/dist/src/commands/security/threats.js +23 -0
- package/dist/src/commands/security/threats.js.map +1 -0
- package/dist/src/commands/securityagent/setup.d.ts +19 -5
- package/dist/src/commands/securityagent/setup.d.ts.map +1 -1
- package/dist/src/commands/securityagent/setup.js +25 -189
- package/dist/src/commands/securityagent/setup.js.map +1 -1
- package/dist/src/commands/workshop/verify-setup.d.ts.map +1 -1
- package/dist/src/commands/workshop/verify-setup.js +5 -3
- package/dist/src/commands/workshop/verify-setup.js.map +1 -1
- package/dist/src/dashboard/codewatch.d.ts +106 -0
- package/dist/src/dashboard/codewatch.d.ts.map +1 -0
- package/dist/src/dashboard/codewatch.js +120 -0
- package/dist/src/dashboard/codewatch.js.map +1 -0
- package/dist/src/dashboard/commits.d.ts +96 -0
- package/dist/src/dashboard/commits.d.ts.map +1 -0
- package/dist/src/dashboard/commits.js +207 -0
- package/dist/src/dashboard/commits.js.map +1 -0
- package/dist/src/dashboard/page.d.ts +10 -0
- package/dist/src/dashboard/page.d.ts.map +1 -0
- package/dist/src/dashboard/page.js +470 -0
- package/dist/src/dashboard/page.js.map +1 -0
- package/dist/src/dashboard/payload.d.ts +114 -0
- package/dist/src/dashboard/payload.d.ts.map +1 -0
- package/dist/src/dashboard/payload.js +96 -0
- package/dist/src/dashboard/payload.js.map +1 -0
- package/dist/src/dashboard/report.d.ts +99 -0
- package/dist/src/dashboard/report.d.ts.map +1 -0
- package/dist/src/dashboard/report.js +300 -0
- package/dist/src/dashboard/report.js.map +1 -0
- package/dist/src/dashboard/repos.d.ts +58 -0
- package/dist/src/dashboard/repos.d.ts.map +1 -0
- package/dist/src/dashboard/repos.js +111 -0
- package/dist/src/dashboard/repos.js.map +1 -0
- package/dist/src/dashboard/security.d.ts +130 -0
- package/dist/src/dashboard/security.d.ts.map +1 -0
- package/dist/src/dashboard/security.js +144 -0
- package/dist/src/dashboard/security.js.map +1 -0
- package/dist/src/dashboard/server.d.ts +52 -0
- package/dist/src/dashboard/server.d.ts.map +1 -0
- package/dist/src/dashboard/server.js +163 -0
- package/dist/src/dashboard/server.js.map +1 -0
- package/dist/src/dashboard/setup.d.ts +67 -0
- package/dist/src/dashboard/setup.d.ts.map +1 -0
- package/dist/src/dashboard/setup.js +146 -0
- package/dist/src/dashboard/setup.js.map +1 -0
- package/dist/src/dashboard/usage.d.ts +43 -0
- package/dist/src/dashboard/usage.d.ts.map +1 -0
- package/dist/src/dashboard/usage.js +88 -0
- package/dist/src/dashboard/usage.js.map +1 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +48 -2
- package/dist/src/index.js.map +1 -1
- package/dist/src/security/cfn-diff.d.ts +57 -0
- package/dist/src/security/cfn-diff.d.ts.map +1 -0
- package/dist/src/security/cfn-diff.js +112 -0
- package/dist/src/security/cfn-diff.js.map +1 -0
- package/dist/src/security/errors.d.ts +45 -0
- package/dist/src/security/errors.d.ts.map +1 -0
- package/dist/src/security/errors.js +116 -0
- package/dist/src/security/errors.js.map +1 -0
- package/dist/src/security/marker.d.ts +46 -0
- package/dist/src/security/marker.d.ts.map +1 -0
- package/dist/src/security/marker.js +120 -0
- package/dist/src/security/marker.js.map +1 -0
- package/dist/src/security/pentest-dockerfile.d.ts +8 -0
- package/dist/src/security/pentest-dockerfile.d.ts.map +1 -0
- package/dist/src/security/pentest-dockerfile.js +163 -0
- package/dist/src/security/pentest-dockerfile.js.map +1 -0
- package/dist/src/security/pentest.d.ts +233 -0
- package/dist/src/security/pentest.d.ts.map +1 -0
- package/dist/src/security/pentest.js +1057 -0
- package/dist/src/security/pentest.js.map +1 -0
- package/dist/src/security/repo.d.ts +25 -0
- package/dist/src/security/repo.d.ts.map +1 -0
- package/dist/src/security/repo.js +38 -0
- package/dist/src/security/repo.js.map +1 -0
- package/dist/src/security/review.d.ts +202 -0
- package/dist/src/security/review.d.ts.map +1 -0
- package/dist/src/security/review.js +706 -0
- package/dist/src/security/review.js.map +1 -0
- package/dist/src/security/setup.d.ts +193 -0
- package/dist/src/security/setup.d.ts.map +1 -0
- package/dist/src/security/setup.js +728 -0
- package/dist/src/security/setup.js.map +1 -0
- package/dist/src/security/threat-model.d.ts +133 -0
- package/dist/src/security/threat-model.d.ts.map +1 -0
- package/dist/src/security/threat-model.js +653 -0
- package/dist/src/security/threat-model.js.map +1 -0
- package/dist/src/utils/audit-bedrock.d.ts +1 -0
- package/dist/src/utils/audit-bedrock.d.ts.map +1 -1
- package/dist/src/utils/audit-bedrock.js +133 -0
- package/dist/src/utils/audit-bedrock.js.map +1 -1
- package/dist/src/utils/audit-org.d.ts +1 -0
- package/dist/src/utils/audit-org.d.ts.map +1 -1
- package/dist/src/utils/audit-org.js +155 -0
- package/dist/src/utils/audit-org.js.map +1 -1
- package/dist/src/utils/exec.d.ts +6 -0
- package/dist/src/utils/exec.d.ts.map +1 -1
- package/dist/src/utils/exec.js +12 -1
- package/dist/src/utils/exec.js.map +1 -1
- package/dist/src/utils/otel-sync-schedule.d.ts +41 -0
- package/dist/src/utils/otel-sync-schedule.d.ts.map +1 -0
- package/dist/src/utils/otel-sync-schedule.js +90 -0
- package/dist/src/utils/otel-sync-schedule.js.map +1 -0
- package/dist/src/utils/tool-check.d.ts +14 -0
- package/dist/src/utils/tool-check.d.ts.map +1 -0
- package/dist/src/utils/tool-check.js +42 -0
- package/dist/src/utils/tool-check.js.map +1 -0
- package/package.json +3 -2
|
@@ -1,450 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { platform, homedir } from 'node:os';
|
|
3
|
-
import { existsSync, mkdirSync, writeFileSync, readFileSync, unlinkSync } from 'node:fs';
|
|
4
|
-
import { join } from 'node:path';
|
|
5
|
-
import { run, runInteractive } from '../../utils/exec.js';
|
|
6
|
-
import { withPrivateTemp } from '../../utils/tempfile.js';
|
|
7
|
-
function prompt(question, defaultValue) {
|
|
8
|
-
const rl = createInterface({ input: process.stdin, output: process.stdout });
|
|
9
|
-
const suffix = defaultValue ? ` [${defaultValue}]` : '';
|
|
10
|
-
return new Promise((resolve) => {
|
|
11
|
-
rl.question(`${question}${suffix}: `, (answer) => {
|
|
12
|
-
rl.close();
|
|
13
|
-
resolve(answer.trim() || defaultValue || '');
|
|
14
|
-
});
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
// ---- Constants ----
|
|
18
|
-
const CRON_MARKER = '# prism-otel-sync';
|
|
19
|
-
const PLIST_LABEL = 'com.prism.otel-sync';
|
|
20
|
-
const SCHTASK_NAME = 'PrismOtelSync';
|
|
21
|
-
const LOG_DIR = join(homedir(), '.prism', 'logs');
|
|
22
|
-
/** Window the recurring sync pushes on every run. */
|
|
23
|
-
const SYNC_SINCE = '7d';
|
|
24
|
-
// ---- Scheduler helpers per OS ----
|
|
25
|
-
function getCodeburnPath() {
|
|
26
|
-
const result = platform() === 'win32'
|
|
27
|
-
? run('where', ['codeburn'])
|
|
28
|
-
: run('which', ['codeburn']);
|
|
29
|
-
return result.ok ? result.stdout.split('\n')[0].trim() : null;
|
|
30
|
-
}
|
|
1
|
+
import { CODEBURN_OPTIONS, runEnableCodeburn } from '../enable/codeburn.js';
|
|
31
2
|
/**
|
|
32
|
-
*
|
|
3
|
+
* DEPRECATED alias for `prism-cli enable codeburn`.
|
|
33
4
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* Attribution Coverage denominator (CI sees their commits) while contributing
|
|
39
|
-
* nothing to the numerator -- indistinguishable on the dashboard from someone
|
|
40
|
-
* who never onboarded. Any new platform branch must call this.
|
|
5
|
+
* `enable codeburn` is this command under its new name: the same flags, sync
|
|
6
|
+
* setup and schedule, plus a codeburn install when it is missing (after a
|
|
7
|
+
* confirmation), --dry-run, and re-runs that report what is already done. The
|
|
8
|
+
* command is kept so existing scripts and docs keep working.
|
|
41
9
|
*/
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
function linuxScheduleExists() {
|
|
47
|
-
if (!linuxCrontabAvailable())
|
|
48
|
-
return false;
|
|
49
|
-
const result = run('crontab', ['-l']);
|
|
50
|
-
return result.ok && result.stdout.includes(CRON_MARKER);
|
|
51
|
-
}
|
|
52
|
-
function linuxCrontabAvailable() {
|
|
53
|
-
return run('which', ['crontab']).ok;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Single-quotes a value for the crontab line.
|
|
57
|
-
*
|
|
58
|
-
* A crontab entry is interpreted by /bin/sh, so unlike our argv call sites
|
|
59
|
-
* this one genuinely does need quoting -- the shell is the scheduler's, not
|
|
60
|
-
* ours, and we cannot pass it argv. Wrapping in single quotes and encoding any
|
|
61
|
-
* embedded single quote as '\'' is the only form with no escape sequences to
|
|
62
|
-
* get wrong. Paths under a home directory containing a space would otherwise
|
|
63
|
-
* split into two arguments.
|
|
64
|
-
*/
|
|
65
|
-
function shQuote(value) {
|
|
66
|
-
return `'${value.replace(/'/g, `'\\''`)}'`;
|
|
67
|
-
}
|
|
68
|
-
function linuxInstallSchedule(codeburnPath, intervalHours) {
|
|
69
|
-
if (!linuxCrontabAvailable()) {
|
|
70
|
-
console.warn('\n⚠️ crontab not found — skipping automatic schedule installation.');
|
|
71
|
-
console.warn(' Run "codeburn sync push --since 7d" manually, or install cronie:');
|
|
72
|
-
console.warn(' sudo yum install cronie -y # then re-run this command\n');
|
|
73
|
-
return false;
|
|
74
|
-
}
|
|
75
|
-
const existing = run('crontab', ['-l']);
|
|
76
|
-
const lines = existing.ok ? existing.stdout.split('\n').filter(l => !l.includes(CRON_MARKER)) : [];
|
|
77
|
-
const logFile = join(LOG_DIR, 'otel-sync.log');
|
|
78
|
-
const cronExpr = `0 */${intervalHours} * * *`;
|
|
79
|
-
const command = [shQuote(codeburnPath), ...syncArgs(SYNC_SINCE)].join(' ');
|
|
80
|
-
lines.push(`${CRON_MARKER}`);
|
|
81
|
-
lines.push(`${cronExpr} ${command} >> ${shQuote(logFile)} 2>&1`);
|
|
82
|
-
const result = withPrivateTemp('crontab', lines.join('\n') + '\n', f => run('crontab', [f]));
|
|
83
|
-
if (!result.ok)
|
|
84
|
-
throw new Error(`Failed to install crontab: ${result.stderr}`);
|
|
85
|
-
return true;
|
|
86
|
-
}
|
|
87
|
-
function linuxRemoveSchedule() {
|
|
88
|
-
if (!linuxCrontabAvailable())
|
|
89
|
-
return;
|
|
90
|
-
const existing = run('crontab', ['-l']);
|
|
91
|
-
if (!existing.ok)
|
|
92
|
-
return;
|
|
93
|
-
const lines = existing.stdout.split('\n').filter(l => !l.includes(CRON_MARKER) && !l.includes('codeburn sync push'));
|
|
94
|
-
withPrivateTemp('crontab', lines.join('\n') + '\n', f => run('crontab', [f]));
|
|
95
|
-
}
|
|
96
|
-
// ---- macOS: LaunchAgent ----
|
|
97
|
-
function darwinPlistPath() {
|
|
98
|
-
return join(homedir(), 'Library', 'LaunchAgents', `${PLIST_LABEL}.plist`);
|
|
99
|
-
}
|
|
100
|
-
function darwinScheduleExists() {
|
|
101
|
-
return existsSync(darwinPlistPath());
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Escapes a value for use inside a plist <string> element.
|
|
105
|
-
*
|
|
106
|
-
* The plist is generated XML, so a path containing `&` or `<` -- both legal in
|
|
107
|
-
* macOS filenames -- would otherwise produce a malformed document that
|
|
108
|
-
* launchctl refuses to load, reported only as a generic load failure.
|
|
109
|
-
*/
|
|
110
|
-
function xmlEscape(value) {
|
|
111
|
-
return value
|
|
112
|
-
.replace(/&/g, '&')
|
|
113
|
-
.replace(/</g, '<')
|
|
114
|
-
.replace(/>/g, '>');
|
|
115
|
-
}
|
|
116
|
-
function darwinInstallSchedule(codeburnPath, intervalHours) {
|
|
117
|
-
const logFile = join(LOG_DIR, 'otel-sync.log');
|
|
118
|
-
const argElements = [codeburnPath, ...syncArgs(SYNC_SINCE)]
|
|
119
|
-
.map(a => ` <string>${xmlEscape(a)}</string>`)
|
|
120
|
-
.join('\n');
|
|
121
|
-
const plist = `<?xml version="1.0" encoding="UTF-8"?>
|
|
122
|
-
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
|
123
|
-
<plist version="1.0">
|
|
124
|
-
<dict>
|
|
125
|
-
<key>Label</key>
|
|
126
|
-
<string>${PLIST_LABEL}</string>
|
|
127
|
-
<key>ProgramArguments</key>
|
|
128
|
-
<array>
|
|
129
|
-
${argElements}
|
|
130
|
-
</array>
|
|
131
|
-
<key>StartInterval</key>
|
|
132
|
-
<integer>${intervalHours * 3600}</integer>
|
|
133
|
-
<key>StandardOutPath</key>
|
|
134
|
-
<string>${xmlEscape(logFile)}</string>
|
|
135
|
-
<key>StandardErrorPath</key>
|
|
136
|
-
<string>${xmlEscape(logFile)}</string>
|
|
137
|
-
<key>RunAtLoad</key>
|
|
138
|
-
<true/>
|
|
139
|
-
</dict>
|
|
140
|
-
</plist>`;
|
|
141
|
-
const plistPath = darwinPlistPath();
|
|
142
|
-
mkdirSync(join(homedir(), 'Library', 'LaunchAgents'), { recursive: true });
|
|
143
|
-
writeFileSync(plistPath, plist);
|
|
144
|
-
// Unload first so a reinstall replaces rather than conflicts. A missing
|
|
145
|
-
// agent makes this fail, which is expected and ignored -- run() captures
|
|
146
|
-
// stderr rather than leaking it, so no shell redirect is needed.
|
|
147
|
-
run('launchctl', ['unload', plistPath]);
|
|
148
|
-
const result = run('launchctl', ['load', plistPath]);
|
|
149
|
-
if (!result.ok)
|
|
150
|
-
throw new Error(`Failed to load LaunchAgent: ${result.stderr}`);
|
|
151
|
-
}
|
|
152
|
-
function darwinRemoveSchedule() {
|
|
153
|
-
const plistPath = darwinPlistPath();
|
|
154
|
-
if (existsSync(plistPath)) {
|
|
155
|
-
run('launchctl', ['unload', plistPath]);
|
|
156
|
-
unlinkSync(plistPath);
|
|
157
|
-
}
|
|
158
|
-
}
|
|
159
|
-
// ---- Windows: schtasks ----
|
|
160
|
-
function windowsScheduleExists() {
|
|
161
|
-
const result = run('schtasks', ['/query', '/tn', SCHTASK_NAME, '/fo', 'CSV']);
|
|
162
|
-
return result.ok;
|
|
163
|
-
}
|
|
164
|
-
/** Path of the generated batch wrapper the scheduled task invokes. */
|
|
165
|
-
function windowsWrapperPath() {
|
|
166
|
-
return join(homedir(), '.prism', 'otel-sync.cmd');
|
|
167
|
-
}
|
|
168
|
-
/**
|
|
169
|
-
* Installs the Windows scheduled task via a generated .cmd wrapper.
|
|
170
|
-
*
|
|
171
|
-
* The previous version nested the whole command inside schtasks' /tr argument:
|
|
172
|
-
*
|
|
173
|
-
* /tr "cmd /c <codeburnPath> sync push ... >> "<logFile>" 2>&1"
|
|
174
|
-
*
|
|
175
|
-
* and tried to make that legal with cmd.replace(/"/g, '\\"'). That is three
|
|
176
|
-
* quoting layers deep -- our shell, schtasks' own /tr parser, then cmd.exe --
|
|
177
|
-
* and the replacement handled exactly one metacharacter of one of them. It did
|
|
178
|
-
* not escape backslashes, which is not a corner case on Windows: every path
|
|
179
|
-
* here is backslash-separated, so a trailing separator turns the closing \"
|
|
180
|
-
* into an escaped quote and unbalances the argument. cmd.exe also does not
|
|
181
|
-
* treat \" the way that replacement assumes, so the escaping was aimed at the
|
|
182
|
-
* wrong grammar to begin with.
|
|
183
|
-
*
|
|
184
|
-
* Writing the command to a file removes every one of those layers. The task
|
|
185
|
-
* runs one fixed argument -- the wrapper path -- and the redirection lives in
|
|
186
|
-
* a batch file where it needs no escaping at all. This also sidesteps the
|
|
187
|
-
* documented 261-character limit on /tr, which the inlined form could exceed
|
|
188
|
-
* with a long install path.
|
|
189
|
-
*/
|
|
190
|
-
function windowsInstallSchedule(codeburnPath, intervalHours) {
|
|
191
|
-
const logFile = join(LOG_DIR, 'otel-sync.log');
|
|
192
|
-
const args = syncArgs(SYNC_SINCE).join(' ');
|
|
193
|
-
const wrapper = [
|
|
194
|
-
'@echo off',
|
|
195
|
-
'REM Generated by prism-cli bootstrapper setup-otel-sync. Do not edit.',
|
|
196
|
-
`"${codeburnPath}" ${args} >> "${logFile}" 2>&1`,
|
|
197
|
-
'',
|
|
198
|
-
].join('\r\n');
|
|
199
|
-
mkdirSync(join(homedir(), '.prism'), { recursive: true });
|
|
200
|
-
writeFileSync(windowsWrapperPath(), wrapper);
|
|
201
|
-
const result = run('schtasks', [
|
|
202
|
-
'/create',
|
|
203
|
-
'/tn', SCHTASK_NAME,
|
|
204
|
-
'/sc', 'hourly',
|
|
205
|
-
'/mo', String(intervalHours),
|
|
206
|
-
'/tr', windowsWrapperPath(),
|
|
207
|
-
'/f',
|
|
208
|
-
]);
|
|
209
|
-
if (!result.ok)
|
|
210
|
-
throw new Error(`Failed to create scheduled task: ${result.stderr}`);
|
|
211
|
-
}
|
|
212
|
-
function windowsRemoveSchedule() {
|
|
213
|
-
run('schtasks', ['/delete', '/tn', SCHTASK_NAME, '/f']);
|
|
214
|
-
const wrapper = windowsWrapperPath();
|
|
215
|
-
if (existsSync(wrapper))
|
|
216
|
-
unlinkSync(wrapper);
|
|
217
|
-
}
|
|
218
|
-
// ---- Unified scheduler interface ----
|
|
219
|
-
function scheduleExists() {
|
|
220
|
-
switch (platform()) {
|
|
221
|
-
case 'darwin': return darwinScheduleExists();
|
|
222
|
-
case 'win32': return windowsScheduleExists();
|
|
223
|
-
default: return linuxScheduleExists();
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
function installSchedule(codeburnPath, intervalHours) {
|
|
227
|
-
mkdirSync(LOG_DIR, { recursive: true });
|
|
228
|
-
switch (platform()) {
|
|
229
|
-
case 'darwin':
|
|
230
|
-
darwinInstallSchedule(codeburnPath, intervalHours);
|
|
231
|
-
return true;
|
|
232
|
-
case 'win32':
|
|
233
|
-
windowsInstallSchedule(codeburnPath, intervalHours);
|
|
234
|
-
return true;
|
|
235
|
-
default: return linuxInstallSchedule(codeburnPath, intervalHours);
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
function removeSchedule() {
|
|
239
|
-
switch (platform()) {
|
|
240
|
-
case 'darwin': return darwinRemoveSchedule();
|
|
241
|
-
case 'win32': return windowsRemoveSchedule();
|
|
242
|
-
default: return linuxRemoveSchedule();
|
|
243
|
-
}
|
|
244
|
-
}
|
|
245
|
-
function schedulerName() {
|
|
246
|
-
switch (platform()) {
|
|
247
|
-
case 'darwin': return 'LaunchAgent';
|
|
248
|
-
case 'win32': return 'Scheduled Task';
|
|
249
|
-
default: return 'crontab';
|
|
250
|
-
}
|
|
251
|
-
}
|
|
252
|
-
// ---- Status ----
|
|
253
|
-
function showStatus(codeburnPath) {
|
|
254
|
-
console.log('\n📊 OTEL Sync Status\n');
|
|
255
|
-
// Codeburn installed?
|
|
256
|
-
if (codeburnPath) {
|
|
257
|
-
console.log(` ✓ codeburn found: ${codeburnPath}`);
|
|
258
|
-
const ver = run(codeburnPath, ['--version']);
|
|
259
|
-
if (ver.ok)
|
|
260
|
-
console.log(` version: ${ver.stdout}`);
|
|
261
|
-
}
|
|
262
|
-
else {
|
|
263
|
-
console.log(' ✗ codeburn not found in PATH');
|
|
264
|
-
}
|
|
265
|
-
// Sync configured?
|
|
266
|
-
const configPath = join(homedir(), '.config', 'codeburn', 'sync.json');
|
|
267
|
-
if (existsSync(configPath)) {
|
|
268
|
-
try {
|
|
269
|
-
const cfg = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
270
|
-
console.log(` ✓ sync configured: ${cfg.baseUrl || cfg.endpoint || cfg.url || '(configured)'}`);
|
|
271
|
-
}
|
|
272
|
-
catch {
|
|
273
|
-
console.log(` ✓ sync config exists: ${configPath}`);
|
|
274
|
-
}
|
|
275
|
-
}
|
|
276
|
-
else {
|
|
277
|
-
console.log(' ✗ sync not configured (run setup first)');
|
|
278
|
-
}
|
|
279
|
-
// Schedule exists?
|
|
280
|
-
if (scheduleExists()) {
|
|
281
|
-
console.log(` ✓ ${schedulerName()} schedule active`);
|
|
282
|
-
}
|
|
283
|
-
else {
|
|
284
|
-
console.log(` ✗ no ${schedulerName()} schedule found`);
|
|
285
|
-
}
|
|
286
|
-
// Last log?
|
|
287
|
-
const logFile = join(LOG_DIR, 'otel-sync.log');
|
|
288
|
-
if (existsSync(logFile)) {
|
|
289
|
-
// Read in process rather than shelling out to tail, which does not exist
|
|
290
|
-
// on Windows -- the platform this command explicitly supports. The old
|
|
291
|
-
// `tail -5` silently produced no output there, making a working schedule
|
|
292
|
-
// look like it had never run.
|
|
293
|
-
const tail = readFileSync(logFile, 'utf8').split('\n').filter(Boolean).slice(-5);
|
|
294
|
-
if (tail.length) {
|
|
295
|
-
console.log(` Last sync output (${logFile}):`);
|
|
296
|
-
for (const line of tail) {
|
|
297
|
-
console.log(` ${line}`);
|
|
298
|
-
}
|
|
299
|
-
}
|
|
300
|
-
}
|
|
301
|
-
console.log('');
|
|
302
|
-
}
|
|
303
|
-
// ---- Main ----
|
|
10
|
+
export const DEPRECATION = [
|
|
11
|
+
'⚠ "prism-cli bootstrapper setup-otel-sync" is deprecated; use "prism-cli enable codeburn".',
|
|
12
|
+
' It takes the same flags, and also installs codeburn when missing (asks first; --yes skips the prompt).',
|
|
13
|
+
];
|
|
304
14
|
export default {
|
|
305
|
-
description: '
|
|
306
|
-
options:
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
const codeburnPath = getCodeburnPath();
|
|
314
|
-
// --status
|
|
315
|
-
if (opts.status) {
|
|
316
|
-
showStatus(codeburnPath);
|
|
317
|
-
return;
|
|
318
|
-
}
|
|
319
|
-
// --remove
|
|
320
|
-
if (opts.remove) {
|
|
321
|
-
if (scheduleExists()) {
|
|
322
|
-
removeSchedule();
|
|
323
|
-
console.log(`\n ✓ ${schedulerName()} schedule removed.\n`);
|
|
324
|
-
}
|
|
325
|
-
else {
|
|
326
|
-
console.log(`\n No ${schedulerName()} schedule found — nothing to remove.\n`);
|
|
327
|
-
}
|
|
328
|
-
return;
|
|
329
|
-
}
|
|
330
|
-
// ---- Setup flow ----
|
|
331
|
-
console.log('\n🔄 OTEL Sync Setup\n');
|
|
332
|
-
console.log('This will configure automated codeburn telemetry sync to your PRISM');
|
|
333
|
-
console.log('OTEL collector. Runs every 12 hours to keep dashboards fresh.\n');
|
|
334
|
-
// 1. Check codeburn version
|
|
335
|
-
if (!codeburnPath) {
|
|
336
|
-
console.error('Error: codeburn not found. Install with: npm install -g codeburn');
|
|
337
|
-
process.exit(1);
|
|
338
|
-
}
|
|
339
|
-
const verResult = run(codeburnPath, ['--version']);
|
|
340
|
-
if (verResult.ok) {
|
|
341
|
-
const ver = verResult.stdout.replace(/[^0-9.]/g, '');
|
|
342
|
-
const parts = ver.split('.').map(Number);
|
|
343
|
-
if (parts[0] === 0 && parts[1] < 9 || (parts[1] === 9 && parts[2] < 16)) {
|
|
344
|
-
console.error(`Error: codeburn >= 0.9.16 required (found ${ver}). Run: npm update -g codeburn`);
|
|
345
|
-
process.exit(1);
|
|
346
|
-
}
|
|
347
|
-
console.log(` ✓ codeburn ${ver}`);
|
|
348
|
-
}
|
|
349
|
-
// 2. Get the OTEL collector URL
|
|
350
|
-
const otelUrl = opts.url || await prompt('OTEL collector URL (from CDK deploy output OtelCollectorUrl)');
|
|
351
|
-
if (!otelUrl) {
|
|
352
|
-
console.error('Error: OTEL collector URL is required.');
|
|
353
|
-
process.exit(1);
|
|
354
|
-
}
|
|
355
|
-
// Reject anything that is not a real http(s) URL before it is persisted
|
|
356
|
-
// into codeburn's sync config, where a malformed value surfaces later as an
|
|
357
|
-
// opaque push failure from the scheduled job rather than here.
|
|
358
|
-
try {
|
|
359
|
-
const parsed = new URL(otelUrl);
|
|
360
|
-
if (parsed.protocol !== 'https:' && parsed.protocol !== 'http:') {
|
|
361
|
-
throw new Error('unsupported protocol');
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
catch {
|
|
365
|
-
console.error(`Error: "${otelUrl}" is not a valid http(s) URL.`);
|
|
366
|
-
console.error(' Expected the OtelCollectorUrl value from the CDK stack outputs.');
|
|
367
|
-
process.exit(1);
|
|
368
|
-
}
|
|
369
|
-
// 3. Check if codeburn sync is already configured for this URL
|
|
370
|
-
const configPath = join(homedir(), '.config', 'codeburn', 'sync.json');
|
|
371
|
-
let needsSetup = true;
|
|
372
|
-
if (existsSync(configPath)) {
|
|
373
|
-
try {
|
|
374
|
-
const cfg = JSON.parse(readFileSync(configPath, 'utf8'));
|
|
375
|
-
const existingUrl = cfg.baseUrl || cfg.endpoint || cfg.url || '';
|
|
376
|
-
if (existingUrl === otelUrl || existingUrl.startsWith(otelUrl)) {
|
|
377
|
-
console.log(` ✓ codeburn sync already configured for this endpoint.`);
|
|
378
|
-
needsSetup = false;
|
|
379
|
-
}
|
|
380
|
-
else {
|
|
381
|
-
console.log(` ⚠ codeburn sync configured for different endpoint: ${existingUrl}`);
|
|
382
|
-
const override = await prompt('Reconfigure for the new URL? (y/N)', 'N');
|
|
383
|
-
if (override.toLowerCase() !== 'y') {
|
|
384
|
-
console.log(' Keeping existing configuration.');
|
|
385
|
-
needsSetup = false;
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
catch {
|
|
390
|
-
// Corrupt config — re-setup
|
|
391
|
-
}
|
|
392
|
-
}
|
|
393
|
-
// 4. Run codeburn sync setup (opens browser for OIDC)
|
|
394
|
-
if (needsSetup) {
|
|
395
|
-
console.log('\n Running: codeburn sync setup ' + otelUrl);
|
|
396
|
-
console.log(' (This will open a browser for OIDC authentication)\n');
|
|
397
|
-
// argv, not a command string: otelUrl comes straight from prompt() and
|
|
398
|
-
// previously reached execSync as shell source.
|
|
399
|
-
if (runInteractive(codeburnPath, ['sync', 'setup', otelUrl])) {
|
|
400
|
-
console.log('\n ✓ codeburn sync configured.');
|
|
401
|
-
}
|
|
402
|
-
else {
|
|
403
|
-
console.error(`\n ✗ codeburn sync setup failed. Ensure Cognito user exists and try again.`);
|
|
404
|
-
process.exit(1);
|
|
405
|
-
}
|
|
406
|
-
}
|
|
407
|
-
// 5. Initial backfill push (30d — server drops >14d from CloudWatch, keeps in DDB/S3)
|
|
408
|
-
console.log('\n Pushing initial backfill (last 30 days of telemetry)...');
|
|
409
|
-
const backfill = run(codeburnPath, syncArgs('30d'));
|
|
410
|
-
if (backfill.ok) {
|
|
411
|
-
console.log(' ✓ Backfill push complete.');
|
|
412
|
-
if (backfill.stdout)
|
|
413
|
-
console.log(` ${backfill.stdout.split('\n').slice(-1)[0]}`);
|
|
414
|
-
}
|
|
415
|
-
else {
|
|
416
|
-
console.log(` ⚠ Backfill push failed (non-fatal): ${backfill.stderr.split('\n')[0]}`);
|
|
417
|
-
console.log(' The schedule will retry. Check ~/.prism/logs/otel-sync.log');
|
|
418
|
-
}
|
|
419
|
-
// 6. Install OS schedule
|
|
420
|
-
const intervalHours = opts.interval ? parseInt(opts.interval, 10) : 12;
|
|
421
|
-
if (isNaN(intervalHours) || intervalHours < 1) {
|
|
422
|
-
console.error('Error: --interval must be a positive integer (hours).');
|
|
423
|
-
process.exit(1);
|
|
424
|
-
}
|
|
425
|
-
if (scheduleExists()) {
|
|
426
|
-
console.log(`\n ✓ ${schedulerName()} schedule already exists — updating.`);
|
|
427
|
-
removeSchedule();
|
|
428
|
-
}
|
|
429
|
-
const scheduled = installSchedule(codeburnPath, intervalHours);
|
|
430
|
-
if (scheduled) {
|
|
431
|
-
console.log(` ✓ ${schedulerName()} schedule installed (every ${intervalHours}h).`);
|
|
432
|
-
}
|
|
433
|
-
// Summary
|
|
434
|
-
console.log('\n════════════════════════════════════════════════');
|
|
435
|
-
console.log(' ✅ OTEL sync setup complete!');
|
|
436
|
-
console.log('════════════════════════════════════════════════');
|
|
437
|
-
console.log(`\n Endpoint: ${otelUrl}`);
|
|
438
|
-
if (scheduled) {
|
|
439
|
-
console.log(` Schedule: every ${intervalHours}h via ${schedulerName()}`);
|
|
440
|
-
}
|
|
441
|
-
else {
|
|
442
|
-
console.log(` Schedule: ⚠️ not installed (run manually: codeburn sync push --since 7d)`);
|
|
443
|
-
}
|
|
444
|
-
console.log(` Backfill: last 30d pushed (dashboard shows last 14d)`);
|
|
445
|
-
console.log(` Logs: ${join(LOG_DIR, 'otel-sync.log')}`);
|
|
446
|
-
console.log(`\n Run \`prism-cli bootstrapper setup-otel-sync --status\` to check health.`);
|
|
447
|
-
console.log(` Run \`prism-cli bootstrapper setup-otel-sync --remove\` to uninstall.\n`);
|
|
15
|
+
description: '[deprecated] Alias for "prism-cli enable codeburn"',
|
|
16
|
+
options: CODEBURN_OPTIONS,
|
|
17
|
+
/** Errors are handled once, in runEnableCodeburn, for this alias too. `hooks` is for tests. */
|
|
18
|
+
async action(opts, hooks) {
|
|
19
|
+
for (const l of DEPRECATION)
|
|
20
|
+
console.warn(l);
|
|
21
|
+
console.warn('');
|
|
22
|
+
await runEnableCodeburn(opts, hooks);
|
|
448
23
|
},
|
|
449
24
|
};
|
|
450
25
|
//# sourceMappingURL=setup-otel-sync.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setup-otel-sync.js","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/setup-otel-sync.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"setup-otel-sync.js","sourceRoot":"","sources":["../../../../src/commands/bootstrapper/setup-otel-sync.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAA4C,MAAM,uBAAuB,CAAC;AAEtH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,6FAA6F;IAC7F,2GAA2G;CAC5G,CAAC;AAEF,eAAe;IACb,WAAW,EAAE,oDAAoD;IACjE,OAAO,EAAE,gBAAgB;IACzB,+FAA+F;IAC/F,KAAK,CAAC,MAAM,CAAC,IAAqB,EAAE,KAAqB;QACvD,KAAK,MAAM,CAAC,IAAI,WAAW;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,MAAM,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACvC,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-commit.d.ts","sourceRoot":"","sources":["../../../../src/commands/codewatch/pre-commit.ts"],"names":[],"mappings":"AAIA,+EAA+E;;;;;AAC/E,wBAoBE"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { run } from '../../utils/exec.js';
|
|
2
|
+
import { gitleaksInstallHint, runPreCommit } from '../../codewatch/gitleaks.js';
|
|
3
|
+
import { REASON_GITLEAKS_MISSING } from '../../codewatch/results.js';
|
|
4
|
+
/** Called by the pre-commit hook installed by `prism-cli enable codewatch`. */
|
|
5
|
+
export default {
|
|
6
|
+
description: 'pre-commit hook: gitleaks scan of staged changes (blocks on a finding; installed by enable codewatch)',
|
|
7
|
+
action() {
|
|
8
|
+
const top = run('git', ['rev-parse', '--show-toplevel']);
|
|
9
|
+
if (!top.ok)
|
|
10
|
+
process.exit(0);
|
|
11
|
+
const out = runPreCommit(top.stdout);
|
|
12
|
+
const r = out.result;
|
|
13
|
+
if (r.status === 'findings') {
|
|
14
|
+
console.error(`prism: gitleaks found ${r.findings.length} secret(s) in the staged changes. Commit blocked.`);
|
|
15
|
+
for (const f of r.findings.slice(0, 10))
|
|
16
|
+
console.error(` [${f.rule}] ${f.file}${f.line ? `:${f.line}` : ''}`);
|
|
17
|
+
console.error('prism: remove it (and rotate it if it is real), allowlist a false positive in .gitleaks.toml,');
|
|
18
|
+
console.error(' or bypass once with git commit --no-verify (recorded as skipped at push time).');
|
|
19
|
+
}
|
|
20
|
+
else if (r.status === 'skipped' && r.reason === REASON_GITLEAKS_MISSING) {
|
|
21
|
+
console.error('prism: WARNING: secret scanning is off -- gitleaks is not installed. This commit was NOT scanned.');
|
|
22
|
+
console.error(`prism: install gitleaks: ${gitleaksInstallHint()}`);
|
|
23
|
+
}
|
|
24
|
+
else if (r.status === 'error') {
|
|
25
|
+
console.error(`prism: ${r.reason}${out.exitCode ? ' Commit blocked; fix the scan or bypass with --no-verify.' : ''}`);
|
|
26
|
+
}
|
|
27
|
+
process.exit(out.exitCode);
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=pre-commit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-commit.js","sourceRoot":"","sources":["../../../../src/commands/codewatch/pre-commit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChF,OAAO,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAErE,+EAA+E;AAC/E,eAAe;IACb,WAAW,EAAE,uGAAuG;IACpH,MAAM;QACJ,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACzD,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,GAAG,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC;QACrB,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,yBAAyB,CAAC,CAAC,QAAQ,CAAC,MAAM,mDAAmD,CAAC,CAAC;YAC7G,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;gBAAE,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC/G,OAAO,CAAC,KAAK,CAAC,+FAA+F,CAAC,CAAC;YAC/G,OAAO,CAAC,KAAK,CAAC,uFAAuF,CAAC,CAAC;QACzG,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,CAAC,MAAM,KAAK,uBAAuB,EAAE,CAAC;YAC1E,OAAO,CAAC,KAAK,CAAC,mGAAmG,CAAC,CAAC;YACnH,OAAO,CAAC,KAAK,CAAC,4BAA4B,mBAAmB,EAAE,EAAE,CAAC,CAAC;QACrE,CAAC;aAAM,IAAI,CAAC,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YAChC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,2DAA2D,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACxH,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Called by the pre-push hook installed by `prism-cli enable codewatch`.
|
|
3
|
+
* Report only: exits 0 whatever happens.
|
|
4
|
+
*/
|
|
5
|
+
declare const _default: {
|
|
6
|
+
description: string;
|
|
7
|
+
options: {
|
|
8
|
+
flags: string;
|
|
9
|
+
description: string;
|
|
10
|
+
}[];
|
|
11
|
+
action(opts: {
|
|
12
|
+
remote?: string;
|
|
13
|
+
}): never;
|
|
14
|
+
};
|
|
15
|
+
export default _default;
|
|
16
|
+
//# sourceMappingURL=pre-push.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-push.d.ts","sourceRoot":"","sources":["../../../../src/commands/codewatch/pre-push.ts"],"names":[],"mappings":"AAIA;;;GAGG;;;;;;;iBAIY;QAAE,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;;AAHlC,wBAgBE"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { readFileSync } from 'node:fs';
|
|
2
|
+
import { run } from '../../utils/exec.js';
|
|
3
|
+
import { runPrePush } from '../../codewatch/prepush.js';
|
|
4
|
+
/**
|
|
5
|
+
* Called by the pre-push hook installed by `prism-cli enable codewatch`.
|
|
6
|
+
* Report only: exits 0 whatever happens.
|
|
7
|
+
*/
|
|
8
|
+
export default {
|
|
9
|
+
description: 'pre-push hook: report-only code review of the branch diff (never blocks; installed by enable codewatch)',
|
|
10
|
+
options: [{ flags: '--remote <name>', description: 'Remote being pushed to (git passes it to the hook)' }],
|
|
11
|
+
action(opts) {
|
|
12
|
+
try {
|
|
13
|
+
const top = run('git', ['rev-parse', '--show-toplevel']);
|
|
14
|
+
if (top.ok) {
|
|
15
|
+
let stdin = '';
|
|
16
|
+
try {
|
|
17
|
+
stdin = readFileSync(0, 'utf8');
|
|
18
|
+
}
|
|
19
|
+
catch { /* no stdin */ }
|
|
20
|
+
runPrePush({ repoRoot: top.stdout, stdin, remote: opts.remote || null });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
try {
|
|
25
|
+
process.stderr.write(`prism: pre-push review failed (${e?.message || e}). Push continues.\n`);
|
|
26
|
+
}
|
|
27
|
+
catch { /* ignore */ }
|
|
28
|
+
}
|
|
29
|
+
process.exit(0);
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
//# sourceMappingURL=pre-push.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pre-push.js","sourceRoot":"","sources":["../../../../src/commands/codewatch/pre-push.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,MAAM,qBAAqB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AAExD;;;GAGG;AACH,eAAe;IACb,WAAW,EAAE,yGAAyG;IACtH,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,oDAAoD,EAAE,CAAC;IAC1G,MAAM,CAAC,IAAyB;QAC9B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,CAAC;YACzD,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;gBACX,IAAI,KAAK,GAAG,EAAE,CAAC;gBACf,IAAI,CAAC;oBAAC,KAAK,GAAG,YAAY,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;gBAAC,CAAC;gBAAC,MAAM,CAAC,CAAC,cAAc,CAAC,CAAC;gBACjE,UAAU,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC;gBAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,kCAAkC,CAAC,EAAE,OAAO,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAAC,CAAC;YAAC,MAAM,CAAC,CAAC,YAAY,CAAC,CAAC;QAC/H,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/** Writes a scan report without the dashboard server. Same content as GET /report/<id>. */
|
|
2
|
+
declare const _default: {
|
|
3
|
+
description: string;
|
|
4
|
+
options: ({
|
|
5
|
+
flags: string;
|
|
6
|
+
description: string;
|
|
7
|
+
default?: undefined;
|
|
8
|
+
} | {
|
|
9
|
+
flags: string;
|
|
10
|
+
description: string;
|
|
11
|
+
default: string;
|
|
12
|
+
})[];
|
|
13
|
+
action(opts: {
|
|
14
|
+
repo?: string;
|
|
15
|
+
id?: string;
|
|
16
|
+
commit?: string;
|
|
17
|
+
format?: string;
|
|
18
|
+
output?: string;
|
|
19
|
+
}): undefined;
|
|
20
|
+
};
|
|
21
|
+
export default _default;
|
|
22
|
+
//# sourceMappingURL=report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.d.ts","sourceRoot":"","sources":["../../../../src/commands/codewatch/report.ts"],"names":[],"mappings":"AAWA,2FAA2F;;;;;;;;;;;;iBAU5E;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE;;AAThG,wBA8CE"}
|