@prism-d1/cli 1.0.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/bin/prism-cli.d.ts +3 -0
- package/dist/bin/prism-cli.d.ts.map +1 -0
- package/dist/bin/prism-cli.js +10 -0
- package/dist/bin/prism-cli.js.map +1 -0
- package/dist/src/commands/assessment/deploy-cdk.d.ts +22 -0
- package/dist/src/commands/assessment/deploy-cdk.d.ts.map +1 -0
- package/dist/src/commands/assessment/deploy-cdk.js +59 -0
- package/dist/src/commands/assessment/deploy-cdk.js.map +1 -0
- package/dist/src/commands/assessment/interview-agent.d.ts +71 -0
- package/dist/src/commands/assessment/interview-agent.d.ts.map +1 -0
- package/dist/src/commands/assessment/interview-agent.js +648 -0
- package/dist/src/commands/assessment/interview-agent.js.map +1 -0
- package/dist/src/commands/assessment/run.d.ts +20 -0
- package/dist/src/commands/assessment/run.d.ts.map +1 -0
- package/dist/src/commands/assessment/run.js +23 -0
- package/dist/src/commands/assessment/run.js.map +1 -0
- package/dist/src/commands/assessment/web.d.ts +15 -0
- package/dist/src/commands/assessment/web.d.ts.map +1 -0
- package/dist/src/commands/assessment/web.js +1393 -0
- package/dist/src/commands/assessment/web.js.map +1 -0
- package/dist/src/commands/bootstrapper/install-eval-harness.d.ts +15 -0
- package/dist/src/commands/bootstrapper/install-eval-harness.d.ts.map +1 -0
- package/dist/src/commands/bootstrapper/install-eval-harness.js +99 -0
- package/dist/src/commands/bootstrapper/install-eval-harness.js.map +1 -0
- package/dist/src/commands/bootstrapper/install-git-hooks.d.ts +15 -0
- package/dist/src/commands/bootstrapper/install-git-hooks.d.ts.map +1 -0
- package/dist/src/commands/bootstrapper/install-git-hooks.js +141 -0
- package/dist/src/commands/bootstrapper/install-git-hooks.js.map +1 -0
- package/dist/src/commands/bootstrapper/setup-github-oidc.d.ts +6 -0
- package/dist/src/commands/bootstrapper/setup-github-oidc.d.ts.map +1 -0
- package/dist/src/commands/bootstrapper/setup-github-oidc.js +157 -0
- package/dist/src/commands/bootstrapper/setup-github-oidc.js.map +1 -0
- package/dist/src/commands/securityagent/setup.d.ts +14 -0
- package/dist/src/commands/securityagent/setup.d.ts.map +1 -0
- package/dist/src/commands/securityagent/setup.js +113 -0
- package/dist/src/commands/securityagent/setup.js.map +1 -0
- package/dist/src/commands/workshop/deploy-infra.d.ts +13 -0
- package/dist/src/commands/workshop/deploy-infra.d.ts.map +1 -0
- package/dist/src/commands/workshop/deploy-infra.js +73 -0
- package/dist/src/commands/workshop/deploy-infra.js.map +1 -0
- package/dist/src/commands/workshop/generate-demo-data.d.ts +16 -0
- package/dist/src/commands/workshop/generate-demo-data.d.ts.map +1 -0
- package/dist/src/commands/workshop/generate-demo-data.js +362 -0
- package/dist/src/commands/workshop/generate-demo-data.js.map +1 -0
- package/dist/src/commands/workshop/perform-pen-test.d.ts +14 -0
- package/dist/src/commands/workshop/perform-pen-test.d.ts.map +1 -0
- package/dist/src/commands/workshop/perform-pen-test.js +301 -0
- package/dist/src/commands/workshop/perform-pen-test.js.map +1 -0
- package/dist/src/commands/workshop/run-agent.d.ts +20 -0
- package/dist/src/commands/workshop/run-agent.d.ts.map +1 -0
- package/dist/src/commands/workshop/run-agent.js +89 -0
- package/dist/src/commands/workshop/run-agent.js.map +1 -0
- package/dist/src/commands/workshop/verify-setup.d.ts +14 -0
- package/dist/src/commands/workshop/verify-setup.d.ts.map +1 -0
- package/dist/src/commands/workshop/verify-setup.js +493 -0
- package/dist/src/commands/workshop/verify-setup.js.map +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +44 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/scanner/categories.d.ts +8 -0
- package/dist/src/scanner/categories.d.ts.map +1 -0
- package/dist/src/scanner/categories.js +322 -0
- package/dist/src/scanner/categories.js.map +1 -0
- package/dist/src/scanner/index.d.ts +16 -0
- package/dist/src/scanner/index.d.ts.map +1 -0
- package/dist/src/scanner/index.js +59 -0
- package/dist/src/scanner/index.js.map +1 -0
- package/dist/src/scanner/reporter.d.ts +3 -0
- package/dist/src/scanner/reporter.d.ts.map +1 -0
- package/dist/src/scanner/reporter.js +102 -0
- package/dist/src/scanner/reporter.js.map +1 -0
- package/dist/src/scanner/scoring.d.ts +7 -0
- package/dist/src/scanner/scoring.d.ts.map +1 -0
- package/dist/src/scanner/scoring.js +77 -0
- package/dist/src/scanner/scoring.js.map +1 -0
- package/dist/src/scanner/types.d.ts +41 -0
- package/dist/src/scanner/types.d.ts.map +1 -0
- package/dist/src/scanner/types.js +2 -0
- package/dist/src/scanner/types.js.map +1 -0
- package/dist/src/scanner/utils.d.ts +16 -0
- package/dist/src/scanner/utils.d.ts.map +1 -0
- package/dist/src/scanner/utils.js +54 -0
- package/dist/src/scanner/utils.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve, dirname } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const INFRA_DIR = resolve(__dirname, '../../../../infra');
|
|
7
|
+
function runCapture(cmd) {
|
|
8
|
+
try {
|
|
9
|
+
return { ok: true, stdout: execSync(cmd, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'], env: { ...process.env, AWS_PAGER: '' } }).trim() };
|
|
10
|
+
}
|
|
11
|
+
catch (err) {
|
|
12
|
+
return { ok: false, stdout: (err.stdout || err.stderr || err.message || '').trim() };
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function cleanEnv() {
|
|
16
|
+
const env = { ...process.env };
|
|
17
|
+
Object.keys(env).filter(k => k.startsWith('npm_')).forEach(k => delete env[k]);
|
|
18
|
+
return env;
|
|
19
|
+
}
|
|
20
|
+
function run(cmd, opts = {}) {
|
|
21
|
+
try {
|
|
22
|
+
execSync(cmd, { encoding: 'utf8', stdio: 'inherit', cwd: INFRA_DIR, env: cleanEnv(), ...opts });
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return false;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
export default {
|
|
30
|
+
description: 'Deploy Security Agent infrastructure and create web console application',
|
|
31
|
+
options: [
|
|
32
|
+
{ flags: '--profile <name>', description: 'AWS CLI profile', default: process.env.AWS_PROFILE || '' },
|
|
33
|
+
{ flags: '--region <region>', description: 'AWS region', default: 'us-west-2' },
|
|
34
|
+
],
|
|
35
|
+
action(options) {
|
|
36
|
+
const { profile, region } = options;
|
|
37
|
+
const env = `${profile ? `--profile ${profile} ` : ''}--region ${region}`;
|
|
38
|
+
// Deploy CDK with security agent enabled
|
|
39
|
+
console.log('🚀 Deploying Security Agent infrastructure...');
|
|
40
|
+
if (!existsSync(resolve(INFRA_DIR, 'node_modules'))) {
|
|
41
|
+
console.log(' Installing CDK dependencies...');
|
|
42
|
+
if (!run('npm install')) {
|
|
43
|
+
console.error('npm install failed.');
|
|
44
|
+
process.exit(1);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
const cdkBin = resolve(INFRA_DIR, 'node_modules/.bin/cdk');
|
|
48
|
+
const account = runCapture(`aws sts get-caller-identity ${profile ? `--profile ${profile} ` : ''}--query Account --output text`);
|
|
49
|
+
if (!account.ok) {
|
|
50
|
+
console.error('Failed to get account ID. Check your AWS credentials.');
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
const cdkEnv = {
|
|
54
|
+
...cleanEnv(),
|
|
55
|
+
CDK_DEFAULT_ACCOUNT: account.stdout,
|
|
56
|
+
CDK_DEFAULT_REGION: region,
|
|
57
|
+
AWS_DEFAULT_REGION: region,
|
|
58
|
+
};
|
|
59
|
+
if (!run(`${cdkBin} deploy --all --require-approval never --context enableSecurityAgent=true`, { env: cdkEnv })) {
|
|
60
|
+
console.error('CDK deploy failed.');
|
|
61
|
+
process.exit(1);
|
|
62
|
+
}
|
|
63
|
+
console.log(' ✅ Infrastructure deployed\n');
|
|
64
|
+
// Get agent space ID
|
|
65
|
+
console.log('🔍 Looking up agent space...');
|
|
66
|
+
const spaces = runCapture(`aws securityagent list-agent-spaces ${env} --output json`);
|
|
67
|
+
if (!spaces.ok) {
|
|
68
|
+
console.error(`Failed to list agent spaces: ${spaces.stdout}`);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
const spaceList = JSON.parse(spaces.stdout).agentSpaceSummaries || [];
|
|
72
|
+
if (spaceList.length === 0) {
|
|
73
|
+
console.error('No agent spaces found. Run deploy-infra first.');
|
|
74
|
+
process.exit(1);
|
|
75
|
+
}
|
|
76
|
+
const agentSpaceId = spaceList[0].agentSpaceId;
|
|
77
|
+
console.log(` Agent Space: ${agentSpaceId}`);
|
|
78
|
+
// Check if application already exists
|
|
79
|
+
console.log('🔍 Checking for existing application...');
|
|
80
|
+
const apps = runCapture(`aws securityagent list-applications ${env} --output json`);
|
|
81
|
+
let applicationId;
|
|
82
|
+
if (apps.ok && JSON.parse(apps.stdout).applicationSummaries?.length > 0) {
|
|
83
|
+
applicationId = JSON.parse(apps.stdout).applicationSummaries[0].applicationId;
|
|
84
|
+
console.log(` Application already exists: ${applicationId}`);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
// Create application
|
|
88
|
+
console.log('📦 Creating application...');
|
|
89
|
+
const create = runCapture(`aws securityagent create-application ${env} --output json`);
|
|
90
|
+
if (!create.ok) {
|
|
91
|
+
console.error(`Failed to create application: ${create.stdout}`);
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
applicationId = JSON.parse(create.stdout).applicationId;
|
|
95
|
+
console.log(` ✅ Created application: ${applicationId}`);
|
|
96
|
+
}
|
|
97
|
+
// Get service role ARN
|
|
98
|
+
const roleArn = `arn:aws:iam::${account.stdout}:role/prism-d1-security-agent-prism-d1-security`;
|
|
99
|
+
// Update application with role
|
|
100
|
+
console.log('🔧 Configuring application role...');
|
|
101
|
+
const update = runCapture(`aws securityagent update-application --application-id ${applicationId} --role-arn ${roleArn} ${env} --output json`);
|
|
102
|
+
if (!update.ok) {
|
|
103
|
+
console.error(`Failed to update application: ${update.stdout}`);
|
|
104
|
+
process.exit(1);
|
|
105
|
+
}
|
|
106
|
+
console.log(` ✅ Role attached: ${roleArn}`);
|
|
107
|
+
console.log('\n✅ Setup complete!');
|
|
108
|
+
console.log(` Application: ${applicationId}`);
|
|
109
|
+
console.log(` Web console: https://${region}.console.aws.amazon.com/securityagent/home?region=${region}`);
|
|
110
|
+
console.log(' Click "Admin access" to open the web app.');
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../../../src/commands/securityagent/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
description: string;
|
|
3
|
+
options: {
|
|
4
|
+
flags: string;
|
|
5
|
+
description: string;
|
|
6
|
+
default: string;
|
|
7
|
+
}[];
|
|
8
|
+
action(options: {
|
|
9
|
+
requireApproval: string;
|
|
10
|
+
}): void;
|
|
11
|
+
};
|
|
12
|
+
export default _default;
|
|
13
|
+
//# sourceMappingURL=deploy-infra.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-infra.d.ts","sourceRoot":"","sources":["../../../../src/commands/workshop/deploy-infra.ts"],"names":[],"mappings":";;;;;;;oBA+BkB;QAAE,eAAe,EAAE,MAAM,CAAA;KAAE;;AAL7C,wBAmDE"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { existsSync } from 'node:fs';
|
|
3
|
+
import { resolve, dirname } from 'node:path';
|
|
4
|
+
import { fileURLToPath } from 'node:url';
|
|
5
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
6
|
+
const INFRA_DIR = resolve(__dirname, '../../../../infra');
|
|
7
|
+
function run(cmd, opts = {}) {
|
|
8
|
+
try {
|
|
9
|
+
execSync(cmd, { encoding: 'utf8', stdio: 'inherit', cwd: INFRA_DIR, ...opts });
|
|
10
|
+
return true;
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function runCapture(cmd) {
|
|
17
|
+
try {
|
|
18
|
+
const stdout = execSync(cmd, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'], cwd: INFRA_DIR }).trim();
|
|
19
|
+
return { ok: true, stdout };
|
|
20
|
+
}
|
|
21
|
+
catch (err) {
|
|
22
|
+
return { ok: false, stderr: (err.stderr || err.message || '').trim() };
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
export default {
|
|
26
|
+
description: 'Deploy workshop infrastructure via CDK (bootstraps if needed)',
|
|
27
|
+
options: [
|
|
28
|
+
{ flags: '--require-approval <type>', description: 'CDK approval level (never, broadening, any-change)', default: 'never' },
|
|
29
|
+
],
|
|
30
|
+
action(options) {
|
|
31
|
+
if (!existsSync(INFRA_DIR)) {
|
|
32
|
+
console.error(`Error: infra directory not found at ${INFRA_DIR}`);
|
|
33
|
+
process.exit(1);
|
|
34
|
+
}
|
|
35
|
+
// Ensure dependencies are installed
|
|
36
|
+
if (!existsSync(resolve(INFRA_DIR, 'node_modules'))) {
|
|
37
|
+
console.log('Installing infra dependencies...');
|
|
38
|
+
if (!run('npm install')) {
|
|
39
|
+
console.error('Failed to install dependencies.');
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
// Check if CDK is available
|
|
44
|
+
const cdkBin = existsSync(resolve(INFRA_DIR, 'node_modules/.bin/cdk'))
|
|
45
|
+
? resolve(INFRA_DIR, 'node_modules/.bin/cdk')
|
|
46
|
+
: 'npx cdk';
|
|
47
|
+
// Check bootstrap status
|
|
48
|
+
console.log('Checking CDK bootstrap status...');
|
|
49
|
+
const bootstrapCheck = runCapture(`${cdkBin} bootstrap --show-template > /dev/null 2>&1 && aws cloudformation describe-stacks --stack-name CDKToolkit --query "Stacks[0].StackStatus" --output text`);
|
|
50
|
+
if (!bootstrapCheck.ok || !bootstrapCheck.stdout) {
|
|
51
|
+
console.log('CDK bootstrap stack not found. Bootstrapping...');
|
|
52
|
+
if (!run(`${cdkBin} bootstrap`)) {
|
|
53
|
+
console.error('CDK bootstrap failed. Check your AWS credentials and permissions.');
|
|
54
|
+
process.exit(1);
|
|
55
|
+
}
|
|
56
|
+
console.log('Bootstrap complete.');
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
console.log(`CDK bootstrap stack found (${bootstrapCheck.stdout}).`);
|
|
60
|
+
}
|
|
61
|
+
// Deploy
|
|
62
|
+
console.log('\nDeploying infrastructure...');
|
|
63
|
+
const success = run(`${cdkBin} deploy --all --require-approval ${options.requireApproval}`);
|
|
64
|
+
if (success) {
|
|
65
|
+
console.log('\nInfrastructure deployed successfully.');
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
console.error('\nCDK deploy failed. Check the output above for details.');
|
|
69
|
+
process.exit(1);
|
|
70
|
+
}
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
//# sourceMappingURL=deploy-infra.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"deploy-infra.js","sourceRoot":"","sources":["../../../../src/commands/workshop/deploy-infra.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
declare const _default: {
|
|
2
|
+
description: string;
|
|
3
|
+
options: {
|
|
4
|
+
flags: string;
|
|
5
|
+
description: string;
|
|
6
|
+
default: string;
|
|
7
|
+
}[];
|
|
8
|
+
action(options: {
|
|
9
|
+
region: string;
|
|
10
|
+
bus: string;
|
|
11
|
+
team: string;
|
|
12
|
+
repo: string;
|
|
13
|
+
}): void;
|
|
14
|
+
};
|
|
15
|
+
export default _default;
|
|
16
|
+
//# sourceMappingURL=generate-demo-data.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-demo-data.d.ts","sourceRoot":"","sources":["../../../../src/commands/workshop/generate-demo-data.ts"],"names":[],"mappings":";;;;;;;oBAoDkB;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE;;AAR7E,wBA8VE"}
|
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
import { execSync } from 'node:child_process';
|
|
2
|
+
import { resolve, dirname } from 'node:path';
|
|
3
|
+
import { fileURLToPath } from 'node:url';
|
|
4
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
5
|
+
const ROOT_DIR = resolve(__dirname, '../../../..');
|
|
6
|
+
function run(cmd) {
|
|
7
|
+
try {
|
|
8
|
+
execSync(cmd, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'], cwd: ROOT_DIR });
|
|
9
|
+
return true;
|
|
10
|
+
}
|
|
11
|
+
catch {
|
|
12
|
+
return false;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
function runCapture(cmd) {
|
|
16
|
+
try {
|
|
17
|
+
return execSync(cmd, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'], cwd: ROOT_DIR }).trim();
|
|
18
|
+
}
|
|
19
|
+
catch {
|
|
20
|
+
return '';
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function putEvents(region, entries) {
|
|
24
|
+
try {
|
|
25
|
+
execSync(`aws events put-events --region "${region}" --entries '${JSON.stringify(entries)}'`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'], cwd: ROOT_DIR });
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return false;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function randomInt(min, max) {
|
|
33
|
+
return Math.floor(Math.random() * (max - min + 1)) + min;
|
|
34
|
+
}
|
|
35
|
+
function formatDate(date) {
|
|
36
|
+
return date.toISOString().split('T')[0];
|
|
37
|
+
}
|
|
38
|
+
export default {
|
|
39
|
+
description: 'Generate sample metrics data for the PRISM dashboard (8 days of events)',
|
|
40
|
+
options: [
|
|
41
|
+
{ flags: '--region <region>', description: 'AWS region', default: 'us-west-2' },
|
|
42
|
+
{ flags: '--bus <name>', description: 'EventBridge bus name', default: 'prism-d1-metrics' },
|
|
43
|
+
{ flags: '--team <id>', description: 'Team identifier', default: 'demo-team' },
|
|
44
|
+
{ flags: '--repo <name>', description: 'Repository name', default: 'prism-d1-sample-app' },
|
|
45
|
+
],
|
|
46
|
+
action(options) {
|
|
47
|
+
const { region, bus, team, repo } = options;
|
|
48
|
+
// Verify AWS CLI and jq are available
|
|
49
|
+
if (!run('command -v aws')) {
|
|
50
|
+
console.error('Error: AWS CLI not found. Install from https://aws.amazon.com/cli/');
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
if (!run('command -v jq')) {
|
|
54
|
+
console.error('Error: jq not found. Install with: apt-get install jq');
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
console.log('=== PRISM Demo Data Generator ===');
|
|
58
|
+
console.log(`Region: ${region} | Bus: ${bus} | Team: ${team}`);
|
|
59
|
+
console.log('');
|
|
60
|
+
const ORIGINS = ['human', 'ai-assisted', 'ai-generated', 'ai-assisted', 'ai-assisted'];
|
|
61
|
+
const TOOLS = ['n/a', 'claude-code', 'claude-code', 'kiro', 'claude-code'];
|
|
62
|
+
let batch = [];
|
|
63
|
+
let total = 0;
|
|
64
|
+
function flush() {
|
|
65
|
+
if (batch.length > 0) {
|
|
66
|
+
if (putEvents(region, batch)) {
|
|
67
|
+
total += batch.length;
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
console.error(`Warning: Failed to emit batch of ${batch.length} events`);
|
|
71
|
+
}
|
|
72
|
+
batch = [];
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function addEvent(detailType, detail) {
|
|
76
|
+
batch.push({
|
|
77
|
+
Source: 'prism.d1.velocity',
|
|
78
|
+
DetailType: detailType,
|
|
79
|
+
EventBusName: bus,
|
|
80
|
+
Detail: JSON.stringify(detail),
|
|
81
|
+
});
|
|
82
|
+
if (batch.length >= 10) {
|
|
83
|
+
flush();
|
|
84
|
+
process.stdout.write('.');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
for (let day = 7; day >= 0; day--) {
|
|
88
|
+
const date = new Date();
|
|
89
|
+
date.setDate(date.getDate() - day);
|
|
90
|
+
const dateStr = formatDate(date);
|
|
91
|
+
const maxH = day === 0 ? Math.max(0, new Date().getUTCHours() - 1) : 17;
|
|
92
|
+
const minH = Math.min(8, maxH);
|
|
93
|
+
// 8-15 commits per day
|
|
94
|
+
const commits = randomInt(8, 15);
|
|
95
|
+
for (let i = 0; i < commits; i++) {
|
|
96
|
+
const idx = randomInt(0, 4);
|
|
97
|
+
const origin = ORIGINS[idx];
|
|
98
|
+
const tool = TOOLS[idx];
|
|
99
|
+
const h = randomInt(minH, maxH);
|
|
100
|
+
const m = randomInt(0, 59);
|
|
101
|
+
const ts = `${dateStr}T${String(h).padStart(2, '0')}:${String(m).padStart(2, '0')}:00Z`;
|
|
102
|
+
const lines = randomInt(10, 129);
|
|
103
|
+
addEvent('prism.d1.commit', {
|
|
104
|
+
team_id: team, repo, timestamp: ts, prism_level: 2,
|
|
105
|
+
metric: { name: 'commit', value: 1, unit: 'count' },
|
|
106
|
+
ai_context: { tool, model: 'us.anthropic.claude-haiku-4-5-20251001-v1:0', origin },
|
|
107
|
+
ai_dora: { ai_to_merge_ratio: origin !== 'human' ? 1 : 0 },
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// 2-4 PRs per day
|
|
111
|
+
const prs = randomInt(2, 4);
|
|
112
|
+
for (let i = 0; i < prs; i++) {
|
|
113
|
+
const tc = randomInt(2, 6);
|
|
114
|
+
const ac = randomInt(0, tc);
|
|
115
|
+
const ratio = parseFloat((ac / tc).toFixed(4));
|
|
116
|
+
const lt = 3600 * (day + 1) + randomInt(0, 3599);
|
|
117
|
+
const lth = parseFloat((lt / 3600).toFixed(2));
|
|
118
|
+
const ts = `${dateStr}T${String(randomInt(minH, maxH)).padStart(2, '0')}:30:00Z`;
|
|
119
|
+
const pr = 100 + day * 10 + i;
|
|
120
|
+
// Generate realistic token usage for the PR (scales with commit count)
|
|
121
|
+
const inputTokens = ac > 0 ? randomInt(5000, 15000) * tc : 0;
|
|
122
|
+
const outputTokens = ac > 0 ? randomInt(10000, 40000) * tc : 0;
|
|
123
|
+
const costUsd = ac > 0 ? parseFloat(((inputTokens * 0.003 + outputTokens * 0.015) / 100).toFixed(2)) : 0;
|
|
124
|
+
addEvent('prism.d1.pr', {
|
|
125
|
+
team_id: team, repo, timestamp: ts, prism_level: 2,
|
|
126
|
+
metric: { name: 'ai_to_merge_ratio', value: ratio, unit: 'ratio' },
|
|
127
|
+
ai_context: { tool: 'github-actions', model: 'n/a', origin: ac > 0 ? 'ai-assisted' : 'human' },
|
|
128
|
+
dora: { deployment_frequency: 1, lead_time_seconds: lt },
|
|
129
|
+
ai_dora: {
|
|
130
|
+
ai_to_merge_ratio: ratio,
|
|
131
|
+
total_commits: tc,
|
|
132
|
+
ai_commits: ac,
|
|
133
|
+
total_input_tokens: inputTokens,
|
|
134
|
+
total_output_tokens: outputTokens,
|
|
135
|
+
total_cost_usd: costUsd,
|
|
136
|
+
},
|
|
137
|
+
pr: { number: pr, author: 'engineer' },
|
|
138
|
+
});
|
|
139
|
+
// Deploy event
|
|
140
|
+
addEvent('prism.d1.deploy', {
|
|
141
|
+
team_id: team, repo, timestamp: ts, prism_level: 2,
|
|
142
|
+
metric: { name: 'deployment', value: 1, unit: 'count' },
|
|
143
|
+
dora: { deployment_frequency: 1 },
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
// Eval results
|
|
147
|
+
for (let i = 0; i < prs; i++) {
|
|
148
|
+
let score = 0.88;
|
|
149
|
+
let res = 'PASS';
|
|
150
|
+
if (day === 4 && randomInt(0, 1) === 0) {
|
|
151
|
+
score = 0.62;
|
|
152
|
+
res = 'FAIL';
|
|
153
|
+
}
|
|
154
|
+
if (randomInt(0, 7) === 0) {
|
|
155
|
+
score = 0.71;
|
|
156
|
+
res = 'FAIL';
|
|
157
|
+
}
|
|
158
|
+
const ts = `${dateStr}T${String(randomInt(minH, maxH)).padStart(2, '0')}:45:00Z`;
|
|
159
|
+
addEvent('prism.d1.eval', {
|
|
160
|
+
team_id: team, repo, timestamp: ts, prism_level: 2,
|
|
161
|
+
metric: { name: 'eval_score', value: score, unit: 'score' },
|
|
162
|
+
ai_context: { tool: 'bedrock-eval', model: 'us.anthropic.claude-haiku-4-5-20251001-v1:0', origin: 'ai-generated' },
|
|
163
|
+
ai_dora: { eval_gate_pass_rate: res === 'PASS' ? 1 : 0 },
|
|
164
|
+
eval: { result: res, pr_number: 100 + day * 10 + i },
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
// Weekly assessment metrics
|
|
168
|
+
const ts = `${dateStr}T09:00:00Z`;
|
|
169
|
+
const cfr = parseFloat(((randomInt(1, 8)) / 100).toFixed(4));
|
|
170
|
+
const mttrS = randomInt(600, 4199);
|
|
171
|
+
const accept = parseFloat((randomInt(70, 89) / 100).toFixed(4));
|
|
172
|
+
const coverage = parseFloat((randomInt(10, 34) / 100).toFixed(4));
|
|
173
|
+
const specH = parseFloat((randomInt(10, 39) / 10).toFixed(2));
|
|
174
|
+
const defect = parseFloat((randomInt(1, 5) / 100).toFixed(4));
|
|
175
|
+
addEvent('prism.d1.assessment', {
|
|
176
|
+
team_id: team, repo, timestamp: ts, prism_level: 2,
|
|
177
|
+
metric: { name: 'change_failure_rate', value: cfr, unit: 'percent' },
|
|
178
|
+
dora: { change_failure_rate: cfr },
|
|
179
|
+
});
|
|
180
|
+
addEvent('prism.d1.assessment', {
|
|
181
|
+
team_id: team, repo, timestamp: ts, prism_level: 2,
|
|
182
|
+
metric: { name: 'mttr', value: mttrS, unit: 'seconds' },
|
|
183
|
+
dora: { mttr_seconds: mttrS },
|
|
184
|
+
});
|
|
185
|
+
addEvent('prism.d1.assessment', {
|
|
186
|
+
team_id: team, repo, timestamp: ts, prism_level: 2,
|
|
187
|
+
metric: { name: 'ai_acceptance_rate', value: accept, unit: 'percent' },
|
|
188
|
+
ai_dora: { ai_acceptance_rate: accept },
|
|
189
|
+
});
|
|
190
|
+
addEvent('prism.d1.assessment', {
|
|
191
|
+
team_id: team, repo, timestamp: ts, prism_level: 2,
|
|
192
|
+
metric: { name: 'ai_test_coverage_delta', value: coverage, unit: 'percent' },
|
|
193
|
+
ai_dora: { ai_test_coverage_delta: coverage },
|
|
194
|
+
});
|
|
195
|
+
addEvent('prism.d1.assessment', {
|
|
196
|
+
team_id: team, repo, timestamp: ts, prism_level: 2,
|
|
197
|
+
metric: { name: 'spec_to_code_hours', value: specH, unit: 'count' },
|
|
198
|
+
ai_dora: { spec_to_code_hours: specH },
|
|
199
|
+
});
|
|
200
|
+
addEvent('prism.d1.assessment', {
|
|
201
|
+
team_id: team, repo, timestamp: ts, prism_level: 2,
|
|
202
|
+
metric: { name: 'post_merge_defect_rate', value: defect, unit: 'percent' },
|
|
203
|
+
ai_dora: { post_merge_defect_rate: defect },
|
|
204
|
+
});
|
|
205
|
+
// PRISM Level (trending up over the week)
|
|
206
|
+
const level = parseFloat((1.5 + (7 - day) * 0.2).toFixed(1));
|
|
207
|
+
addEvent('prism.d1.assessment', {
|
|
208
|
+
team_id: team, repo, timestamp: ts, prism_level: 2,
|
|
209
|
+
metric: { name: 'PRISMLevel', value: level, unit: 'none' },
|
|
210
|
+
});
|
|
211
|
+
// Agent invocations
|
|
212
|
+
const agentCount = randomInt(3, 10);
|
|
213
|
+
for (let a = 0; a < agentCount; a++) {
|
|
214
|
+
const steps = randomInt(2, 9);
|
|
215
|
+
const dur = randomInt(1000, 5999);
|
|
216
|
+
const tokens = randomInt(2000, 9999);
|
|
217
|
+
const status = randomInt(0, 5) === 0 ? 'failure' : 'success';
|
|
218
|
+
const ats = `${dateStr}T${String(randomInt(minH, maxH)).padStart(2, '0')}:${String(randomInt(0, 59)).padStart(2, '0')}:00Z`;
|
|
219
|
+
addEvent('prism.d1.agent', {
|
|
220
|
+
team_id: team, repo, timestamp: ats, prism_level: 3,
|
|
221
|
+
metric: { name: 'agent_invocation', value: 1, unit: 'count' },
|
|
222
|
+
ai_context: { tool: 'strands-agent', model: 'us.anthropic.claude-haiku-4-5-20251001-v1:0', origin: 'ai-generated' },
|
|
223
|
+
agent: {
|
|
224
|
+
agent_name: 'task-assistant', steps_taken: steps, tools_invoked: steps - 1,
|
|
225
|
+
duration_ms: dur, tokens_used: tokens, status, guardrails_triggered: 0,
|
|
226
|
+
},
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
// Guardrail triggers (Pillar 4)
|
|
230
|
+
const GUARDRAIL_CATEGORIES = ['CONTENT_FILTER', 'DENIED_TOPIC', 'SENSITIVE_INFO', 'WORD_FILTER'];
|
|
231
|
+
const GUARDRAIL_ACTIONS = ['BLOCK', 'ANONYMIZE', 'WARN'];
|
|
232
|
+
const guardrailCount = randomInt(1, 5);
|
|
233
|
+
for (let g = 0; g < guardrailCount; g++) {
|
|
234
|
+
const gts = `${dateStr}T${String(randomInt(minH, maxH)).padStart(2, '0')}:${String(randomInt(0, 59)).padStart(2, '0')}:00Z`;
|
|
235
|
+
const category = GUARDRAIL_CATEGORIES[randomInt(0, 3)];
|
|
236
|
+
const action = GUARDRAIL_ACTIONS[randomInt(0, 2)];
|
|
237
|
+
addEvent('prism.d1.guardrail', {
|
|
238
|
+
team_id: team, repo, timestamp: gts, prism_level: 2,
|
|
239
|
+
metric: { name: 'guardrail_trigger', value: 1, unit: 'count' },
|
|
240
|
+
guardrail: {
|
|
241
|
+
guardrail_id: 'gr-demo-001', guardrail_name: 'prism-safety',
|
|
242
|
+
trigger_category: category, trigger_type: 'automated',
|
|
243
|
+
action_taken: action, agent_name: 'task-assistant', invocation_id: `inv-${day}-${g}`,
|
|
244
|
+
},
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
// MCP tool calls (Pillar 3)
|
|
248
|
+
const MCP_TOOLS = ['file_read', 'file_write', 'shell_exec', 'web_fetch', 'db_query'];
|
|
249
|
+
const mcpCount = randomInt(5, 15);
|
|
250
|
+
for (let m = 0; m < mcpCount; m++) {
|
|
251
|
+
const mts = `${dateStr}T${String(randomInt(minH, maxH)).padStart(2, '0')}:${String(randomInt(0, 59)).padStart(2, '0')}:00Z`;
|
|
252
|
+
const authorized = randomInt(0, 19) !== 0; // 5% denied
|
|
253
|
+
addEvent('prism.d1.mcp.tool_call', {
|
|
254
|
+
team_id: team, repo, timestamp: mts, prism_level: 2,
|
|
255
|
+
metric: { name: 'mcp_tool_call', value: 1, unit: 'count' },
|
|
256
|
+
mcp_tool_call: {
|
|
257
|
+
session_id: `sess-${day}-${m}`, client_id: 'claude-code',
|
|
258
|
+
tool_name: MCP_TOOLS[randomInt(0, 4)],
|
|
259
|
+
scopes_used: ['read'], authorized,
|
|
260
|
+
risk_level: authorized ? 'low' : 'high',
|
|
261
|
+
duration_ms: randomInt(50, 2000),
|
|
262
|
+
result_status: authorized ? 'success' : 'denied',
|
|
263
|
+
},
|
|
264
|
+
});
|
|
265
|
+
}
|
|
266
|
+
// Bedrock cost & token efficiency (Pillar 5)
|
|
267
|
+
const dailyCost = parseFloat((randomInt(15, 45) + randomInt(0, 99) / 100).toFixed(2));
|
|
268
|
+
const tokenEff = randomInt(80, 300);
|
|
269
|
+
addEvent('prism.d1.assessment', {
|
|
270
|
+
team_id: team, repo, timestamp: ts, prism_level: 2,
|
|
271
|
+
metric: { name: 'BedrockCostUSD', value: dailyCost, unit: 'none' },
|
|
272
|
+
});
|
|
273
|
+
addEvent('prism.d1.assessment', {
|
|
274
|
+
team_id: team, repo, timestamp: ts, prism_level: 2,
|
|
275
|
+
metric: { name: 'TokenEfficiency', value: tokenEff, unit: 'none' },
|
|
276
|
+
});
|
|
277
|
+
// Quality: AI vs Human defect rates (Pillar 7)
|
|
278
|
+
const aiDefect = parseFloat((randomInt(1, 4) / 100).toFixed(4));
|
|
279
|
+
const humanDefect = parseFloat((randomInt(2, 7) / 100).toFixed(4));
|
|
280
|
+
addEvent('prism.d1.quality', {
|
|
281
|
+
team_id: team, repo, timestamp: ts, prism_level: 2,
|
|
282
|
+
metric: { name: 'quality_comparison', value: 1, unit: 'count' },
|
|
283
|
+
quality: {
|
|
284
|
+
deployment_id: `deploy-${day}`,
|
|
285
|
+
ai_defect_rate: aiDefect, human_defect_rate: humanDefect,
|
|
286
|
+
total_ai_commits: randomInt(5, 12), total_human_commits: randomInt(3, 8),
|
|
287
|
+
},
|
|
288
|
+
});
|
|
289
|
+
// Security Agent findings
|
|
290
|
+
const PHASES = ['design_review', 'code_review', 'pen_test'];
|
|
291
|
+
const SEVERITIES = ['CRITICAL', 'HIGH', 'MEDIUM', 'LOW'];
|
|
292
|
+
const findingCount = randomInt(1, 4);
|
|
293
|
+
for (let f = 0; f < findingCount; f++) {
|
|
294
|
+
const fts = `${dateStr}T${String(randomInt(minH, maxH)).padStart(2, '0')}:${String(randomInt(0, 59)).padStart(2, '0')}:00Z`;
|
|
295
|
+
const severity = SEVERITIES[randomInt(0, 3)];
|
|
296
|
+
const phase = PHASES[randomInt(0, 2)];
|
|
297
|
+
const aiOrigin = randomInt(0, 1) === 0 ? 'ai-assisted' : 'human';
|
|
298
|
+
addEvent('prism.d1.security.code_review', {
|
|
299
|
+
team_id: team, repo, timestamp: fts, prism_level: 2,
|
|
300
|
+
metric: { name: 'security_finding', value: 1, unit: 'count' },
|
|
301
|
+
security_agent_finding: {
|
|
302
|
+
finding_id: `finding-${day}-${f}`, phase, severity,
|
|
303
|
+
cvss_score: severity === 'CRITICAL' ? 9.1 : severity === 'HIGH' ? 7.5 : severity === 'MEDIUM' ? 5.2 : 2.8,
|
|
304
|
+
title: 'Demo finding', category: 'injection',
|
|
305
|
+
cwe_id: 'CWE-79', exploit_validated: phase === 'pen_test',
|
|
306
|
+
compliance_mappings: ['OWASP-A03'], ai_origin: aiOrigin,
|
|
307
|
+
spec_ref: null, found_at: fts, remediated_at: null,
|
|
308
|
+
},
|
|
309
|
+
});
|
|
310
|
+
}
|
|
311
|
+
// Security remediation
|
|
312
|
+
if (day > 0 && randomInt(0, 2) === 0) {
|
|
313
|
+
const rts = `${dateStr}T${String(randomInt(minH, maxH)).padStart(2, '0')}:${String(randomInt(0, 59)).padStart(2, '0')}:00Z`;
|
|
314
|
+
const remOrigin = randomInt(0, 1) === 0 ? 'ai-assisted' : 'human';
|
|
315
|
+
addEvent('prism.d1.security.remediation', {
|
|
316
|
+
team_id: team, repo, timestamp: rts, prism_level: 2,
|
|
317
|
+
metric: { name: 'security_remediation', value: 1, unit: 'count' },
|
|
318
|
+
security_remediation: {
|
|
319
|
+
finding_id: `finding-${day + 1}-0`,
|
|
320
|
+
severity: SEVERITIES[randomInt(0, 2)],
|
|
321
|
+
remediation_time_hours: randomInt(2, 48),
|
|
322
|
+
remediated_by_origin: remOrigin,
|
|
323
|
+
finding_phase: 'code_review',
|
|
324
|
+
},
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
// Exfiltration alert (rare)
|
|
328
|
+
if (randomInt(0, 6) === 0) {
|
|
329
|
+
const ets = `${dateStr}T${String(randomInt(minH, maxH)).padStart(2, '0')}:${String(randomInt(0, 59)).padStart(2, '0')}:00Z`;
|
|
330
|
+
addEvent('prism.d1.security', {
|
|
331
|
+
team_id: team, repo, timestamp: ets, prism_level: 2,
|
|
332
|
+
metric: { name: 'exfiltration_alert', value: 1, unit: 'count' },
|
|
333
|
+
security: {
|
|
334
|
+
alert_type: 'anomalous_read', table_name: 'prism-d1-events',
|
|
335
|
+
principal_arn: 'arn:aws:iam::123456789012:role/demo-role',
|
|
336
|
+
read_count: randomInt(500, 2000),
|
|
337
|
+
window_start: ets, window_end: ets,
|
|
338
|
+
},
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
// Eval by rubric (enriches eval data)
|
|
342
|
+
const RUBRICS = ['code-quality', 'api-response-quality', 'agent-quality', 'security-compliance', 'spec-compliance'];
|
|
343
|
+
for (const rubric of RUBRICS) {
|
|
344
|
+
const rScore = parseFloat((randomInt(65, 98) / 100).toFixed(2));
|
|
345
|
+
const rts = `${dateStr}T${String(randomInt(minH, maxH)).padStart(2, '0')}:50:00Z`;
|
|
346
|
+
addEvent('prism.d1.eval', {
|
|
347
|
+
team_id: team, repo, timestamp: rts, prism_level: 2,
|
|
348
|
+
metric: { name: 'eval_score', value: rScore, unit: 'score' },
|
|
349
|
+
ai_context: { tool: 'bedrock-eval', model: 'us.anthropic.claude-haiku-4-5-20251001-v1:0', origin: 'ai-generated' },
|
|
350
|
+
ai_dora: { eval_gate_pass_rate: rScore >= 0.7 ? 1 : 0 },
|
|
351
|
+
eval: { result: rScore >= 0.7 ? 'PASS' : 'FAIL', rubric, score: rScore, pr_number: 100 + day * 10 },
|
|
352
|
+
});
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
flush();
|
|
356
|
+
console.log('\n');
|
|
357
|
+
console.log(`=== Done! ${total} events emitted ===`);
|
|
358
|
+
console.log('Open CloudWatch → Dashboards → PRISM-D1-Team-Velocity (us-west-2)');
|
|
359
|
+
console.log("Set time range to 'Last 1 week'");
|
|
360
|
+
},
|
|
361
|
+
};
|
|
362
|
+
//# sourceMappingURL=generate-demo-data.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-demo-data.js","sourceRoot":"","sources":["../../../../src/commands/workshop/generate-demo-data.ts"],"names":[],"mappings":"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"}
|