@prism-d1/cli 1.2.0 → 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.
Files changed (127) hide show
  1. package/dist/assets/github-workflows/prism-eval-gate-kiro.yml +2 -2
  2. package/dist/assets/infra/bin/app.ts +61 -37
  3. package/dist/assets/infra/lib/constructs/security-agent-construct.ts +35 -30
  4. package/dist/assets/infra/lib/metrics-pipeline-stack.ts +2 -110
  5. package/dist/assets/infra/lib/security-agent-resources.ts +136 -0
  6. package/dist/assets/infra/lib/security-agent-stack.ts +69 -0
  7. package/dist/assets/pentest-cdk/bin/app.ts +12 -0
  8. package/dist/assets/pentest-cdk/cdk.json +7 -0
  9. package/dist/assets/pentest-cdk/lib/pentest-target-stack.ts +206 -0
  10. package/dist/assets/pentest-cdk/package.json +18 -0
  11. package/dist/assets/pentest-cdk/tsconfig.json +12 -0
  12. package/dist/src/codewatch/results.d.ts +124 -4
  13. package/dist/src/codewatch/results.d.ts.map +1 -1
  14. package/dist/src/codewatch/results.js +8 -2
  15. package/dist/src/codewatch/results.js.map +1 -1
  16. package/dist/src/commands/_top/version.d.ts +62 -0
  17. package/dist/src/commands/_top/version.d.ts.map +1 -0
  18. package/dist/src/commands/_top/version.js +175 -0
  19. package/dist/src/commands/_top/version.js.map +1 -0
  20. package/dist/src/commands/bootstrapper/setup-otel-sync.d.ts +12 -6
  21. package/dist/src/commands/bootstrapper/setup-otel-sync.d.ts.map +1 -1
  22. package/dist/src/commands/bootstrapper/setup-otel-sync.js +18 -409
  23. package/dist/src/commands/bootstrapper/setup-otel-sync.js.map +1 -1
  24. package/dist/src/commands/enable/codeburn.d.ts +59 -0
  25. package/dist/src/commands/enable/codeburn.d.ts.map +1 -0
  26. package/dist/src/commands/enable/codeburn.js +531 -0
  27. package/dist/src/commands/enable/codeburn.js.map +1 -0
  28. package/dist/src/commands/enable/security.d.ts +41 -0
  29. package/dist/src/commands/enable/security.d.ts.map +1 -0
  30. package/dist/src/commands/enable/security.js +130 -0
  31. package/dist/src/commands/enable/security.js.map +1 -0
  32. package/dist/src/commands/export/otel.d.ts +31 -0
  33. package/dist/src/commands/export/otel.d.ts.map +1 -0
  34. package/dist/src/commands/export/otel.js +52 -0
  35. package/dist/src/commands/export/otel.js.map +1 -0
  36. package/dist/src/commands/security/code-review.d.ts +22 -0
  37. package/dist/src/commands/security/code-review.d.ts.map +1 -0
  38. package/dist/src/commands/security/code-review.js +43 -0
  39. package/dist/src/commands/security/code-review.js.map +1 -0
  40. package/dist/src/commands/security/findings.d.ts +15 -0
  41. package/dist/src/commands/security/findings.d.ts.map +1 -0
  42. package/dist/src/commands/security/findings.js +31 -0
  43. package/dist/src/commands/security/findings.js.map +1 -0
  44. package/dist/src/commands/security/pentest.d.ts +18 -0
  45. package/dist/src/commands/security/pentest.d.ts.map +1 -0
  46. package/dist/src/commands/security/pentest.js +32 -0
  47. package/dist/src/commands/security/pentest.js.map +1 -0
  48. package/dist/src/commands/security/threat-model.d.ts +16 -0
  49. package/dist/src/commands/security/threat-model.d.ts.map +1 -0
  50. package/dist/src/commands/security/threat-model.js +24 -0
  51. package/dist/src/commands/security/threat-model.js.map +1 -0
  52. package/dist/src/commands/security/threats.d.ts +12 -0
  53. package/dist/src/commands/security/threats.d.ts.map +1 -0
  54. package/dist/src/commands/security/threats.js +23 -0
  55. package/dist/src/commands/security/threats.js.map +1 -0
  56. package/dist/src/commands/securityagent/setup.d.ts +19 -5
  57. package/dist/src/commands/securityagent/setup.d.ts.map +1 -1
  58. package/dist/src/commands/securityagent/setup.js +25 -189
  59. package/dist/src/commands/securityagent/setup.js.map +1 -1
  60. package/dist/src/dashboard/codewatch.d.ts.map +1 -1
  61. package/dist/src/dashboard/codewatch.js +2 -1
  62. package/dist/src/dashboard/codewatch.js.map +1 -1
  63. package/dist/src/dashboard/page.d.ts.map +1 -1
  64. package/dist/src/dashboard/page.js +159 -4
  65. package/dist/src/dashboard/page.js.map +1 -1
  66. package/dist/src/dashboard/payload.d.ts +8 -5
  67. package/dist/src/dashboard/payload.d.ts.map +1 -1
  68. package/dist/src/dashboard/payload.js +5 -2
  69. package/dist/src/dashboard/payload.js.map +1 -1
  70. package/dist/src/dashboard/security.d.ts +130 -0
  71. package/dist/src/dashboard/security.d.ts.map +1 -0
  72. package/dist/src/dashboard/security.js +144 -0
  73. package/dist/src/dashboard/security.js.map +1 -0
  74. package/dist/src/dashboard/setup.d.ts +15 -0
  75. package/dist/src/dashboard/setup.d.ts.map +1 -1
  76. package/dist/src/dashboard/setup.js +20 -3
  77. package/dist/src/dashboard/setup.js.map +1 -1
  78. package/dist/src/dashboard/usage.js +1 -1
  79. package/dist/src/dashboard/usage.js.map +1 -1
  80. package/dist/src/index.d.ts.map +1 -1
  81. package/dist/src/index.js +9 -2
  82. package/dist/src/index.js.map +1 -1
  83. package/dist/src/security/cfn-diff.d.ts +57 -0
  84. package/dist/src/security/cfn-diff.d.ts.map +1 -0
  85. package/dist/src/security/cfn-diff.js +112 -0
  86. package/dist/src/security/cfn-diff.js.map +1 -0
  87. package/dist/src/security/errors.d.ts +45 -0
  88. package/dist/src/security/errors.d.ts.map +1 -0
  89. package/dist/src/security/errors.js +116 -0
  90. package/dist/src/security/errors.js.map +1 -0
  91. package/dist/src/security/marker.d.ts +46 -0
  92. package/dist/src/security/marker.d.ts.map +1 -0
  93. package/dist/src/security/marker.js +120 -0
  94. package/dist/src/security/marker.js.map +1 -0
  95. package/dist/src/security/pentest-dockerfile.d.ts +8 -0
  96. package/dist/src/security/pentest-dockerfile.d.ts.map +1 -0
  97. package/dist/src/security/pentest-dockerfile.js +163 -0
  98. package/dist/src/security/pentest-dockerfile.js.map +1 -0
  99. package/dist/src/security/pentest.d.ts +233 -0
  100. package/dist/src/security/pentest.d.ts.map +1 -0
  101. package/dist/src/security/pentest.js +1057 -0
  102. package/dist/src/security/pentest.js.map +1 -0
  103. package/dist/src/security/repo.d.ts +25 -0
  104. package/dist/src/security/repo.d.ts.map +1 -0
  105. package/dist/src/security/repo.js +38 -0
  106. package/dist/src/security/repo.js.map +1 -0
  107. package/dist/src/security/review.d.ts +202 -0
  108. package/dist/src/security/review.d.ts.map +1 -0
  109. package/dist/src/security/review.js +706 -0
  110. package/dist/src/security/review.js.map +1 -0
  111. package/dist/src/security/setup.d.ts +193 -0
  112. package/dist/src/security/setup.d.ts.map +1 -0
  113. package/dist/src/security/setup.js +728 -0
  114. package/dist/src/security/setup.js.map +1 -0
  115. package/dist/src/security/threat-model.d.ts +133 -0
  116. package/dist/src/security/threat-model.d.ts.map +1 -0
  117. package/dist/src/security/threat-model.js +653 -0
  118. package/dist/src/security/threat-model.js.map +1 -0
  119. package/dist/src/utils/exec.d.ts +6 -0
  120. package/dist/src/utils/exec.d.ts.map +1 -1
  121. package/dist/src/utils/exec.js +12 -1
  122. package/dist/src/utils/exec.js.map +1 -1
  123. package/dist/src/utils/otel-sync-schedule.d.ts +19 -0
  124. package/dist/src/utils/otel-sync-schedule.d.ts.map +1 -1
  125. package/dist/src/utils/otel-sync-schedule.js +24 -2
  126. package/dist/src/utils/otel-sync-schedule.js.map +1 -1
  127. package/package.json +3 -3
