@prism-d1/cli 1.3.0 → 1.4.1

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 (146) hide show
  1. package/dist/src/aws/advice.d.ts +33 -0
  2. package/dist/src/aws/advice.d.ts.map +1 -0
  3. package/dist/src/aws/advice.js +174 -0
  4. package/dist/src/aws/advice.js.map +1 -0
  5. package/dist/src/aws/check.d.ts +64 -0
  6. package/dist/src/aws/check.d.ts.map +1 -0
  7. package/dist/src/aws/check.js +269 -0
  8. package/dist/src/aws/check.js.map +1 -0
  9. package/dist/src/aws/connect.d.ts +65 -0
  10. package/dist/src/aws/connect.d.ts.map +1 -0
  11. package/dist/src/aws/connect.js +255 -0
  12. package/dist/src/aws/connect.js.map +1 -0
  13. package/dist/src/aws/connection.d.ts +67 -0
  14. package/dist/src/aws/connection.d.ts.map +1 -0
  15. package/dist/src/aws/connection.js +137 -0
  16. package/dist/src/aws/connection.js.map +1 -0
  17. package/dist/src/aws/recommend.d.ts +76 -0
  18. package/dist/src/aws/recommend.d.ts.map +1 -0
  19. package/dist/src/aws/recommend.js +267 -0
  20. package/dist/src/aws/recommend.js.map +1 -0
  21. package/dist/src/aws/run-check.d.ts +31 -0
  22. package/dist/src/aws/run-check.d.ts.map +1 -0
  23. package/dist/src/aws/run-check.js +92 -0
  24. package/dist/src/aws/run-check.js.map +1 -0
  25. package/dist/src/codewatch/globalHooks.d.ts +1 -3
  26. package/dist/src/codewatch/globalHooks.d.ts.map +1 -1
  27. package/dist/src/codewatch/globalHooks.js +2 -7
  28. package/dist/src/codewatch/globalHooks.js.map +1 -1
  29. package/dist/src/codewatch/hooks.d.ts +9 -2
  30. package/dist/src/codewatch/hooks.d.ts.map +1 -1
  31. package/dist/src/codewatch/hooks.js +13 -0
  32. package/dist/src/codewatch/hooks.js.map +1 -1
  33. package/dist/src/codewatch/results.d.ts +32 -1
  34. package/dist/src/codewatch/results.d.ts.map +1 -1
  35. package/dist/src/codewatch/results.js +4 -0
  36. package/dist/src/codewatch/results.js.map +1 -1
  37. package/dist/src/commands/_top/dashboard.js +1 -1
  38. package/dist/src/commands/_top/dashboard.js.map +1 -1
  39. package/dist/src/commands/aws/check.d.ts +25 -0
  40. package/dist/src/commands/aws/check.d.ts.map +1 -0
  41. package/dist/src/commands/aws/check.js +42 -0
  42. package/dist/src/commands/aws/check.js.map +1 -0
  43. package/dist/src/commands/aws/connect.d.ts +16 -0
  44. package/dist/src/commands/aws/connect.d.ts.map +1 -0
  45. package/dist/src/commands/aws/connect.js +39 -0
  46. package/dist/src/commands/aws/connect.js.map +1 -0
  47. package/dist/src/commands/aws/recommend.d.ts +12 -0
  48. package/dist/src/commands/aws/recommend.d.ts.map +1 -0
  49. package/dist/src/commands/aws/recommend.js +21 -0
  50. package/dist/src/commands/aws/recommend.js.map +1 -0
  51. package/dist/src/commands/bedrock-protection/scan-account.d.ts.map +1 -1
  52. package/dist/src/commands/bedrock-protection/scan-account.js +14 -35
  53. package/dist/src/commands/bedrock-protection/scan-account.js.map +1 -1
  54. package/dist/src/commands/bedrock-protection/scan-org.d.ts.map +1 -1
  55. package/dist/src/commands/bedrock-protection/scan-org.js +12 -5
  56. package/dist/src/commands/bedrock-protection/scan-org.js.map +1 -1
  57. package/dist/src/commands/bootstrapper/setup-otel-sync.d.ts.map +1 -1
  58. package/dist/src/commands/bootstrapper/setup-otel-sync.js +3 -2
  59. package/dist/src/commands/bootstrapper/setup-otel-sync.js.map +1 -1
  60. package/dist/src/commands/codewatch/pre-commit.d.ts.map +1 -1
  61. package/dist/src/commands/codewatch/pre-commit.js +3 -1
  62. package/dist/src/commands/codewatch/pre-commit.js.map +1 -1
  63. package/dist/src/commands/codewatch/pre-push.d.ts.map +1 -1
  64. package/dist/src/commands/codewatch/pre-push.js +3 -1
  65. package/dist/src/commands/codewatch/pre-push.js.map +1 -1
  66. package/dist/src/commands/codewatch/report.d.ts.map +1 -1
  67. package/dist/src/commands/codewatch/report.js +9 -3
  68. package/dist/src/commands/codewatch/report.js.map +1 -1
  69. package/dist/src/commands/enable/codeburn.d.ts.map +1 -1
  70. package/dist/src/commands/enable/codeburn.js +2 -3
  71. package/dist/src/commands/enable/codeburn.js.map +1 -1
  72. package/dist/src/commands/enable/codewatch.d.ts.map +1 -1
  73. package/dist/src/commands/enable/codewatch.js +2 -1
  74. package/dist/src/commands/enable/codewatch.js.map +1 -1
  75. package/dist/src/commands/enable/security.d.ts.map +1 -1
  76. package/dist/src/commands/enable/security.js +5 -7
  77. package/dist/src/commands/enable/security.js.map +1 -1
  78. package/dist/src/commands/security/code-review.d.ts.map +1 -1
  79. package/dist/src/commands/security/code-review.js +4 -3
  80. package/dist/src/commands/security/code-review.js.map +1 -1
  81. package/dist/src/commands/security/findings.d.ts.map +1 -1
  82. package/dist/src/commands/security/findings.js +6 -4
  83. package/dist/src/commands/security/findings.js.map +1 -1
  84. package/dist/src/commands/security/pentest.d.ts.map +1 -1
  85. package/dist/src/commands/security/pentest.js +4 -3
  86. package/dist/src/commands/security/pentest.js.map +1 -1
  87. package/dist/src/commands/security/threat-model.d.ts.map +1 -1
  88. package/dist/src/commands/security/threat-model.js +2 -1
  89. package/dist/src/commands/security/threat-model.js.map +1 -1
  90. package/dist/src/commands/security/threats.d.ts.map +1 -1
  91. package/dist/src/commands/security/threats.js +2 -1
  92. package/dist/src/commands/security/threats.js.map +1 -1
  93. package/dist/src/commands/securityagent/setup.d.ts.map +1 -1
  94. package/dist/src/dashboard/aws.d.ts +39 -0
  95. package/dist/src/dashboard/aws.d.ts.map +1 -0
  96. package/dist/src/dashboard/aws.js +35 -0
  97. package/dist/src/dashboard/aws.js.map +1 -0
  98. package/dist/src/dashboard/codewatch.js +1 -1
  99. package/dist/src/dashboard/codewatch.js.map +1 -1
  100. package/dist/src/dashboard/page.d.ts.map +1 -1
  101. package/dist/src/dashboard/page.js +34 -1
  102. package/dist/src/dashboard/page.js.map +1 -1
  103. package/dist/src/dashboard/payload.d.ts +3 -0
  104. package/dist/src/dashboard/payload.d.ts.map +1 -1
  105. package/dist/src/dashboard/payload.js +2 -0
  106. package/dist/src/dashboard/payload.js.map +1 -1
  107. package/dist/src/index.d.ts +2 -0
  108. package/dist/src/index.d.ts.map +1 -1
  109. package/dist/src/index.js +16 -1
  110. package/dist/src/index.js.map +1 -1
  111. package/dist/src/security/errors.d.ts +1 -0
  112. package/dist/src/security/errors.d.ts.map +1 -1
  113. package/dist/src/security/errors.js +2 -1
  114. package/dist/src/security/errors.js.map +1 -1
  115. package/dist/src/security/marker.d.ts +1 -1
  116. package/dist/src/security/marker.d.ts.map +1 -1
  117. package/dist/src/security/marker.js +4 -4
  118. package/dist/src/security/marker.js.map +1 -1
  119. package/dist/src/security/pentest.d.ts.map +1 -1
  120. package/dist/src/security/pentest.js +5 -1
  121. package/dist/src/security/pentest.js.map +1 -1
  122. package/dist/src/security/review.d.ts +4 -4
  123. package/dist/src/security/review.d.ts.map +1 -1
  124. package/dist/src/security/review.js +12 -8
  125. package/dist/src/security/review.js.map +1 -1
  126. package/dist/src/security/setup.d.ts +18 -2
  127. package/dist/src/security/setup.d.ts.map +1 -1
  128. package/dist/src/security/setup.js +32 -16
  129. package/dist/src/security/setup.js.map +1 -1
  130. package/dist/src/security/threat-model.d.ts +7 -0
  131. package/dist/src/security/threat-model.d.ts.map +1 -1
  132. package/dist/src/security/threat-model.js +37 -3
  133. package/dist/src/security/threat-model.js.map +1 -1
  134. package/dist/src/utils/audit-account.d.ts +50 -0
  135. package/dist/src/utils/audit-account.d.ts.map +1 -0
  136. package/dist/src/utils/audit-account.js +69 -0
  137. package/dist/src/utils/audit-account.js.map +1 -0
  138. package/dist/src/utils/audit-iam.d.ts +1 -1
  139. package/dist/src/utils/audit-iam.d.ts.map +1 -1
  140. package/dist/src/utils/audit-iam.js +11 -7
  141. package/dist/src/utils/audit-iam.js.map +1 -1
  142. package/dist/src/utils/otel-sync-schedule.d.ts +8 -0
  143. package/dist/src/utils/otel-sync-schedule.d.ts.map +1 -1
  144. package/dist/src/utils/otel-sync-schedule.js +16 -0
  145. package/dist/src/utils/otel-sync-schedule.js.map +1 -1
  146. package/package.json +1 -1
