@neurcode-ai/cli 0.16.8 → 0.16.9

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.
@@ -0,0 +1,255 @@
1
+ /**
2
+ * Repo Brain Impact Intelligence (V1) — deterministic + advisory change-impact
3
+ * analysis over the source-free local repo brain.
4
+ *
5
+ * Given a changed file (or set of changed files) this module answers the
6
+ * question an engineering manager actually asks about an AI change *before or
7
+ * after* it lands: what does this touch, who owns it, what is sensitive, who
8
+ * imports it, is it a hub, where are the nearby tests/docs, is the helper
9
+ * duplicated elsewhere, and what should a reviewer ask?
10
+ *
11
+ * Hard rules (shared with utils/local-repo-brain.ts and utils/guided-eval.ts):
12
+ * - Source-free: only relative paths, symbol *names*, counts, owner tokens,
13
+ * sensitive-kind labels, and hashes are read or emitted. Never source code,
14
+ * diff hunks, or file bodies.
15
+ * - Honest labelling: every finding is tagged `deterministic` (a compiled
16
+ * path / CODEOWNERS / static-import-graph fact) or `advisory` (a heuristic
17
+ * reuse / proximity / reviewer-question signal). We never present an
18
+ * advisory signal as a deterministic guarantee.
19
+ *
20
+ * The engine is pure (no I/O) — {@link computeRepoBrainImpact} takes an artifact
21
+ * (or null) and the changed paths. {@link buildRepoBrainImpactForRepo} is the
22
+ * thin I/O wrapper that reads (or builds) the brain and then computes.
23
+ */
24
+ import { type LocalRepoBrainArtifact, type LocalRepoBrainSensitiveKind } from './local-repo-brain';
25
+ export declare const REPO_BRAIN_IMPACT_SCHEMA_VERSION: "neurcode.repo-brain-impact.v1";
26
+ export declare const IMPACT_SUMMARY_SCHEMA_VERSION: "neurcode.impact-summary.v1";
27
+ /** Every finding is one of these two truth tiers — never blurred. */
28
+ export type ImpactLabel = 'deterministic' | 'advisory';
29
+ /** Coarse role of a file, derived deterministically from its path. */
30
+ export type ImpactFileRole = 'source' | 'test' | 'docs' | 'config' | 'runtime_governance' | 'generated' | 'data' | 'unknown';
31
+ /** A file imported by enough other files to be a structural hub. */
32
+ export declare const HIGH_FAN_IN_THRESHOLD = 5;
33
+ export interface ImpactChangedFile {
34
+ path: string;
35
+ /** Whether the path is present in the indexed brain (else classified by path only). */
36
+ indexed: boolean;
37
+ role: ImpactFileRole;
38
+ language: string | null;
39
+ module: string | null;
40
+ sensitiveKinds: LocalRepoBrainSensitiveKind[];
41
+ /** Declarations indexed in this file (null when not indexed). */
42
+ symbolCount: number | null;
43
+ /** Outbound import edges from this file (null when not indexed). */
44
+ importCount: number | null;
45
+ generated: boolean;
46
+ }
47
+ export interface ImpactOwnerMatch {
48
+ /** CODEOWNERS pattern that matched. */
49
+ pattern: string;
50
+ owners: string[];
51
+ /** Which of the changed paths this boundary covers. */
52
+ matchedPaths: string[];
53
+ /** True for the last-match-wins effective owner of at least one changed path. */
54
+ effective: boolean;
55
+ }
56
+ export interface ImpactSensitiveSurface {
57
+ path: string;
58
+ kinds: LocalRepoBrainSensitiveKind[];
59
+ }
60
+ export interface ImpactConsumer {
61
+ path: string;
62
+ role: ImpactFileRole;
63
+ /** Number of static import edges from this file into the changed set. */
64
+ edgeCount: number;
65
+ /** Up to a few of the changed paths this consumer imports. */
66
+ imports: string[];
67
+ }
68
+ export interface ImpactDependency {
69
+ /** The raw import specifier (e.g. "../retry" or "@scope/pkg"). */
70
+ target: string;
71
+ /** Resolved repo-relative file when the import is relative and in-repo. */
72
+ resolvedFile: string | null;
73
+ external: boolean;
74
+ }
75
+ export interface ImpactHotspot {
76
+ path: string;
77
+ score: number;
78
+ fanIn: number;
79
+ fanOut: number;
80
+ reasons: string[];
81
+ /** fanIn >= HIGH_FAN_IN_THRESHOLD — a structural hub. */
82
+ isHub: boolean;
83
+ }
84
+ export interface ImpactReuseAdvisory {
85
+ symbolName: string | null;
86
+ kind: string;
87
+ severity: string;
88
+ confidence: string;
89
+ files: string[];
90
+ reasonCodes: string[];
91
+ }
92
+ export type ImpactQuestionCategory = 'owners' | 'sensitive' | 'fanout' | 'reuse' | 'tests' | 'config' | 'general';
93
+ export interface ImpactReviewQuestion {
94
+ category: ImpactQuestionCategory;
95
+ question: string;
96
+ rationale: string;
97
+ }
98
+ export interface RepoBrainImpactReport {
99
+ schemaVersion: typeof REPO_BRAIN_IMPACT_SCHEMA_VERSION;
100
+ generatedAt: string;
101
+ brain: {
102
+ status: 'found' | 'built' | 'missing';
103
+ artifactHash: string | null;
104
+ generatedAt: string | null;
105
+ filesIndexed: number | null;
106
+ ownerBoundaryStatus: 'found' | 'not_found' | null;
107
+ recoveryCommand: string;
108
+ };
109
+ requestedPaths: string[];
110
+ changedFiles: ImpactChangedFile[];
111
+ owners: {
112
+ label: 'deterministic';
113
+ status: 'found' | 'not_found';
114
+ matches: ImpactOwnerMatch[];
115
+ /** Distinct effective owners across the changed set (last-match-wins). */
116
+ routeTo: string[];
117
+ };
118
+ sensitiveSurfaces: {
119
+ label: 'deterministic';
120
+ surfaces: ImpactSensitiveSurface[];
121
+ kinds: LocalRepoBrainSensitiveKind[];
122
+ };
123
+ consumers: {
124
+ label: 'deterministic';
125
+ direct: ImpactConsumer[];
126
+ total: number;
127
+ truncated: boolean;
128
+ byRole: Record<ImpactFileRole, number>;
129
+ };
130
+ dependencies: {
131
+ label: 'deterministic';
132
+ internal: ImpactDependency[];
133
+ externalPackages: string[];
134
+ truncated: boolean;
135
+ };
136
+ highFanOut: {
137
+ label: 'deterministic';
138
+ hotspots: ImpactHotspot[];
139
+ isHighFanOut: boolean;
140
+ };
141
+ nearby: {
142
+ label: 'advisory';
143
+ tests: string[];
144
+ docs: string[];
145
+ config: string[];
146
+ runtime: string[];
147
+ };
148
+ reuse: {
149
+ label: 'advisory';
150
+ advisories: ImpactReuseAdvisory[];
151
+ };
152
+ reviewRouting: {
153
+ owners: string[];
154
+ reviewFirst: string[];
155
+ };
156
+ reviewQuestions: ImpactReviewQuestion[];
157
+ labels: {
158
+ deterministic: string[];
159
+ advisory: string[];
160
+ };
161
+ proves: string[];
162
+ doesNotProve: string[];
163
+ limitations: string[];
164
+ }
165
+ /**
166
+ * Compact, source-free impact digest embedded in AI Change Records, eval-demo
167
+ * reports, and the dashboard import. A trimmed projection of the full report.
168
+ */
169
+ export interface ImpactSummary {
170
+ schemaVersion: typeof IMPACT_SUMMARY_SCHEMA_VERSION;
171
+ generatedAt: string;
172
+ brainStatus: 'found' | 'built' | 'missing';
173
+ artifactHash: string | null;
174
+ counts: {
175
+ changedFiles: number;
176
+ indexedChangedFiles: number;
177
+ directConsumers: number;
178
+ changedSymbols: number;
179
+ sensitiveSurfaces: number;
180
+ internalDependencies: number;
181
+ externalPackages: number;
182
+ owners: number;
183
+ };
184
+ changedFiles: Array<{
185
+ path: string;
186
+ role: ImpactFileRole;
187
+ module: string | null;
188
+ sensitiveKinds: LocalRepoBrainSensitiveKind[];
189
+ }>;
190
+ owners: string[];
191
+ sensitiveSurfaces: ImpactSensitiveSurface[];
192
+ deterministic: {
193
+ directConsumers: Array<{
194
+ path: string;
195
+ role: ImpactFileRole;
196
+ edgeCount: number;
197
+ }>;
198
+ highFanOut: Array<{
199
+ path: string;
200
+ fanIn: number;
201
+ }>;
202
+ isHighFanOut: boolean;
203
+ };
204
+ advisory: {
205
+ reuse: Array<{
206
+ symbolName: string | null;
207
+ confidence: string;
208
+ files: string[];
209
+ }>;
210
+ nearbyTests: string[];
211
+ };
212
+ reviewRouting: {
213
+ owners: string[];
214
+ reviewFirst: string[];
215
+ };
216
+ reviewQuestions: string[];
217
+ proves: string[];
218
+ doesNotProve: string[];
219
+ }
220
+ export interface ComputeRepoBrainImpactOptions {
221
+ generatedAt?: string;
222
+ brainStatus?: 'found' | 'built' | 'missing';
223
+ /** Max direct consumers / dependencies retained before truncation. */
224
+ maxConsumers?: number;
225
+ maxDependencies?: number;
226
+ maxReviewQuestions?: number;
227
+ }
228
+ export declare function normalizeImpactPath(value: string, projectRoot?: string): string;
229
+ /**
230
+ * Deterministically classify a file's role from its path + sensitive kinds.
231
+ * Order matters: test > runtime_governance > config > docs > generated > data.
232
+ */
233
+ export declare function classifyImpactFileRole(path: string, opts?: {
234
+ generated?: boolean;
235
+ sensitiveKinds?: LocalRepoBrainSensitiveKind[];
236
+ }): ImpactFileRole;
237
+ /**
238
+ * Faithful subset of gitignore/CODEOWNERS glob semantics, sufficient for the
239
+ * common enterprise patterns: `src/billing/`, `*.py`, `/.github/workflows/`,
240
+ * `packages/cli/`, `docs/*`, `apps/web/**`, and exact file paths.
241
+ */
242
+ export declare function matchesCodeownersPattern(filePath: string, pattern: string): boolean;
243
+ export declare function computeRepoBrainImpact(artifact: LocalRepoBrainArtifact | null, requestedPaths: string[], options?: ComputeRepoBrainImpactOptions): RepoBrainImpactReport;
244
+ export declare function summarizeImpact(report: RepoBrainImpactReport): ImpactSummary;
245
+ export interface BuildRepoBrainImpactOptions extends ComputeRepoBrainImpactOptions {
246
+ /** Build the brain when no artifact exists yet (default true). */
247
+ autoBuild?: boolean;
248
+ }
249
+ /**
250
+ * Read the local repo brain (building it once when missing if autoBuild) and
251
+ * compute the impact report for the given changed paths.
252
+ */
253
+ export declare function buildRepoBrainImpactForRepo(projectRoot: string, requestedPaths: string[], options?: BuildRepoBrainImpactOptions): RepoBrainImpactReport;
254
+ export declare function renderRepoBrainImpactText(report: RepoBrainImpactReport): string;
255
+ //# sourceMappingURL=repo-brain-impact.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo-brain-impact.d.ts","sourceRoot":"","sources":["../../src/utils/repo-brain-impact.ts"],"names":[],"mappings":"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"}