@@ -0,0 +1,41 @@
1
+ import { type Deps, type SecurityOptions } from '../../security/setup.js';
2
+ export declare function defaultDeps(opts: SecurityOptions): Deps;
3
+ export declare const SECURITY_OPTIONS: {
4
+ flags: string;
5
+ description: string;
6
+ default?: string;
7
+ parser?: (v: string, prev?: string[]) => string[];
8
+ }[];
9
+ /** Test seams: everything else uses the real runners, console and process. */
10
+ export interface RunHooks {
11
+ deps?: (opts: SecurityOptions) => Deps;
12
+ error?: (line: string) => void;
13
+ exit?: (code: number) => void;
14
+ env?: NodeJS.ProcessEnv;
15
+ }
16
+ /**
17
+ * The one entry point for `enable security` and its `securityagent setup`
18
+ * alias. Abort errors are already printed by enableSecurity; anything else
19
+ * (a failed npm or cdk run, a JSON parse, git or fs) is caught here and
20
+ * printed as one redacted line plus a hint, never as a raw stack or an
21
+ * unhandled rejection. PRISM_DEBUG=1 adds the redacted stack.
22
+ */
23
+ export declare function runEnableSecurity(opts: SecurityOptions, hooks?: RunHooks): Promise<void>;
24
+ /**
25
+ * Shared by every Security Agent command (enable security, its alias,
26
+ * security code-review, security findings): runs `body`, turns any error that
27
+ * is not an Abort into one redacted line plus a hint, and exits non-zero.
28
+ */
29
+ export declare function runGuarded(body: () => Promise<number>, hooks?: Pick<RunHooks, 'error' | 'exit' | 'env'>): Promise<void>;
30
+ declare const _default: {
31
+ description: string;
32
+ options: {
33
+ flags: string;
34
+ description: string;
35
+ default?: string;
36
+ parser?: (v: string, prev?: string[]) => string[];
37
+ }[];
38
+ action: typeof runEnableSecurity;
39
+ };
40
+ export default _default;
41
+ //# sourceMappingURL=security.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../../src/commands/enable/security.ts"],"names":[],"mappings":"AASA,OAAO,EAA+C,KAAK,IAAI,EAAE,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAqDvH,wBAAgB,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,IAAI,CAqBvD;AAID,eAAO,MAAM,gBAAgB,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAA;CAAE,EAQzI,CAAC;AAEF,8EAA8E;AAC9E,MAAM,WAAW,QAAQ;IACvB,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,IAAI,CAAC;IACvC,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,eAAe,EAAE,KAAK,GAAE,QAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAKlG;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAAE,KAAK,GAAE,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,MAAM,GAAG,KAAK,CAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWjI;;;;eAhDuC,MAAM;qBAAe,MAAM;kBAAY,MAAM;iBAAW,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE;;;;AAkDxI,wBAIE"}
@@ -0,0 +1,130 @@
1
+ import { execFileSync, spawnSync } from 'node:child_process';
2
+ import { existsSync, mkdtempSync } from 'node:fs';
3
+ import { tmpdir } from 'node:os';
4
+ import { join, resolve } from 'node:path';
5
+ import { createInterface } from 'node:readline';
6
+ import { aws } from '../../utils/aws.js';
7
+ import { run } from '../../utils/exec.js';
8
+ import { getAssetPath } from '../../utils/root.js';
9
+ import { describeUnexpectedError } from '../../security/errors.js';
10
+ import { enableSecurity } from '../../security/setup.js';
11
+ /** Room for the full synth and diff output of the whole app. */
12
+ const CDK_OUTPUT_MAX_BUFFER = 64 * 1024 * 1024;
13
+ /** Resolved on first use, so importing this module (tests, --help) needs no built assets. */
14
+ let infraDir = null;
15
+ const INFRA = () => (infraDir ??= getAssetPath(import.meta.url, 'infra'));
16
+ /** npm_* variables from the outer `npm` would leak into the infra project's own npm/cdk runs. */
17
+ function cleanEnv(extra) {
18
+ const env = { ...process.env, ...extra };
19
+ for (const k of Object.keys(env))
20
+ if (k.startsWith('npm_'))
21
+ delete env[k];
22
+ return env;
23
+ }
24
+ function ensureInfraDeps() {
25
+ if (existsSync(resolve(INFRA(), 'node_modules')))
26
+ return;
27
+ console.log('Installing the CDK app dependencies (local, one time)...');
28
+ execFileSync('npm', ['install', '--no-audit', '--no-fund'], { cwd: INFRA(), stdio: 'inherit', env: cleanEnv({}) });
29
+ }
30
+ /**
31
+ * CDK runs with the default credential chain unless --profile was given, and
32
+ * always in the resolved region, so every step works in the same place.
33
+ */
34
+ function cdkRunner(opts) {
35
+ const bin = () => resolve(INFRA(), 'node_modules/.bin/cdk');
36
+ const profile = opts.profile ? ['--profile', opts.profile] : [];
37
+ const env = (e) => cleanEnv({ CDK_DEFAULT_ACCOUNT: e.account, CDK_DEFAULT_REGION: e.region, AWS_DEFAULT_REGION: e.region, AWS_REGION: e.region, AWS_PAGER: '' });
38
+ return {
39
+ synth(outDir, context, e) {
40
+ ensureInfraDeps();
41
+ const ctx = Object.entries(context).flatMap(([k, v]) => ['-c', `${k}=${v}`]);
42
+ const r = spawnSync(bin(), ['synth', '--quiet', '-o', outDir, ...ctx, ...profile], { cwd: INFRA(), env: env(e), encoding: 'utf8', maxBuffer: CDK_OUTPUT_MAX_BUFFER });
43
+ return { ok: r.status === 0, stdout: r.stdout || '', stderr: `${r.stderr || ''}${r.error ? r.error.message : ''}` };
44
+ },
45
+ diff(outDir, stack, e) {
46
+ // cdk diff prints to stderr; keep both streams.
47
+ const r = spawnSync(bin(), ['diff', '--app', outDir, stack, '--exclusively', '--no-color', ...profile], { cwd: INFRA(), env: env(e), encoding: 'utf8', maxBuffer: CDK_OUTPUT_MAX_BUFFER });
48
+ return { ok: r.status === 0, output: `${r.stdout || ''}${r.stderr || ''}` };
49
+ },
50
+ deploy(outDir, stack, e, { approveAll }) {
51
+ // Interactive: CDK's own default (--require-approval broadening) also asks
52
+ // before IAM/security-group broadening. --yes is the user's explicit
53
+ // approval, given after seeing the plan, so CDK is not asked again.
54
+ const approval = approveAll ? ['--require-approval', 'never'] : [];
55
+ const r = spawnSync(bin(), ['deploy', '--app', outDir, stack, '--exclusively', ...approval, ...profile], { cwd: INFRA(), env: env(e), stdio: 'inherit' });
56
+ return r.status === 0;
57
+ },
58
+ };
59
+ }
60
+ export function defaultDeps(opts) {
61
+ const target = opts.profile ? { profile: opts.profile } : {};
62
+ return {
63
+ aws: (args, region) => aws([...args, '--region', region], { ...target, env: { AWS_PAGER: '' } }),
64
+ configRegion: (profile) => {
65
+ const r = run('aws', ['configure', 'get', 'region', ...(profile ? ['--profile', profile] : [])]);
66
+ return r.ok && r.stdout ? r.stdout : null;
67
+ },
68
+ env: process.env,
69
+ awsVersion: () => { const r = run('aws', ['--version']); return r.ok ? r.stdout : null; },
70
+ cdk: cdkRunner(opts),
71
+ git: (args) => run('git', args),
72
+ makeTempDir: () => mkdtempSync(join(tmpdir(), 'prism-enable-security-')),
73
+ isTTY: !!(process.stdin.isTTY && process.stdout.isTTY),
74
+ ask: (q) => new Promise((done) => {
75
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
76
+ rl.question(q, (a) => { rl.close(); done(a); });
77
+ }),
78
+ log: (line = '') => console.log(line),
79
+ now: () => new Date(),
80
+ };
81
+ }
82
+ const collect = (v, prev = []) => [...prev, v];
83
+ export const SECURITY_OPTIONS = [
84
+ { flags: '--profile <name>', description: 'AWS CLI profile (default: none; the standard credential chain, e.g. AWS_PROFILE, env keys, SSO, instance role)' },
85
+ { flags: '--region <region>', description: 'AWS region (default: AWS_REGION, AWS_DEFAULT_REGION, else the profile\'s configured region; refuses when none is set)' },
86
+ { flags: '--yes', description: 'Approve the changes without a prompt (CI and other non-interactive use)' },
87
+ { flags: '--dry-run', description: 'Run every read-only step and print the plan, including the exact calls; change nothing' },
88
+ { flags: '--status', description: 'Read-only report: credentials, stack, agent space, application, code review, SSM, CI step' },
89
+ { flags: '--repo <host/owner/name>', description: 'Repo id for the code review, as the CI gate names it (default: from the origin remote)' },
90
+ { flags: '--context <key=value>', description: 'Extra cdk context, repeatable (match how the stack was deployed, e.g. skipVpc=true)', parser: collect },
91
+ ];
92
+ /**
93
+ * The one entry point for `enable security` and its `securityagent setup`
94
+ * alias. Abort errors are already printed by enableSecurity; anything else
95
+ * (a failed npm or cdk run, a JSON parse, git or fs) is caught here and
96
+ * printed as one redacted line plus a hint, never as a raw stack or an
97
+ * unhandled rejection. PRISM_DEBUG=1 adds the redacted stack.
98
+ */
99
+ export async function runEnableSecurity(opts, hooks = {}) {
100
+ await runGuarded(() => {
101
+ const o = { ...opts, profile: opts.profile || undefined, region: opts.region || undefined };
102
+ return enableSecurity(o, (hooks.deps ?? defaultDeps)(o));
103
+ }, hooks);
104
+ }
105
+ /**
106
+ * Shared by every Security Agent command (enable security, its alias,
107
+ * security code-review, security findings): runs `body`, turns any error that
108
+ * is not an Abort into one redacted line plus a hint, and exits non-zero.
109
+ */
110
+ export async function runGuarded(body, hooks = {}) {
111
+ const exit = hooks.exit ?? ((c) => process.exit(c));
112
+ const error = hooks.error ?? ((l) => console.error(l));
113
+ let code;
114
+ try {
115
+ code = await body();
116
+ }
117
+ catch (e) {
118
+ for (const l of describeUnexpectedError(e, hooks.env ?? process.env))
119
+ error(l);
120
+ code = 1;
121
+ }
122
+ if (code !== 0)
123
+ exit(code);
124
+ }
125
+ export default {
126
+ description: 'Set up AWS Security Agent: deploy only its stack (after a diff and your confirmation), then the application, the code review for this repo and its SSM pointer',
127
+ options: SECURITY_OPTIONS,
128
+ action: runEnableSecurity,
129
+ };
130
+ //# sourceMappingURL=security.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"security.js","sourceRoot":"","sources":["../../../../src/commands/enable/security.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface ExportOtelDeps {
2
+ findCodeburn: () => string | null;
3
+ home: string;
4
+ stream: (file: string, args: string[]) => number;
5
+ log: (line: string) => void;
6
+ error: (line: string) => void;
7
+ }
8
+ export declare function defaultDeps(): ExportOtelDeps;
9
+ export declare function exportOtel(opts: {
10
+ since?: string;
11
+ }, d: ExportOtelDeps): Promise<number>;
12
+ /** Test seams, as in enable codeburn. */
13
+ export interface ExportOtelHooks {
14
+ deps?: () => ExportOtelDeps;
15
+ error?: (line: string) => void;
16
+ exit?: (code: number) => void;
17
+ env?: NodeJS.ProcessEnv;
18
+ }
19
+ export declare function runExportOtel(opts: {
20
+ since?: string;
21
+ }, hooks?: ExportOtelHooks): Promise<void>;
22
+ declare const _default: {
23
+ description: string;
24
+ options: {
25
+ flags: string;
26
+ description: string;
27
+ }[];
28
+ action: typeof runExportOtel;
29
+ };
30
+ export default _default;
31
+ //# sourceMappingURL=otel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../../../../src/commands/export/otel.ts"],"names":[],"mappings":"AAaA,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,MAAM,GAAG,IAAI,CAAC;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,MAAM,CAAC;IACjD,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC/B;AAED,wBAAgB,WAAW,IAAI,cAAc,CAQ5C;AAED,wBAAsB,UAAU,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB7F;AAED,yCAAyC;AACzC,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,cAAc,CAAC;IAC5B,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC/B,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACzB;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,EAAE,KAAK,GAAE,eAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAExG;;;;;;;;;AAED,wBAME"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * `prism-cli export otel`: push codeburn's unsent telemetry to the configured
3
+ * PRISM OTEL collector now, with the same argv the schedule runs.
4
+ *
5
+ * Output is codeburn's own, streamed, and the exit code is codeburn's.
6
+ */
7
+ import { existsSync } from 'node:fs';
8
+ import { homedir } from 'node:os';
9
+ import { runStreaming } from '../../utils/exec.js';
10
+ import { codeburnSyncConfigPath, ENABLE_CODEBURN_CMD, SYNC_SINCE, syncArgs } from '../../utils/otel-sync-schedule.js';
11
+ import { getCodeburnPath } from '../enable/codeburn.js';
12
+ import { runGuarded } from '../enable/security.js';
13
+ export function defaultDeps() {
14
+ return {
15
+ findCodeburn: getCodeburnPath,
16
+ home: homedir(),
17
+ stream: runStreaming,
18
+ log: (l) => console.log(l),
19
+ error: (l) => console.error(l),
20
+ };
21
+ }
22
+ export async function exportOtel(opts, d) {
23
+ const cb = d.findCodeburn();
24
+ if (!cb) {
25
+ d.error('Error: codeburn is not installed.');
26
+ d.error(` Run "${ENABLE_CODEBURN_CMD}" to install it and set up the sync.`);
27
+ return 1;
28
+ }
29
+ if (!existsSync(codeburnSyncConfigPath(d.home))) {
30
+ d.error('Error: codeburn sync is not set up (no endpoint configured).');
31
+ d.error(` Run "${ENABLE_CODEBURN_CMD} --url <OtelCollectorUrl>" first.`);
32
+ return 1;
33
+ }
34
+ const since = opts.since || SYNC_SINCE;
35
+ const args = syncArgs(since);
36
+ d.log(`Running: codeburn ${args.join(' ')}`);
37
+ const code = d.stream(cb, args);
38
+ if (code !== 0)
39
+ d.error(`codeburn sync push exited with ${code}. Check "codeburn sync status", or re-run "${ENABLE_CODEBURN_CMD}".`);
40
+ return code;
41
+ }
42
+ export async function runExportOtel(opts, hooks = {}) {
43
+ await runGuarded(() => exportOtel(opts, (hooks.deps ?? defaultDeps)()), hooks);
44
+ }
45
+ export default {
46
+ description: 'Push AI usage and commit attribution to the PRISM OTEL collector now (codeburn sync push, as the schedule runs it)',
47
+ options: [
48
+ { flags: '--since <window>', description: `Time window passed to codeburn: today, 7d, 30d, month, all (default: ${SYNC_SINCE}, as the schedule)` },
49
+ ],
50
+ action: runExportOtel,
51
+ };
52
+ //# sourceMappingURL=otel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.js","sourceRoot":"","sources":["../../../../src/commands/export/otel.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AACtH,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAUnD,MAAM,UAAU,WAAW;IACzB,OAAO;QACL,YAAY,EAAE,eAAe;QAC7B,IAAI,EAAE,OAAO,EAAE;QACf,MAAM,EAAE,YAAY;QACpB,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1B,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;KAC/B,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAAwB,EAAE,CAAiB;IAC1E,MAAM,EAAE,GAAG,CAAC,CAAC,YAAY,EAAE,CAAC;IAC5B,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,CAAC,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC7C,CAAC,CAAC,KAAK,CAAC,UAAU,mBAAmB,sCAAsC,CAAC,CAAC;QAC7E,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QAChD,CAAC,CAAC,KAAK,CAAC,8DAA8D,CAAC,CAAC;QACxE,CAAC,CAAC,KAAK,CAAC,UAAU,mBAAmB,mCAAmC,CAAC,CAAC;QAC1E,OAAO,CAAC,CAAC;IACX,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,UAAU,CAAC;IACvC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC,CAAC,GAAG,CAAC,qBAAqB,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;IAChC,IAAI,IAAI,KAAK,CAAC;QAAE,CAAC,CAAC,KAAK,CAAC,kCAAkC,IAAI,8CAA8C,mBAAmB,IAAI,CAAC,CAAC;IACrI,OAAO,IAAI,CAAC;AACd,CAAC;AAUD,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAwB,EAAE,QAAyB,EAAE;IACvF,MAAM,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,IAAI,WAAW,CAAC,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;AACjF,CAAC;AAED,eAAe;IACb,WAAW,EAAE,oHAAoH;IACjI,OAAO,EAAE;QACP,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,wEAAwE,UAAU,oBAAoB,EAAE;KACnJ;IACD,MAAM,EAAE,aAAa;CACtB,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { type RunHooks } from '../enable/security.js';
2
+ import { type CodeReviewOptions, type ReviewDeps } from '../../security/review.js';
3
+ import type { SecurityOptions } from '../../security/setup.js';
4
+ /** The real runtime: enable security's runners plus a timer, Ctrl-C and the ticker. */
5
+ export declare function reviewDeps(opts: SecurityOptions): ReviewDeps;
6
+ export declare const REVIEW_TARGET_OPTIONS: {
7
+ flags: string;
8
+ description: string;
9
+ }[];
10
+ export interface ReviewHooks extends RunHooks {
11
+ reviewDeps?: (opts: SecurityOptions) => ReviewDeps;
12
+ }
13
+ declare const _default: {
14
+ description: string;
15
+ options: {
16
+ flags: string;
17
+ description: string;
18
+ }[];
19
+ action(opts: CodeReviewOptions, hooks?: ReviewHooks): Promise<void>;
20
+ };
21
+ export default _default;
22
+ //# sourceMappingURL=code-review.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-review.d.ts","sourceRoot":"","sources":["../../../../src/commands/security/code-review.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC/E,OAAO,EAAsC,KAAK,iBAAiB,EAAE,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AACvH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE/D,uFAAuF;AACvF,wBAAgB,UAAU,CAAC,IAAI,EAAE,eAAe,GAAG,UAAU,CAc5D;AAED,eAAO,MAAM,qBAAqB;;;GAKjC,CAAC;AAEF,MAAM,WAAW,WAAY,SAAQ,QAAQ;IAAG,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,eAAe,KAAK,UAAU,CAAA;CAAE;;;;;;;iBAY/E,iBAAiB,UAAS,WAAW;;AAV1D,wBAgBE"}
@@ -0,0 +1,43 @@
1
+ import { defaultDeps, runGuarded } from '../enable/security.js';
2
+ import { FAIL_ON_LEVELS, securityCodeReview } from '../../security/review.js';
3
+ /** The real runtime: enable security's runners plus a timer, Ctrl-C and the ticker. */
4
+ export function reviewDeps(opts) {
5
+ return {
6
+ ...defaultDeps(opts),
7
+ sleep: (ms, signal) => new Promise((done) => {
8
+ if (signal.aborted)
9
+ return done();
10
+ const t = setTimeout(done, ms);
11
+ signal.addEventListener('abort', () => { clearTimeout(t); done(); }, { once: true });
12
+ }),
13
+ onInterrupt: (handler) => { process.once('SIGINT', handler); return () => { process.removeListener('SIGINT', handler); }; },
14
+ ticker: (line) => { process.stderr.write(`\r\u001b[2K${line}`); },
15
+ err: (line = '') => console.error(line),
16
+ out: (text) => { process.stdout.write(text); },
17
+ cwd: () => process.cwd(),
18
+ };
19
+ }
20
+ export const REVIEW_TARGET_OPTIONS = [
21
+ { flags: '--profile <name>', description: 'AWS CLI profile (default: none; the standard credential chain)' },
22
+ { flags: '--region <region>', description: 'AWS region (default: AWS_REGION, AWS_DEFAULT_REGION, else the profile\'s configured region)' },
23
+ { flags: '--path <dir>', description: 'The repository top level to work on (default: the current directory, which must be the top level)' },
24
+ { flags: '--repo <host/owner/name>', description: 'Repo id (not a path) for the code review, as the CI gate names it (default: from the origin remote)' },
25
+ ];
26
+ export default {
27
+ description: 'Run an AWS Security Agent code review of this branch (or --full repo) now, wait for it and print the findings',
28
+ options: [
29
+ ...REVIEW_TARGET_OPTIONS,
30
+ { flags: '--full', description: 'Review the whole repo at HEAD instead of the branch diff' },
31
+ { flags: '--timeout <minutes>', description: 'How long to wait for the job (default: 30)' },
32
+ { flags: '--fail-on <level>', description: `Exit 1 when any finding is at or above this level: ${FAIL_ON_LEVELS.join(' | ')}` },
33
+ { flags: '--json', description: 'Print only the final result JSON (progress goes to stderr)' },
34
+ { flags: '--no-wait', description: 'Start the job, print its id and exit' },
35
+ ],
36
+ async action(opts, hooks = {}) {
37
+ await runGuarded(() => {
38
+ const o = { ...opts, profile: opts.profile || undefined, region: opts.region || undefined };
39
+ return securityCodeReview(o, (hooks.reviewDeps ?? reviewDeps)(o));
40
+ }, hooks);
41
+ },
42
+ };
43
+ //# sourceMappingURL=code-review.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-review.js","sourceRoot":"","sources":["../../../../src/commands/security/code-review.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { type FindingsOptions } from '../../security/review.js';
2
+ import { type ReviewHooks } from './code-review.js';
3
+ declare const _default: {
4
+ description: string;
5
+ options: {
6
+ flags: string;
7
+ description: string;
8
+ }[];
9
+ action(opts: FindingsOptions & {
10
+ pentest?: boolean | string;
11
+ includeFalsePositives?: boolean;
12
+ }, hooks?: ReviewHooks): Promise<void>;
13
+ };
14
+ export default _default;
15
+ //# sourceMappingURL=findings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findings.d.ts","sourceRoot":"","sources":["../../../../src/commands/security/findings.ts"],"names":[],"mappings":"AACA,OAAO,EAAoC,KAAK,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAElG,OAAO,EAAqC,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;;;;;;;iBAelE,eAAe,GAAG;QAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAAC;QAAC,qBAAqB,CAAC,EAAE,OAAO,CAAA;KAAE,UAAS,WAAW;;AAb1H,wBAyBE"}
@@ -0,0 +1,31 @@
1
+ import { runGuarded } from '../enable/security.js';
2
+ import { FAIL_ON_LEVELS, securityFindings } from '../../security/review.js';
3
+ import { securityPentestFindings } from '../../security/pentest.js';
4
+ import { REVIEW_TARGET_OPTIONS, reviewDeps } from './code-review.js';
5
+ export default {
6
+ description: 'List the findings of this repo\'s latest AWS Security Agent code review (or, with --pentest, its penetration test) and cache them for the dashboard (read-only)',
7
+ options: [
8
+ ...REVIEW_TARGET_OPTIONS,
9
+ { flags: '--job <id>', description: 'A specific code review job (default: the latest for this repo)' },
10
+ { flags: '--latest', description: 'The latest job for this repo (the default)' },
11
+ { flags: '--severity <level>', description: `Show only findings at or above: ${FAIL_ON_LEVELS.join(' | ')}` },
12
+ { flags: '--pentest [job]', description: 'Read the latest (or given) penetration-test job instead of a code review' },
13
+ { flags: '--include-false-positives', description: 'With --pentest: show findings the agent rated FALSE_POSITIVE confidence' },
14
+ { flags: '--wait', description: 'If the job is still running, wait for it' },
15
+ { flags: '--timeout <minutes>', description: 'How long --wait waits (code review: 30; pentest: 360)' },
16
+ { flags: '--json', description: 'Print only the result JSON' },
17
+ ],
18
+ async action(opts, hooks = {}) {
19
+ await runGuarded(() => {
20
+ const deps = (hooks.reviewDeps ?? reviewDeps)(opts);
21
+ if (opts.pentest !== undefined && opts.pentest !== false) {
22
+ const job = typeof opts.pentest === 'string' ? opts.pentest : opts.job;
23
+ const o = { ...opts, profile: opts.profile || undefined, region: opts.region || undefined, job };
24
+ return securityPentestFindings(o, deps);
25
+ }
26
+ const o = { ...opts, profile: opts.profile || undefined, region: opts.region || undefined };
27
+ return securityFindings(o, deps);
28
+ }, hooks);
29
+ },
30
+ };
31
+ //# sourceMappingURL=findings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"findings.js","sourceRoot":"","sources":["../../../../src/commands/security/findings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAwB,MAAM,0BAA0B,CAAC;AAClG,OAAO,EAAE,uBAAuB,EAAuB,MAAM,2BAA2B,CAAC;AACzF,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAoB,MAAM,kBAAkB,CAAC;AAEvF,eAAe;IACb,WAAW,EAAE,iKAAiK;IAC9K,OAAO,EAAE;QACP,GAAG,qBAAqB;QACxB,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,gEAAgE,EAAE;QACtG,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,4CAA4C,EAAE;QAChF,EAAE,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,mCAAmC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;QAC7G,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,0EAA0E,EAAE;QACrH,EAAE,KAAK,EAAE,2BAA2B,EAAE,WAAW,EAAE,yEAAyE,EAAE;QAC9H,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,0CAA0C,EAAE;QAC5E,EAAE,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,uDAAuD,EAAE;QACtG,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;KAC/D;IACD,KAAK,CAAC,MAAM,CAAC,IAAuF,EAAE,QAAqB,EAAE;QAC3H,MAAM,UAAU,CAAC,GAAG,EAAE;YACpB,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,KAAK,EAAE,CAAC;gBACzD,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;gBACvE,MAAM,CAAC,GAAmB,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,GAAG,EAAE,CAAC;gBACjH,OAAO,uBAAuB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;YAC1C,CAAC;YACD,MAAM,CAAC,GAAoB,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAC7G,OAAO,gBAAgB,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QACnC,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;CACF,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type RunHooks } from '../enable/security.js';
2
+ import { type PentestApp, type PentestOptions } from '../../security/pentest.js';
3
+ import type { ReviewDeps } from '../../security/review.js';
4
+ export interface PentestHooks extends RunHooks {
5
+ reviewDeps?: (opts: PentestOptions) => ReviewDeps;
6
+ /** Test seam: inject a fake adapter so the orchestration runs with no cdk/docker. */
7
+ app?: (opts: PentestOptions) => PentestApp;
8
+ }
9
+ declare const _default: {
10
+ description: string;
11
+ options: {
12
+ flags: string;
13
+ description: string;
14
+ }[];
15
+ action(opts: PentestOptions, hooks?: PentestHooks): Promise<void>;
16
+ };
17
+ export default _default;
18
+ //# sourceMappingURL=pentest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pentest.d.ts","sourceRoot":"","sources":["../../../../src/commands/security/pentest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAmC,KAAK,UAAU,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAElH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAE3D,MAAM,WAAW,YAAa,SAAQ,QAAQ;IAC5C,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,UAAU,CAAC;IAClD,qFAAqF;IACrF,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,KAAK,UAAU,CAAC;CAC5C;;;;;;;iBAqBoB,cAAc,UAAS,YAAY;;AAnBxD,wBA0BE"}
@@ -0,0 +1,32 @@
1
+ import { runGuarded } from '../enable/security.js';
2
+ import { reviewDeps } from './code-review.js';
3
+ import { FAIL_ON_LEVELS, securityPentest } from '../../security/pentest.js';
4
+ import { dockerfileApp } from '../../security/pentest-dockerfile.js';
5
+ export default {
6
+ description: 'Deploy this repo\'s app into a temporary private VPC and run an AWS Security Agent penetration test against it',
7
+ options: [
8
+ { flags: '--app-type <type>', description: 'How to build and deploy the app (default: dockerfile; v1 ships only dockerfile)' },
9
+ { flags: '--path <dir>', description: 'The repository top level (default: the current directory)' },
10
+ { flags: '--app-dir <dir>', description: 'Docker build context, relative to the repo root (default: "path" in .prism/pentest.json, else .)' },
11
+ { flags: '--dockerfile <file>', description: 'Dockerfile, relative to the repo root (default: "dockerfile" in .prism/pentest.json, else <app-dir>/Dockerfile)' },
12
+ { flags: '--wait', description: 'Wait for the job and print findings (default: do not wait — a run takes hours)' },
13
+ { flags: '--timeout <minutes>', description: 'How long --wait waits (default: 360)' },
14
+ { flags: '--keep', description: 'Do not tear the environment down after the job (remove it later with --cleanup)' },
15
+ { flags: '--status', description: 'Refresh and print the latest pentest job; tear down once it has finished. No deploy' },
16
+ { flags: '--cleanup', description: 'Tear down a prior run\'s environment now and exit. No deploy' },
17
+ { flags: '--dry-run', description: 'Show the plan, target and cost; deploy and start nothing' },
18
+ { flags: '--yes', description: 'Approve the deploy and the pentest without a prompt (CI and other non-interactive use)' },
19
+ { flags: '--include-false-positives', description: 'Show findings the agent rated FALSE_POSITIVE confidence (hidden by default)' },
20
+ { flags: '--fail-on <level>', description: `Exit 1 on a non-false-positive finding at or above this level: ${FAIL_ON_LEVELS.join(' | ')}` },
21
+ { flags: '--profile <name>', description: 'AWS CLI profile (default: none; the standard credential chain)' },
22
+ { flags: '--region <region>', description: 'AWS region (default: AWS_REGION, AWS_DEFAULT_REGION, else the profile\'s configured region)' },
23
+ ],
24
+ async action(opts, hooks = {}) {
25
+ await runGuarded(() => {
26
+ const o = { ...opts, profile: opts.profile || undefined, region: opts.region || undefined };
27
+ const app = (hooks.app ?? ((x) => dockerfileApp({ profile: x.profile })))(o);
28
+ return securityPentest(o, (hooks.reviewDeps ?? reviewDeps)(o), app);
29
+ }, hooks);
30
+ },
31
+ };
32
+ //# sourceMappingURL=pentest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pentest.js","sourceRoot":"","sources":["../../../../src/commands/security/pentest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAiB,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,eAAe,EAAwC,MAAM,2BAA2B,CAAC;AAClH,OAAO,EAAE,aAAa,EAAE,MAAM,sCAAsC,CAAC;AASrE,eAAe;IACb,WAAW,EAAE,gHAAgH;IAC7H,OAAO,EAAE;QACP,EAAE,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,iFAAiF,EAAE;QAC9H,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,2DAA2D,EAAE;QACnG,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,kGAAkG,EAAE;QAC7I,EAAE,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,iHAAiH,EAAE;QAChK,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,gFAAgF,EAAE;QAClH,EAAE,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,sCAAsC,EAAE;QACrF,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,iFAAiF,EAAE;QACnH,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,qFAAqF,EAAE;QACzH,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,8DAA8D,EAAE;QACnG,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,0DAA0D,EAAE;QAC/F,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,wFAAwF,EAAE;QACzH,EAAE,KAAK,EAAE,2BAA2B,EAAE,WAAW,EAAE,6EAA6E,EAAE;QAClI,EAAE,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,kEAAkE,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;QAC3I,EAAE,KAAK,EAAE,kBAAkB,EAAE,WAAW,EAAE,gEAAgE,EAAE;QAC5G,EAAE,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,6FAA6F,EAAE;KAC3I;IACD,KAAK,CAAC,MAAM,CAAC,IAAoB,EAAE,QAAsB,EAAE;QACzD,MAAM,UAAU,CAAC,GAAG,EAAE;YACpB,MAAM,CAAC,GAAmB,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAC5G,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACtE,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;CACF,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type ThreatModelOptions } from '../../security/threat-model.js';
2
+ import { type ReviewHooks } from './code-review.js';
3
+ declare const _default: {
4
+ description: string;
5
+ options: ({
6
+ flags: string;
7
+ description: string;
8
+ } | {
9
+ flags: string;
10
+ description: string;
11
+ parser: (v: string, prev?: string[]) => string[];
12
+ })[];
13
+ action(opts: ThreatModelOptions, hooks?: ReviewHooks): Promise<void>;
14
+ };
15
+ export default _default;
16
+ //# sourceMappingURL=threat-model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threat-model.d.ts","sourceRoot":"","sources":["../../../../src/commands/security/threat-model.ts"],"names":[],"mappings":"AAEA,OAAO,EAA+C,KAAK,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACtH,OAAO,EAAqC,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;;;;;;;;;oBAEnE,MAAM,SAAQ,MAAM,EAAE;;iBAarB,kBAAkB,UAAS,WAAW;;AAX3D,wBAiBE"}
@@ -0,0 +1,24 @@
1
+ import { runGuarded } from '../enable/security.js';
2
+ import { FAIL_ON_LEVELS } from '../../security/review.js';
3
+ import { DEFAULT_TM_TIMEOUT_MIN, securityThreatModel } from '../../security/threat-model.js';
4
+ import { REVIEW_TARGET_OPTIONS, reviewDeps } from './code-review.js';
5
+ const collect = (v, prev = []) => [...prev, v];
6
+ export default {
7
+ description: 'Run an AWS Security Agent threat model of this repo at HEAD, focused by design docs, wait for it and print the threats',
8
+ options: [
9
+ ...REVIEW_TARGET_OPTIONS,
10
+ { flags: '--doc <path>', description: 'A design doc (scope doc) committed in HEAD, repeatable (default: .kiro/specs/*/design.md and requirements.md)', parser: collect },
11
+ { flags: '--no-docs', description: 'Model the source alone, with no scope docs' },
12
+ { flags: '--timeout <minutes>', description: `How long to wait for the job (default: ${DEFAULT_TM_TIMEOUT_MIN})` },
13
+ { flags: '--fail-on <level>', description: `Exit 1 when any threat is at or above this level: ${FAIL_ON_LEVELS.join(' | ')}` },
14
+ { flags: '--json', description: 'Print only the final result JSON (progress goes to stderr)' },
15
+ { flags: '--no-wait', description: 'Start the job, print its id and exit' },
16
+ ],
17
+ async action(opts, hooks = {}) {
18
+ await runGuarded(() => {
19
+ const o = { ...opts, profile: opts.profile || undefined, region: opts.region || undefined };
20
+ return securityThreatModel(o, (hooks.reviewDeps ?? reviewDeps)(o));
21
+ }, hooks);
22
+ },
23
+ };
24
+ //# sourceMappingURL=threat-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threat-model.js","sourceRoot":"","sources":["../../../../src/commands/security/threat-model.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,mBAAmB,EAA2B,MAAM,gCAAgC,CAAC;AACtH,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAoB,MAAM,kBAAkB,CAAC;AAEvF,MAAM,OAAO,GAAG,CAAC,CAAS,EAAE,OAAiB,EAAE,EAAE,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC;AAEjE,eAAe;IACb,WAAW,EAAE,wHAAwH;IACrI,OAAO,EAAE;QACP,GAAG,qBAAqB;QACxB,EAAE,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,+GAA+G,EAAE,MAAM,EAAE,OAAO,EAAE;QACxK,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,4CAA4C,EAAE;QACjF,EAAE,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,0CAA0C,sBAAsB,GAAG,EAAE;QAClH,EAAE,KAAK,EAAE,mBAAmB,EAAE,WAAW,EAAE,qDAAqD,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;QAC9H,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,4DAA4D,EAAE;QAC9F,EAAE,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,sCAAsC,EAAE;KAC5E;IACD,KAAK,CAAC,MAAM,CAAC,IAAwB,EAAE,QAAqB,EAAE;QAC5D,MAAM,UAAU,CAAC,GAAG,EAAE;YACpB,MAAM,CAAC,GAAuB,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAChH,OAAO,mBAAmB,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrE,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;CACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { type ThreatsOptions } from '../../security/threat-model.js';
2
+ import { type ReviewHooks } from './code-review.js';
3
+ declare const _default: {
4
+ description: string;
5
+ options: {
6
+ flags: string;
7
+ description: string;
8
+ }[];
9
+ action(opts: ThreatsOptions, hooks?: ReviewHooks): Promise<void>;
10
+ };
11
+ export default _default;
12
+ //# sourceMappingURL=threats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threats.d.ts","sourceRoot":"","sources":["../../../../src/commands/security/threats.ts"],"names":[],"mappings":"AAEA,OAAO,EAA2C,KAAK,cAAc,EAAE,MAAM,gCAAgC,CAAC;AAC9G,OAAO,EAAqC,KAAK,WAAW,EAAE,MAAM,kBAAkB,CAAC;;;;;;;iBAalE,cAAc,UAAS,WAAW;;AAXvD,wBAiBE"}
@@ -0,0 +1,23 @@
1
+ import { runGuarded } from '../enable/security.js';
2
+ import { FAIL_ON_LEVELS } from '../../security/review.js';
3
+ import { DEFAULT_TM_TIMEOUT_MIN, securityThreats } from '../../security/threat-model.js';
4
+ import { REVIEW_TARGET_OPTIONS, reviewDeps } from './code-review.js';
5
+ export default {
6
+ description: 'List the threats of this repo\'s pending or latest (or --job) AWS Security Agent threat model and cache them for the dashboard (read-only)',
7
+ options: [
8
+ ...REVIEW_TARGET_OPTIONS,
9
+ { flags: '--job <id>', description: 'A specific threat model job (default: the pending one, else the latest for this repo)' },
10
+ { flags: '--latest', description: 'The latest job for this repo (the default)' },
11
+ { flags: '--severity <level>', description: `Show only threats at or above: ${FAIL_ON_LEVELS.join(' | ')}` },
12
+ { flags: '--wait', description: 'If the job is still running, wait for it' },
13
+ { flags: '--timeout <minutes>', description: `How long --wait waits (default: ${DEFAULT_TM_TIMEOUT_MIN})` },
14
+ { flags: '--json', description: 'Print only the result JSON' },
15
+ ],
16
+ async action(opts, hooks = {}) {
17
+ await runGuarded(() => {
18
+ const o = { ...opts, profile: opts.profile || undefined, region: opts.region || undefined };
19
+ return securityThreats(o, (hooks.reviewDeps ?? reviewDeps)(o));
20
+ }, hooks);
21
+ },
22
+ };
23
+ //# sourceMappingURL=threats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"threats.js","sourceRoot":"","sources":["../../../../src/commands/security/threats.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAuB,MAAM,gCAAgC,CAAC;AAC9G,OAAO,EAAE,qBAAqB,EAAE,UAAU,EAAoB,MAAM,kBAAkB,CAAC;AAEvF,eAAe;IACb,WAAW,EAAE,4IAA4I;IACzJ,OAAO,EAAE;QACP,GAAG,qBAAqB;QACxB,EAAE,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,uFAAuF,EAAE;QAC7H,EAAE,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,4CAA4C,EAAE;QAChF,EAAE,KAAK,EAAE,oBAAoB,EAAE,WAAW,EAAE,kCAAkC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,EAAE;QAC5G,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,0CAA0C,EAAE;QAC5E,EAAE,KAAK,EAAE,qBAAqB,EAAE,WAAW,EAAE,mCAAmC,sBAAsB,GAAG,EAAE;QAC3G,EAAE,KAAK,EAAE,QAAQ,EAAE,WAAW,EAAE,4BAA4B,EAAE;KAC/D;IACD,KAAK,CAAC,MAAM,CAAC,IAAoB,EAAE,QAAqB,EAAE;QACxD,MAAM,UAAU,CAAC,GAAG,EAAE;YACpB,MAAM,CAAC,GAAmB,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,SAAS,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAC5G,OAAO,eAAe,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACjE,CAAC,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;CACF,CAAC"}
@@ -1,14 +1,28 @@
1
+ import { type RunHooks } from '../enable/security.js';
2
+ import type { SecurityOptions } from '../../security/setup.js';
3
+ /**
4
+ * DEPRECATED alias for `prism-cli enable security`.
5
+ *
6
+ * The old command ran `cdk deploy --all --require-approval never`, always
7
+ * re-attached the application role, and wrote the code review id to an SSM
8
+ * parameter the CI eval gate never read. `enable security` replaces it: it
9
+ * deploys only the Security Agent stack after a diff and a confirmation, is
10
+ * idempotent, and writes the per-repo parameter the gate uses. The command is
11
+ * kept so existing scripts and docs keep working; it takes the same flags as
12
+ * `enable security`, so a script that relied on the old unattended run needs
13
+ * --yes now.
14
+ */
15
+ export declare const DEPRECATION: string[];
1
16
  declare const _default: {
2
17
  description: string;
3
18
  options: {
4
19
  flags: string;
5
20
  description: string;
6
- default: string;
21
+ default?: string;
22
+ parser?: (v: string, prev?: string[]) => string[];
7
23
  }[];
8
- action(options: {
9
- profile: string;
10
- region: string;
11
- }): void;
24
+ /** Errors are handled once, in runEnableSecurity, for this alias too. `hooks` is for tests. */
25
+ action(opts: SecurityOptions, hooks?: RunHooks): Promise<void>;
12
26
  };
13
27
  export default _default;
14
28
  //# sourceMappingURL=setup.d.ts.map