@@ -0,0 +1,76 @@
1
+ import { type Finding, type Severity } from '../utils/audit.js';
2
+ import { type PrismResult, type ResultEntry } from '../codewatch/results.js';
3
+ import { type Effort } from './advice.js';
4
+ import { type CheckOptions, type CheckRunDeps } from './run-check.js';
5
+ export declare const RECOMMEND_NOTICE = "No AWS calls (aws recommend): it reads the latest aws check result in .prism/results/. Nothing in AWS is changed.";
6
+ export interface RecommendOptions extends Pick<CheckOptions, 'profile' | 'region' | 'profileSource' | 'connection'> {
7
+ account?: string;
8
+ refresh?: boolean;
9
+ json?: boolean;
10
+ markdown?: boolean;
11
+ }
12
+ /** Why an INDETERMINATE check could not run, as far as its detail tells. */
13
+ export type IndeterminateCause = 'access-denied' | 'no-credential-report' | 'prerequisite' | 'not-integrated' | 'other';
14
+ export interface Recommendation {
15
+ /** fix: one or more FAILs. access: one or more INDETERMINATE checks (could not check). */
16
+ kind: 'fix' | 'access';
17
+ /** The recommendation key; checks that share one fix share it (e.g. "budgets"). */
18
+ id: string;
19
+ /** Every check this item covers, worst first. */
20
+ covers: {
21
+ id: string;
22
+ title: string;
23
+ detail: string;
24
+ }[];
25
+ section: string;
26
+ severity: Severity;
27
+ effort: Effort;
28
+ title: string;
29
+ why: string;
30
+ steps: string[];
31
+ command: string | null;
32
+ doc: string | null;
33
+ /** fix only: its position in the ranked list, 1-based across sections. */
34
+ number?: number;
35
+ /** access only. */
36
+ cause?: IndeterminateCause;
37
+ }
38
+ /** Account and region from the result, filled into the advice's `<account>` and `<region>`. */
39
+ export interface AdviceContext {
40
+ account?: string;
41
+ region?: string;
42
+ }
43
+ export declare const NO_REPORT_STEP = "No credential report exists yet. Run `prism-cli bedrock-protection scan-account` once (it generates one, which is a write) or `aws iam generate-credential-report`, then re-run aws check.";
44
+ /** Only an access-denied detail means "grant"; a missing report or a missing prerequisite says what to do first. */
45
+ export declare function indeterminateCause(f: Finding): IndeterminateCause;
46
+ type Rankable = Pick<Recommendation, 'severity' | 'effort' | 'id'>;
47
+ /** Severity first, then effort (quick wins first), then id. */
48
+ export declare function rank(a: Rankable, b: Rankable): number;
49
+ /** Check ids older results still carry, and the check that replaced them, so a cached result de-duplicates too. */
50
+ export declare const RETIRED_IDS: Record<string, string>;
51
+ export interface SectionAdvice {
52
+ section: string;
53
+ heading: string;
54
+ fixes: Recommendation[];
55
+ access: Recommendation[];
56
+ }
57
+ /**
58
+ * FAILs and INDETERMINATEs as recommendations, grouped by section in aws
59
+ * check's order, each group ranked. Fixes are numbered across sections, so a
60
+ * check that waits on a fix can name it ("item 2").
61
+ */
62
+ export declare function buildRecommendations(checks: Finding[], c?: AdviceContext): SectionAdvice[];
63
+ /** The sections a `--section` run left out; empty for a full run. */
64
+ export declare function skippedSections(r: PrismResult): string[];
65
+ /**
66
+ * The newest full aws-check result, optionally for one account and region,
67
+ * else the newest `--section` run. A section run is never read as "everything
68
+ * passed" (see `partialNote`).
69
+ */
70
+ export declare function latestCheck(entries: ResultEntry[], account?: string, region?: string): ResultEntry | null;
71
+ export declare function renderText(r: PrismResult, groups: SectionAdvice[], source: string): string[];
72
+ export declare function renderMarkdown(r: PrismResult, groups: SectionAdvice[], source: string): string;
73
+ /** Runs `aws recommend`. Returns the exit code. */
74
+ export declare function awsRecommend(input: RecommendOptions, d: CheckRunDeps): number;
75
+ export {};
76
+ //# sourceMappingURL=recommend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommend.d.ts","sourceRoot":"","sources":["../../../src/aws/recommend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,267 @@
1
+ /**
2
+ * `prism-cli aws recommend`: turns the latest aws check result for the
3
+ * account and region into a ranked fix list. Makes no AWS calls (except
4
+ * through --refresh, which runs aws check first) and no model calls.
5
+ */
6
+ import { writeFileSync } from 'node:fs';
7
+ import { join } from 'node:path';
8
+ import { severityRank } from '../utils/audit.js';
9
+ import { readResultEntries, RESULTS_DIR } from '../codewatch/results.js';
10
+ import { resolveRegion } from '../security/setup.js';
11
+ import { SECTIONS } from './check.js';
12
+ import { ADVICE, GROUPS } from './advice.js';
13
+ import { awsCheck, resultsRoot } from './run-check.js';
14
+ export const RECOMMEND_NOTICE = 'No AWS calls (aws recommend): it reads the latest aws check result in .prism/results/. Nothing in AWS is changed.';
15
+ const EFFORT_RANK = { quick: 0, medium: 1, large: 2 };
16
+ const fill = (text, c) => text.replace(/<region>/g, c.region || '<region>').replace(/<account>/g, c.account || '<account>');
17
+ const DENIED = /AccessDenied|UnauthorizedOperation|AuthorizationError|not authorized|Unauthorized/i;
18
+ export const NO_REPORT_STEP = 'No credential report exists yet. Run `prism-cli bedrock-protection scan-account` once (it generates one, which is a write) or `aws iam generate-credential-report`, then re-run aws check.';
19
+ /** Only an access-denied detail means "grant"; a missing report or a missing prerequisite says what to do first. */
20
+ export function indeterminateCause(f) {
21
+ const a = ADVICE[f.id];
22
+ if (a?.indeterminate)
23
+ return 'not-integrated';
24
+ if (/ReportNotPresent/.test(f.detail))
25
+ return 'no-credential-report';
26
+ if (DENIED.test(f.detail))
27
+ return 'access-denied';
28
+ if (a?.prerequisite)
29
+ return 'prerequisite';
30
+ return 'other';
31
+ }
32
+ /** Severity first, then effort (quick wins first), then id. */
33
+ export function rank(a, b) {
34
+ return severityRank(b.severity) - severityRank(a.severity) || EFFORT_RANK[a.effort] - EFFORT_RANK[b.effort] || a.id.localeCompare(b.id);
35
+ }
36
+ const unique = (xs) => [...new Set(xs)];
37
+ /** Check ids older results still carry, and the check that replaced them, so a cached result de-duplicates too. */
38
+ export const RETIRED_IDS = { 'baseline.root-mfa': 'bedrock.root-mfa' };
39
+ const adviceId = (id) => RETIRED_IDS[id] ?? id;
40
+ /** FAILs that share a recommendation key become one fix naming every check it covers. */
41
+ function fixes(fails, c) {
42
+ const byKey = new Map();
43
+ for (const f of fails) {
44
+ const key = ADVICE[adviceId(f.id)]?.key ?? adviceId(f.id);
45
+ byKey.set(key, [...(byKey.get(key) ?? []), f]);
46
+ }
47
+ return [...byKey.entries()].map(([key, fs]) => {
48
+ // The worst member sets the severity, the section and the lead text; the current id leads a retired one.
49
+ const retired = (id) => Number(id in RETIRED_IDS);
50
+ const members = fs.map((f) => ({ f, a: ADVICE[adviceId(f.id)], r: { severity: f.severity, effort: ADVICE[adviceId(f.id)]?.effort ?? 'medium', id: f.id } }))
51
+ .sort((x, y) => retired(x.f.id) - retired(y.f.id) || rank(x.r, y.r));
52
+ const lead = members[0];
53
+ const group = GROUPS[key];
54
+ // A check id with no mapping (an older result) falls back to the check's own remediation.
55
+ const steps = unique(members.flatMap(({ f, a }) => (a ? a.steps : f.remediation ? [f.remediation] : []))).map((x) => fill(x, c));
56
+ const cmd = members.map((m) => m.a?.command).find(Boolean);
57
+ const effort = members.map((m) => m.r.effort).sort((x, y) => EFFORT_RANK[x] - EFFORT_RANK[y])[0];
58
+ return {
59
+ kind: 'fix', id: key, section: lead.f.category, severity: lead.f.severity, effort,
60
+ covers: members.map(({ f }) => ({ id: f.id, title: f.title, detail: f.detail })),
61
+ title: fill(group?.title ?? lead.a?.title ?? lead.f.title, c), why: group?.why ?? lead.a?.why ?? lead.f.detail,
62
+ steps, command: cmd ? fill(cmd, c) : null, doc: lead.a?.doc ?? null,
63
+ };
64
+ });
65
+ }
66
+ function accessItem(f, numbers, c) {
67
+ const a = ADVICE[f.id];
68
+ const cause = indeterminateCause(f);
69
+ let title = `Could not check: ${f.title}`;
70
+ let step = 'The check got no answer (see what it found); re-run prism-cli aws check.';
71
+ if (cause === 'not-integrated') {
72
+ title = a.title;
73
+ step = a.indeterminate;
74
+ }
75
+ else if (cause === 'no-credential-report') {
76
+ title = 'Create an IAM credential report';
77
+ step = NO_REPORT_STEP;
78
+ }
79
+ else if (cause === 'access-denied') {
80
+ title = `Grant read access to check: ${f.title}`;
81
+ step = a?.needs?.length ? `Grant ${a.needs.join(', ')} (read-only), then re-run prism-cli aws check.` : 'Grant read access for this check, then re-run prism-cli aws check.';
82
+ }
83
+ else if (cause === 'prerequisite') {
84
+ const n = numbers.get(a.prerequisite);
85
+ title = `Checked after another fix: ${f.title}`;
86
+ step = `${GROUPS[a.prerequisite]?.first ?? `Fix ${a.prerequisite}`}${n ? ` in item ${n}` : ''} first, then re-run prism-cli aws check.`;
87
+ }
88
+ return {
89
+ kind: 'access', id: f.id, cause, section: f.category, severity: f.severity, effort: 'quick',
90
+ covers: [{ id: f.id, title: f.title, detail: f.detail }], title, why: 'The check could not run, so it is not a pass.',
91
+ steps: [fill(step, c)], command: null, doc: a?.doc ?? null,
92
+ };
93
+ }
94
+ /** INDETERMINATE items with the same step (three checks waiting on one credential report) become one. */
95
+ function mergeAccess(items) {
96
+ const out = new Map();
97
+ for (const x of [...items].sort(rank)) {
98
+ const prev = out.get(x.steps[0]);
99
+ if (prev)
100
+ prev.covers.push(...x.covers);
101
+ else
102
+ out.set(x.steps[0], { ...x, covers: [...x.covers] });
103
+ }
104
+ for (const x of out.values()) {
105
+ if (x.covers.length > 1 && (x.cause === 'access-denied' || x.cause === 'other'))
106
+ x.title = `${x.title.split(': ')[0]}: ${x.covers.map((v) => v.title).join('; ')}`;
107
+ }
108
+ return [...out.values()];
109
+ }
110
+ /**
111
+ * FAILs and INDETERMINATEs as recommendations, grouped by section in aws
112
+ * check's order, each group ranked. Fixes are numbered across sections, so a
113
+ * check that waits on a fix can name it ("item 2").
114
+ */
115
+ export function buildRecommendations(checks, c = {}) {
116
+ const fixList = fixes(checks.filter((f) => f.status === 'FAIL'), c);
117
+ const known = SECTIONS.map((s) => [s.name, s.heading]);
118
+ const extra = unique(checks.filter((f) => f.status !== 'PASS').map((f) => f.category))
119
+ .filter((s) => !known.some(([n]) => n === s)).map((s) => [s, s]);
120
+ const groups = [...known, ...extra].map(([section, heading]) => ({
121
+ section, heading, fixes: fixList.filter((r) => r.section === section).sort(rank), access: [],
122
+ }));
123
+ const numbers = new Map();
124
+ let n = 0;
125
+ for (const g of groups)
126
+ for (const x of g.fixes) {
127
+ x.number = ++n;
128
+ numbers.set(x.id, n);
129
+ }
130
+ const access = mergeAccess(checks.filter((f) => f.status === 'INDETERMINATE').map((f) => accessItem(f, numbers, c)));
131
+ for (const g of groups)
132
+ g.access = access.filter((x) => x.section === g.section);
133
+ return groups.filter((g) => g.fixes.length || g.access.length);
134
+ }
135
+ /** The sections a `--section` run left out; empty for a full run. */
136
+ export function skippedSections(r) {
137
+ const ran = r.aws_check?.sections;
138
+ return ran ? SECTIONS.map((s) => s.name).filter((n) => !ran.includes(n)) : [];
139
+ }
140
+ /**
141
+ * The newest full aws-check result, optionally for one account and region,
142
+ * else the newest `--section` run. A section run is never read as "everything
143
+ * passed" (see `partialNote`).
144
+ */
145
+ export function latestCheck(entries, account, region) {
146
+ const matching = entries
147
+ .filter((e) => e.result.kind === 'aws-check' && e.result.aws_check && (!account || e.result.aws_check.account === account) && (!region || e.result.aws_check.region === region))
148
+ .sort((a, b) => b.result.started_at.localeCompare(a.result.started_at));
149
+ return matching.find((e) => !skippedSections(e.result).length) ?? matching[0] ?? null;
150
+ }
151
+ const header = (r) => {
152
+ const c = r.aws_check;
153
+ return `account ${c.account}${c.alias ? ` (${c.alias})` : ''}, region ${c.region}`;
154
+ };
155
+ /** For a `--section` run: which sections it covers. null for a full run. */
156
+ function partialNote(r) {
157
+ if (!skippedSections(r).length)
158
+ return null;
159
+ return `This aws check covered only ${r.aws_check.sections.join(', ')} (a --section run); run prism-cli aws check for every section.`;
160
+ }
161
+ function nothingToFix(r) {
162
+ return partialNote(r) ? `Nothing to fix in ${r.aws_check.sections.join(', ')}; the other sections were not checked.` : 'Nothing to fix: every check passed.';
163
+ }
164
+ /** What the check found; one line per check when an item covers several. */
165
+ function found(x) {
166
+ if (x.covers.length === 1)
167
+ return [`Found: ${x.covers[0].detail}`];
168
+ return [`Covers ${x.covers.length} checks:`, ...x.covers.map((v) => `- ${v.title}: ${v.detail}`)];
169
+ }
170
+ const coversText = (x) => (x.covers.length > 1 && !x.title.includes(x.covers[1].title) ? ` (covers: ${x.covers.map((v) => v.title).join('; ')})` : '');
171
+ export function renderText(r, groups, source) {
172
+ const note = partialNote(r);
173
+ const out = [`AWS recommendations for ${header(r)}`, ` From aws check at ${r.started_at} (${source}).`, ...(note ? [` ${note}`] : []), ''];
174
+ if (!groups.length)
175
+ return [...out, nothingToFix(r)];
176
+ for (const g of groups) {
177
+ out.push(`── ${g.heading} ──`, '');
178
+ for (const x of g.fixes) {
179
+ out.push(` ${x.number}. [${x.severity} · ${x.effort}] ${x.title}`, ` Why: ${x.why}`, ...found(x).map((l) => ` ${l}`));
180
+ for (const s of x.steps)
181
+ out.push(` - ${s}`);
182
+ if (x.command)
183
+ out.push(` Run: ${x.command}`);
184
+ if (x.doc)
185
+ out.push(` Docs: ${x.doc}`);
186
+ out.push('');
187
+ }
188
+ if (g.access.length) {
189
+ out.push(' Could not check (not a pass):');
190
+ for (const x of g.access)
191
+ out.push(` - [${x.severity}] ${x.title}: ${x.steps[0]}${coversText(x)}`);
192
+ out.push('');
193
+ }
194
+ }
195
+ return out;
196
+ }
197
+ export function renderMarkdown(r, groups, source) {
198
+ const out = [`# AWS recommendations`, '', `For ${header(r)}, from \`prism-cli aws check\` at ${r.started_at} (${source}). Generated by \`prism-cli aws recommend\`; no AWS or model calls.`, ''];
199
+ const note = partialNote(r);
200
+ if (note)
201
+ out.push(note, '');
202
+ if (!groups.length)
203
+ out.push(nothingToFix(r), '');
204
+ for (const g of groups) {
205
+ out.push(`## ${g.heading}`, '');
206
+ for (const x of g.fixes) {
207
+ out.push(`### ${x.number}. ${x.title}`, '', `**${x.severity}**, effort ${x.effort}. ${x.why}`, '', ...found(x), '');
208
+ for (const s of x.steps)
209
+ out.push(`- ${s}`);
210
+ if (x.command)
211
+ out.push(`- Run \`${x.command}\``);
212
+ if (x.doc)
213
+ out.push(`- Docs: ${x.doc}`);
214
+ out.push('');
215
+ }
216
+ if (g.access.length) {
217
+ out.push('Could not check (not a pass):', '');
218
+ for (const x of g.access)
219
+ out.push(`- **${x.severity}** ${x.title}: ${x.steps[0]}${coversText(x)}`);
220
+ out.push('');
221
+ }
222
+ }
223
+ return out.join('\n');
224
+ }
225
+ /** Runs `aws recommend`. Returns the exit code. */
226
+ export function awsRecommend(input, d) {
227
+ const say = input.json ? d.err : d.log;
228
+ say(input.refresh ? 'aws recommend --refresh: runs prism-cli aws check first (read-only), then reads its result.' : RECOMMEND_NOTICE);
229
+ say('');
230
+ if (input.account && !/^\d{12}$/.test(input.account)) {
231
+ say(`Error: --account must be a 12-digit account id, got "${input.account}".`);
232
+ return 1;
233
+ }
234
+ let account = input.account ?? input.connection?.account;
235
+ const region = resolveRegion(input, d)?.region;
236
+ if (input.refresh) {
237
+ const o = awsCheck({ ...input, json: false, report: !input.json }, { ...d, log: say });
238
+ if (o.code !== 0 && !o.result)
239
+ return o.code;
240
+ account = o.result?.aws_check?.account ?? account;
241
+ say('');
242
+ }
243
+ const roots = [...new Set([resultsRoot(d), d.home])];
244
+ const entry = latestCheck(roots.flatMap((root) => readResultEntries(root).map((e) => ({ ...e, root }))), account, region);
245
+ if (!entry) {
246
+ const scope = [account ? `account ${account}` : '', region ? `region ${region}` : ''].filter(Boolean).join(', ');
247
+ say(`No aws check result${scope ? ` for ${scope}` : ''}. Run prism-cli aws check first, or prism-cli aws recommend --refresh.`);
248
+ return 1;
249
+ }
250
+ const source = join(entry.root, RESULTS_DIR, `${entry.id}.json`);
251
+ const c = entry.result.aws_check;
252
+ const groups = buildRecommendations(c.checks, { account: c.account, region: c.region });
253
+ if (!account)
254
+ say(`Using the latest result (${entry.result.aws_check.account}); pass --account to choose another account.`);
255
+ if (input.json)
256
+ d.log(JSON.stringify({ schema: 'prism.aws-recommend.v1', account: entry.result.aws_check.account, region: entry.result.aws_check.region, checked_at: entry.result.started_at, sections: c.sections, source, groups }, null, 2));
257
+ else
258
+ for (const l of renderText(entry.result, groups, source))
259
+ d.log(l);
260
+ if (input.markdown) {
261
+ const md = join(entry.root, RESULTS_DIR, `${entry.id}.recommend.md`);
262
+ writeFileSync(md, renderMarkdown(entry.result, groups, source), { mode: 0o600 });
263
+ say(`Wrote ${md}`);
264
+ }
265
+ return 0;
266
+ }
267
+ //# sourceMappingURL=recommend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recommend.js","sourceRoot":"","sources":["../../../src/aws/recommend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ import type { RunResult } from '../utils/exec.js';
2
+ import { type PrismResult } from '../codewatch/results.js';
3
+ import { type SecurityOptions } from '../security/setup.js';
4
+ export declare const CHECK_NOTICE = "Read-only (aws check): every AWS call is a describe, get or list; nothing in AWS is changed. The result is saved to .prism/results/.";
5
+ export interface CheckOptions extends Pick<SecurityOptions, 'profile' | 'region' | 'profileSource' | 'connection'> {
6
+ section?: string[];
7
+ failOn?: string;
8
+ json?: boolean;
9
+ /** false: save the result but print no report (aws recommend --refresh --json). */
10
+ report?: boolean;
11
+ }
12
+ export interface CheckRunDeps {
13
+ env: NodeJS.ProcessEnv;
14
+ home: string;
15
+ cwd(): string;
16
+ configRegion(profile?: string): string | null;
17
+ awsVersion(): string | null;
18
+ git(args: string[]): RunResult;
19
+ log(line?: string): void;
20
+ err(line?: string): void;
21
+ now(): Date;
22
+ }
23
+ export interface CheckOutcome {
24
+ code: number;
25
+ result?: PrismResult;
26
+ path?: string;
27
+ }
28
+ /** Where results go: the repo of the working directory, else ~ (so ~/.prism/results/). */
29
+ export declare function resultsRoot(d: Pick<CheckRunDeps, 'cwd' | 'git' | 'home'>): string;
30
+ export declare function awsCheck(input: CheckOptions, d: CheckRunDeps): CheckOutcome;
31
+ //# sourceMappingURL=run-check.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-check.d.ts","sourceRoot":"","sources":["../../../src/aws/run-check.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAA8C,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACvG,OAAO,EAAkE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAI5H,eAAO,MAAM,YAAY,yIAAyI,CAAC;AAEnK,MAAM,WAAW,YAAa,SAAQ,IAAI,CAAC,eAAe,EAAE,SAAS,GAAG,QAAQ,GAAG,eAAe,GAAG,YAAY,CAAC;IAChH,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,mFAAmF;IACnF,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,GAAG,EAAE,MAAM,CAAC,UAAU,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,IAAI,MAAM,CAAC;IACd,YAAY,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9C,UAAU,IAAI,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC/B,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,CAAC,IAAI,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,IAAI,IAAI,CAAC;CACb;AAED,MAAM,WAAW,YAAY;IAAG,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,WAAW,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE;AAEnF,0FAA0F;AAC1F,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC,GAAG,MAAM,CAEjF;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,YAAY,CAgE3E"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Runs `prism-cli aws check`: resolve the target, print the identity header,
3
+ * run the selected sections, save the result (kind aws-check) and print the
4
+ * report. Synchronous on purpose: every AWS call is a blocking CLI read, and
5
+ * the tests drive it through the fake `aws` binary.
6
+ */
7
+ import { aws } from '../utils/aws.js';
8
+ import { parseFailOn, renderReport } from '../utils/audit.js';
9
+ import { makeResult, writeResult } from '../codewatch/results.js';
10
+ import { NO_REGION_MESSAGE, printIdentity, resolveRegion } from '../security/setup.js';
11
+ import { repoRootOf } from './connection.js';
12
+ import { breaching, countFindings, failBySeverity, securityContext, selectSections } from './check.js';
13
+ export const CHECK_NOTICE = 'Read-only (aws check): every AWS call is a describe, get or list; nothing in AWS is changed. The result is saved to .prism/results/.';
14
+ /** Where results go: the repo of the working directory, else ~ (so ~/.prism/results/). */
15
+ export function resultsRoot(d) {
16
+ return repoRootOf(d.cwd(), d.git) ?? d.home;
17
+ }
18
+ export function awsCheck(input, d) {
19
+ const say = input.json ? d.err : d.log;
20
+ // Bad flags print only the Error line, before the notice.
21
+ let failOn;
22
+ try {
23
+ failOn = parseFailOn(input.failOn);
24
+ }
25
+ catch (e) {
26
+ say(`Error: ${e.message}`);
27
+ return { code: 1 };
28
+ }
29
+ const sections = selectSections(input.section);
30
+ if ('error' in sections) {
31
+ say(`Error: ${sections.error}`);
32
+ return { code: 1 };
33
+ }
34
+ say(CHECK_NOTICE);
35
+ say('');
36
+ const r = resolveRegion(input, d);
37
+ if (!r) {
38
+ say(`Error: ${NO_REGION_MESSAGE} Or save one with prism-cli aws connect.`);
39
+ return { code: 1 };
40
+ }
41
+ const region = r.region;
42
+ // The region is pinned in the child env too, so global-endpoint calls (IAM, budgets) never depend on profile config.
43
+ const target = { profile: input.profile, env: { AWS_PAGER: '', AWS_REGION: region, AWS_DEFAULT_REGION: region } };
44
+ const who = aws(['sts', 'get-caller-identity'], target);
45
+ const account = who.ok ? String(who.json?.Account || '') : '';
46
+ if (!account) {
47
+ const why = who.errorCode || who.raw.split('\n').map((l) => l.trim()).filter(Boolean).pop() || 'no account in the response';
48
+ say(`Error: cannot resolve the AWS identity: ${why}. Sign in (e.g. aws sso login), pass --profile, or run prism-cli aws connect.`);
49
+ return { code: 1 };
50
+ }
51
+ const a = aws(['iam', 'list-account-aliases'], target);
52
+ const alias = a.ok && a.json?.AccountAliases?.[0] ? String(a.json.AccountAliases[0]) : null;
53
+ const opts = { ...input, region, regionSource: r.source };
54
+ const security = securityContext(opts, (args, rg) => aws([...args, '--region', rg], target), d.env, d.awsVersion, say);
55
+ printIdentity(security, { account, arn: String(who.json?.Arn || ''), alias });
56
+ say('');
57
+ const started = d.now().toISOString();
58
+ const ctx = { target, account, region, home: d.home, security };
59
+ const findings = sections.flatMap((s) => s.run(ctx));
60
+ const info = {
61
+ account, alias, region, profile: input.profile ?? null, profile_source: input.profileSource ?? null,
62
+ sections: sections.map((s) => s.name),
63
+ section_counts: Object.fromEntries(sections.map((s) => [s.name, countFindings(findings.filter((f) => f.category === s.name))])),
64
+ counts: countFindings(findings),
65
+ fail_by_severity: failBySeverity(findings),
66
+ checks: findings,
67
+ };
68
+ const result = makeResult({
69
+ kind: 'aws-check', hook: 'manual', tool: 'prism-cli', started_at: started, finished_at: d.now().toISOString(),
70
+ status: info.counts.fail || info.counts.indeterminate ? 'findings' : 'ok',
71
+ summary: `${info.counts.pass} pass, ${info.counts.fail} fail, ${info.counts.indeterminate} indeterminate`,
72
+ aws_check: info,
73
+ });
74
+ const path = writeResult(resultsRoot(d), result);
75
+ if (input.report !== false)
76
+ renderReport(findings, {
77
+ title: '☁️ AWS account check',
78
+ subtitle: `Account: ${account}${alias ? ` (${alias})` : ''} Region: ${region}`,
79
+ groups: sections.map((s) => [s.name, s.heading]),
80
+ json: !!input.json,
81
+ jsonContext: { account, alias, region, sections: info.sections, section_counts: info.section_counts, result_path: path },
82
+ });
83
+ say(`Saved ${path}`);
84
+ say('Next: prism-cli aws recommend (turns these results into a ranked fix list; no AWS calls).');
85
+ const breach = breaching(findings, failOn);
86
+ if (breach.length) {
87
+ d.err(`❌ ${breach.length} finding(s) at or above ${failOn}: ${breach.map((f) => f.id).join(', ')}`);
88
+ return { code: 1, result, path };
89
+ }
90
+ return { code: 0, result, path };
91
+ }
92
+ //# sourceMappingURL=run-check.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-check.js","sourceRoot":"","sources":["../../../src/aws/run-check.ts"],"names":[],"mappings":"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"}
@@ -4,8 +4,7 @@ export declare const GLOBAL_MARKER = "# prism-codewatch-global";
4
4
  export declare const PREVIOUS_FILE = ".previous-hookspath";
5
5
  /** With --force, the replaced hooks directory, whose hooks are chained after ours. */
6
6
  export declare const CHAIN_FILE = ".chain-hookspath";
7
- /** `git config prism.codewatch false` in a repo skips codewatch there (repo-local hooks still run). */
8
- export declare const OPT_OUT_KEY = "prism.codewatch";
7
+ export { OPT_OUT_KEY, isOptedOut } from './hooks.js';
9
8
  export declare function globalHooksDir(home?: string): string;
10
9
  /** git expands a leading ~ in core.hooksPath; do the same so values compare. */
11
10
  export declare function expandHome(p: string, home?: string): string;
@@ -48,5 +47,4 @@ export interface GlobalStatus {
48
47
  export declare function globalStatus(home?: string): GlobalStatus;
49
48
  /** A repo's own core.hooksPath (husky and similar), set in its local config. */
50
49
  export declare function repoLocalHooksPath(repo: string): string | null;
51
- export declare function isOptedOut(repo: string): boolean;
52
50
  //# sourceMappingURL=globalHooks.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"globalHooks.d.ts","sourceRoot":"","sources":["../../../src/codewatch/globalHooks.ts"],"names":[],"mappings":"AAgBA,OAAO,EAA6C,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAEzF,eAAO,MAAM,aAAa,6BAA6B,CAAC;AACxD,mGAAmG;AACnG,eAAO,MAAM,aAAa,wBAAwB,CAAC;AACnD,sFAAsF;AACtF,eAAO,MAAM,UAAU,qBAAqB,CAAC;AAC7C,uGAAuG;AACvG,eAAO,MAAM,WAAW,oBAAoB,CAAC;AAE7C,wBAAgB,cAAc,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAE/D;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,MAAM,CAItE;AAOD,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAGnD;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,GAAE,MAAkB,GAAG,OAAO,CAItF;AAiDD,eAAO,MAAM,wBAAwB,QAqBf,CAAC;AAEvB,eAAO,MAAM,sBAAsB,QAcd,CAAC;AAEtB,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAG3D,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,GAChG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,wBAAgB,aAAa,CAAC,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,mBAAmB,CA2BhG;AAMD,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAAC;IACxD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,iHAAiH;AACjH,wBAAgB,eAAe,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,qBAAqB,CA8BnF;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,GAAG,eAAe,GAAG,WAAW,GAAG,YAAY,CAAC;IAClE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAkB,GAAG,YAAY,CAOnE;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG9D;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGhD"}
1
+ {"version":3,"file":"globalHooks.d.ts","sourceRoot":"","sources":["../../../src/codewatch/globalHooks.ts"],"names":[],"mappings":"AAgBA,OAAO,EAA0D,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAEtG,eAAO,MAAM,aAAa,6BAA6B,CAAC;AACxD,mGAAmG;AACnG,eAAO,MAAM,aAAa,wBAAwB,CAAC;AACnD,sFAAsF;AACtF,eAAO,MAAM,UAAU,qBAAqB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAErD,wBAAgB,cAAc,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAE/D;AAED,gFAAgF;AAChF,wBAAgB,UAAU,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,MAAM,CAItE;AAOD,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAGnD;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,GAAE,MAAkB,GAAG,OAAO,CAItF;AAiDD,eAAO,MAAM,wBAAwB,QAqBf,CAAC;AAEvB,eAAO,MAAM,sBAAsB,QAcd,CAAC;AAEtB,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAG3D,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAC3B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,WAAW,EAAE,OAAO,CAAA;CAAE,GAChG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEpD,wBAAgB,aAAa,CAAC,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,mBAAmB,CA2BhG;AAMD,MAAM,WAAW,qBAAqB;IACpC,uCAAuC;IACvC,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG,YAAY,GAAG,SAAS,CAAC;IACxD,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB;AAED,iHAAiH;AACjH,wBAAgB,eAAe,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAA;CAAO,GAAG,qBAAqB,CA8BnF;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,WAAW,GAAG,eAAe,GAAG,WAAW,GAAG,YAAY,CAAC;IAClE,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,wBAAgB,YAAY,CAAC,IAAI,GAAE,MAAkB,GAAG,YAAY,CAOnE;AAED,gFAAgF;AAChF,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG9D"}
@@ -14,14 +14,13 @@ import { chmodSync, existsSync, mkdirSync, readdirSync, readFileSync, realpathSy
14
14
  import { homedir } from 'node:os';
15
15
  import { isAbsolute, join, resolve } from 'node:path';
16
16
  import { run } from '../utils/exec.js';
17
- import { BACKUP_SUFFIX, HOOK_MARKER, MANAGED_HOOKS } from './hooks.js';
17
+ import { BACKUP_SUFFIX, HOOK_MARKER, MANAGED_HOOKS, OPT_OUT_KEY } from './hooks.js';
18
18
  export const GLOBAL_MARKER = '# prism-codewatch-global';
19
19
  /** Saved value of the global core.hooksPath that --global replaced. Absent when there was none. */
20
20
  export const PREVIOUS_FILE = '.previous-hookspath';
21
21
  /** With --force, the replaced hooks directory, whose hooks are chained after ours. */
22
22
  export const CHAIN_FILE = '.chain-hookspath';
23
- /** `git config prism.codewatch false` in a repo skips codewatch there (repo-local hooks still run). */
24
- export const OPT_OUT_KEY = 'prism.codewatch';
23
+ export { OPT_OUT_KEY, isOptedOut } from './hooks.js';
25
24
  export function globalHooksDir(home = homedir()) {
26
25
  return join(home, '.prism', 'hooks');
27
26
  }
@@ -228,8 +227,4 @@ export function repoLocalHooksPath(repo) {
228
227
  const r = run('git', ['-C', repo, 'config', '--local', '--get', 'core.hooksPath']);
229
228
  return r.ok && r.stdout ? r.stdout : null;
230
229
  }
231
- export function isOptedOut(repo) {
232
- const r = run('git', ['-C', repo, 'config', '--bool', '--get', OPT_OUT_KEY]);
233
- return r.ok && r.stdout === 'false';
234
- }
235
230
  //# sourceMappingURL=globalHooks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"globalHooks.js","sourceRoot":"","sources":["../../../src/codewatch/globalHooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"globalHooks.js","sourceRoot":"","sources":["../../../src/codewatch/globalHooks.ts"],"names":[],"mappings":"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"}