council-review 0.1.1 → 0.2.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 (62) hide show
  1. package/README.md +12 -2
  2. package/dist/blast-radius.d.ts +228 -0
  3. package/dist/blast-radius.d.ts.map +1 -0
  4. package/dist/blast-radius.js +913 -0
  5. package/dist/blast-radius.js.map +1 -0
  6. package/dist/cli.d.ts +6 -0
  7. package/dist/cli.d.ts.map +1 -1
  8. package/dist/cli.js +46 -5
  9. package/dist/cli.js.map +1 -1
  10. package/dist/codegraph.d.ts +36 -0
  11. package/dist/codegraph.d.ts.map +1 -0
  12. package/dist/codegraph.js +95 -0
  13. package/dist/codegraph.js.map +1 -0
  14. package/dist/config.d.ts +22 -0
  15. package/dist/config.d.ts.map +1 -1
  16. package/dist/config.js +31 -0
  17. package/dist/config.js.map +1 -1
  18. package/dist/index.d.ts +2 -0
  19. package/dist/index.d.ts.map +1 -1
  20. package/dist/index.js +2 -0
  21. package/dist/index.js.map +1 -1
  22. package/dist/picker.d.ts +26 -3
  23. package/dist/picker.d.ts.map +1 -1
  24. package/dist/picker.js +78 -18
  25. package/dist/picker.js.map +1 -1
  26. package/dist/report.d.ts +16 -0
  27. package/dist/report.d.ts.map +1 -1
  28. package/dist/report.js +36 -1
  29. package/dist/report.js.map +1 -1
  30. package/dist/reviewer-spawn.d.ts +4 -2
  31. package/dist/reviewer-spawn.d.ts.map +1 -1
  32. package/dist/reviewer-spawn.js +4 -2
  33. package/dist/reviewer-spawn.js.map +1 -1
  34. package/dist/reviewer-tools.d.ts +21 -0
  35. package/dist/reviewer-tools.d.ts.map +1 -1
  36. package/dist/reviewer-tools.js +250 -3
  37. package/dist/reviewer-tools.js.map +1 -1
  38. package/dist/runner.d.ts +7 -0
  39. package/dist/runner.d.ts.map +1 -1
  40. package/dist/runner.js +33 -12
  41. package/dist/runner.js.map +1 -1
  42. package/dist/snapshot.d.ts +11 -0
  43. package/dist/snapshot.d.ts.map +1 -1
  44. package/dist/snapshot.js +71 -6
  45. package/dist/snapshot.js.map +1 -1
  46. package/dist/status.d.ts +9 -3
  47. package/dist/status.d.ts.map +1 -1
  48. package/dist/status.js +47 -6
  49. package/dist/status.js.map +1 -1
  50. package/package.json +1 -1
  51. package/src/blast-radius.ts +1136 -0
  52. package/src/cli.ts +50 -4
  53. package/src/codegraph.ts +118 -0
  54. package/src/config.ts +61 -0
  55. package/src/index.ts +2 -0
  56. package/src/picker.ts +96 -19
  57. package/src/report.ts +58 -2
  58. package/src/reviewer-spawn.ts +5 -2
  59. package/src/reviewer-tools.ts +294 -3
  60. package/src/runner.ts +48 -14
  61. package/src/snapshot.ts +93 -8
  62. package/src/status.ts +46 -6
package/README.md CHANGED
@@ -20,12 +20,22 @@ handoff prompt addressed to a coding agent (`HANDOFF.md`).
20
20
  npm install -g council-review
21
21
  ```
22
22
 
23
- For unreleased changes from `main`, install straight from GitHub instead:
23
+ For unreleased changes from `main`, build from a clone:
24
24
 
25
25
  ```
26
- npm install -g github:ad-005/council-review
26
+ git clone https://github.com/ad-005/council-review
27
+ cd council-review
28
+ npm install
29
+ npm pack
30
+ npm install -g ./council-review-*.tgz
27
31
  ```
28
32
 
33
+ Installing straight from the git URL is unreliable across npm versions: on the npm bundled with
34
+ Node 22 (10.x) `npm install -g github:ad-005/council-review` fails, because npm installs no
35
+ dependencies into its temporary clone and the `prepare` build cannot run; npm 12 fixed that but
36
+ disables git fetching by default, so it needs `--allow-git=all`. `npx github:ad-005/council-review`
37
+ works on npm 10, and needs `--allow-git=all` on npm 12.
38
+
29
39
  Requires the `pi` coding-agent CLI (`@earendil-works/pi-coding-agent`) on `PATH`, authenticated
30
40
  for at least one provider through `pi`'s own credential store — a key that exists only as a shell
31
41
  variable never reaches a reviewer, because reviewer processes get a tight environment allowlist.
@@ -0,0 +1,228 @@
1
+ import type { ResolvedScope } from './scope.js';
2
+ /** Maximum callers shown per symbol at render time. */
3
+ export declare const BLAST_RADIUS_CALLERS_LIMIT = 20;
4
+ /** `--limit` passed to every `callers` query: one past the render cap, so a full page
5
+ * proves truncation and the block can disclose it instead of rendering a truncated
6
+ * list as complete. The binary reports no total count, so this detects truncation
7
+ * honestly without claiming an exact hidden remainder. */
8
+ export declare const BLAST_RADIUS_CALLERS_QUERY_LIMIT: number;
9
+ /** `impact` is traced when a symbol's caller count exceeds this, or when the symbol's kind
10
+ * marks it as shared surface (see `IMPACT_ALWAYS_KINDS`). Keeps the common small-change
11
+ * case to one query per symbol. */
12
+ export declare const BLAST_RADIUS_IMPACT_CALLER_THRESHOLD = 2;
13
+ /** Symbol kinds treated as exported/shared surface: `impact` is always traced for these,
14
+ * even with few direct callers. */
15
+ export declare const IMPACT_ALWAYS_KINDS: ReadonlySet<string>;
16
+ /** Per-query subprocess timeout. */
17
+ export declare const BLAST_RADIUS_QUERY_TIMEOUT_MS = 60000;
18
+ /** Maximum concurrent `codegraph` subprocesses. */
19
+ export declare const BLAST_RADIUS_CONCURRENCY = 4;
20
+ export type PatchFileStatus = 'modified' | 'added' | 'deleted' | 'renamed';
21
+ export interface PatchHunk {
22
+ /** 1-based start line on the new-file (+) side. 0 for a pure context-less deletion hunk
23
+ * (`+0,0`), which maps to no end-state symbol. */
24
+ start: number;
25
+ /** Number of new-side lines in the hunk (0 for deletion-only hunks). */
26
+ count: number;
27
+ }
28
+ export interface PatchFile {
29
+ /** Post-image path, or the pre-image path for deleted files. */
30
+ path: string;
31
+ /** Pre-image path. */
32
+ oldPath: string;
33
+ status: PatchFileStatus;
34
+ hunks: PatchHunk[];
35
+ }
36
+ /**
37
+ * Parses a unified `git diff` into per-file paths, hunk ranges, and change kinds. Pure
38
+ * function of its input. Handles new files (`--- /dev/null`), deleted files
39
+ * (`+++ /dev/null`), renames (`rename from/to` or differing `---`/`+++` paths), binary
40
+ * diffs (emitted with zero hunks so they still feed the `affected` query), and multi-hunk
41
+ * files. Only headers are inspected, and `---`/`+++` path headers are only accepted
42
+ * before the first hunk header of each file section (real headers always precede the
43
+ * hunks, including `/dev/null` ones): a deleted `-- x` or added `++ y` content line
44
+ * would otherwise mimic a path header once prefixed with `-`/`+` and corrupt the paths.
45
+ */
46
+ export declare function parsePatchHunks(patch: string): PatchFile[];
47
+ export interface FileSymbol {
48
+ name: string;
49
+ kind: string;
50
+ startLine: number;
51
+ }
52
+ export type SymbolsOnlyParse = {
53
+ status: 'ok';
54
+ symbols: FileSymbol[];
55
+ dependents: string[];
56
+ } | {
57
+ status: 'not-in-index';
58
+ } | {
59
+ status: 'malformed';
60
+ };
61
+ /**
62
+ * Parses `codegraph node --file <rel> --symbols-only` (text; the one subcommand with no
63
+ * JSON mode). `not-in-index` (the binary's `No indexed file matches` message) and
64
+ * `malformed` are distinct: the former names a removed/unindexed file, the latter degrades
65
+ * that file to a file-level entry while other files keep symbol granularity. Unparseable
66
+ * lines inside an otherwise well-formed map are ignored for forward compatibility; only a
67
+ * map with no `**Symbols**` section at all is `malformed`.
68
+ */
69
+ export declare function parseSymbolsOnlyMap(output: string): SymbolsOnlyParse;
70
+ export interface ChangedSymbol {
71
+ name: string;
72
+ kind: string;
73
+ file: string;
74
+ startLine: number;
75
+ }
76
+ /**
77
+ * Maps each hunk to its enclosing symbol: the last symbol with
78
+ * `startLine <= hunk.start` in the same file (end lines are inferred positionally, so a
79
+ * hunk above the first symbol maps to nothing). Deduped and sorted by
80
+ * (file, startLine, name).
81
+ */
82
+ export declare function mapHunksToSymbols(file: string, hunks: readonly PatchHunk[], symbols: readonly FileSymbol[]): ChangedSymbol[];
83
+ /** `node --file <rel> --symbols-only`: the per-file symbol map (text output). */
84
+ export declare function buildNodeSymbolsOnlyArgv(snapshotRoot: string, relPath: string): string[];
85
+ /** `callers -j`: direct callers of one symbol as JSON. Name-only: codegraph v1.6.0
86
+ * accepts no file scope for `callers` (verified empirically — no flag, no
87
+ * `file:symbol` syntax), so same-named symbols elsewhere merge into the result. */
88
+ export declare function buildCallersArgv(snapshotRoot: string, symbol: string, limit?: number): string[];
89
+ /** `impact -j`: transitive impact of one symbol as JSON. Name-only, like `callers`:
90
+ * no file scope exists, so same-named symbols elsewhere merge into the result. */
91
+ export declare function buildImpactArgv(snapshotRoot: string, symbol: string, depth: number): string[];
92
+ /** `affected -j`: affected tests for all changed files in one call. */
93
+ export declare function buildAffectedArgv(snapshotRoot: string, files: readonly string[]): string[];
94
+ export interface CodeRef {
95
+ name: string;
96
+ kind: string;
97
+ filePath: string;
98
+ startLine: number;
99
+ }
100
+ export type RefsParse = {
101
+ status: 'ok';
102
+ refs: CodeRef[];
103
+ } | {
104
+ status: 'not-found';
105
+ } | {
106
+ status: 'malformed';
107
+ };
108
+ export type AffectedParse = {
109
+ status: 'ok';
110
+ changedFiles: string[];
111
+ affectedTests: string[];
112
+ } | {
113
+ status: 'malformed';
114
+ };
115
+ /** Parses `callers -j` (`{ symbol, callers: [...] }`). Unknown symbols yield `not-found`,
116
+ * not `malformed`. */
117
+ export declare function parseCallersJson(output: string): RefsParse;
118
+ /** Parses `impact -j` (`{ symbol, depth, ..., affected: [...] }`). */
119
+ export declare function parseImpactJson(output: string): RefsParse;
120
+ /** Parses `affected -j` (`{ changedFiles: [...], affectedTests: [...] }`). Unknown files
121
+ * simply contribute no tests — there is no not-found shape. */
122
+ export declare function parseAffectedJson(output: string): AffectedParse;
123
+ /**
124
+ * Best-effort filtering for one symbol's refs (callers or impact nodes):
125
+ * - drops same-name symbols from other files (ambiguous with this symbol's own
126
+ * definition; a same-name ref only counts with a file match),
127
+ * - drops file-level-only (`kind: 'file'`) refs unless nothing else references the
128
+ * symbol, in which case they are kept rather than reporting zero refs,
129
+ * - dedupes and sorts (codepoint order) for determinism.
130
+ *
131
+ * Residual over-approximation, stated explicitly: the queries are name-only —
132
+ * codegraph v1.6.0 offers no file scoping for `callers`/`impact` (verified empirically:
133
+ * no flag, no `file:symbol` syntax) and the JSON exposes no resolved definition site
134
+ * for caller refs, which carry caller identity only. When two files define the same
135
+ * symbol name, their callers merge indistinguishably and this filter cannot attribute
136
+ * them, so the block over-approximates by design. Only same-name definition entries
137
+ * (notably `impact` root nodes) are attributable, via the file match above.
138
+ */
139
+ export declare function filterRefs(refs: readonly CodeRef[], opts: {
140
+ symbolName: string;
141
+ symbolFile: string;
142
+ }): CodeRef[];
143
+ /**
144
+ * Whether `impact` is worth tracing for a symbol: always for shared-surface kinds, or
145
+ * when the caller count exceeds the threshold (narrowly-referenced private symbols keep
146
+ * the run to one query each).
147
+ */
148
+ export declare function shouldTraceImpact(symbol: Pick<ChangedSymbol, 'kind'>, callerCount: number): boolean;
149
+ export type SymbolQueryFailure = 'query-failed' | 'parse-failed';
150
+ export interface SymbolBlast {
151
+ symbol: ChangedSymbol;
152
+ /** Filtered direct callers. Null when the callers query itself failed. */
153
+ callers: CodeRef[] | null;
154
+ /** True when the callers query returned a full page (`BLAST_RADIUS_CALLERS_QUERY_LIMIT`
155
+ * raw refs), proving truncation: more callers may exist beyond those listed. */
156
+ callersTruncated?: boolean;
157
+ /** Filtered transitive impact, minus the symbol's own root entry. Null when impact was
158
+ * not traced (below threshold) or its query failed — see `impactTraced`/`failure`. */
159
+ impact: CodeRef[] | null;
160
+ impactTraced: boolean;
161
+ /** Set when a per-symbol query failed; the symbol still renders with an in-block note. */
162
+ failure?: SymbolQueryFailure;
163
+ }
164
+ export interface FileFallbackBlast {
165
+ file: string;
166
+ /** Best-effort dependents from the symbol-map header; empty when unknown. */
167
+ dependents: string[];
168
+ }
169
+ export interface RenderInput {
170
+ symbols: readonly SymbolBlast[];
171
+ fileFallbacks: readonly FileFallbackBlast[];
172
+ removedSymbols: readonly ChangedSymbol[];
173
+ /** Files deleted by the patch. */
174
+ removedFiles: readonly string[];
175
+ /** Files present in the patch but absent from the index (not deleted). */
176
+ unindexedFiles: readonly string[];
177
+ affectedTests: readonly string[];
178
+ /** `affected` query outcome when no test list could be produced. */
179
+ affectedFailure?: SymbolQueryFailure;
180
+ /** Symbols cut by `maxSymbols` (sorted first, so these are the trailing ones). */
181
+ omittedSymbols: number;
182
+ omittedTests?: number;
183
+ depth: number;
184
+ maxBlockChars: number;
185
+ }
186
+ /**
187
+ * Renders the blast-radius block: compact text with `file:line` anchors. Inputs are
188
+ * re-sorted defensively so rendering is a pure, deterministic function. Overflow (symbol
189
+ * cap) and removals are disclosed in-block; when the rendered text exceeds
190
+ * `maxBlockChars` it is truncated to exactly the cap with a trailing truncation note.
191
+ */
192
+ export declare function renderBlastRadiusBlock(input: RenderInput): string;
193
+ export type BlastRadiusReason = 'disabled' | 'index-unavailable' | 'query-failed' | 'parse-failed' | 'empty';
194
+ export interface BlastRadiusStats {
195
+ /** Traced changed symbols rendered in the block (excludes removed/file-level entries). */
196
+ symbols: number;
197
+ /** Total callers listed across traced symbols. */
198
+ callers: number;
199
+ /** Affected tests listed. */
200
+ tests: number;
201
+ }
202
+ export interface BlastRadiusResult {
203
+ available: boolean;
204
+ reason?: BlastRadiusReason;
205
+ /** The rendered block, or '' when unavailable. */
206
+ block: string;
207
+ stats: BlastRadiusStats;
208
+ }
209
+ export interface ComputeBlastRadiusOptions {
210
+ enabled?: boolean;
211
+ indexAvailable?: boolean;
212
+ bin?: string;
213
+ depth?: number;
214
+ maxSymbols?: number;
215
+ maxBlockChars?: number;
216
+ timeoutMs?: number;
217
+ concurrency?: number;
218
+ }
219
+ /**
220
+ * Computes the blast radius for one run. Never throws for a blast-radius outcome: every
221
+ * spawn failure, timeout, and parse failure degrades to a reason (or, where a per-file /
222
+ * per-symbol fallback applies, to a partial block with an in-block note), as do
223
+ * data-dependent argv-validation failures (odd paths from the diff, odd symbol names
224
+ * from the index). Throws only for caller bugs (invalid snapshot root / options),
225
+ * matching `buildCodegraphArgv`'s validate-then-spawn precedent.
226
+ */
227
+ export declare function computeBlastRadius(snapshotRoot: string, scope: ResolvedScope, opts?: ComputeBlastRadiusOptions): Promise<BlastRadiusResult>;
228
+ //# sourceMappingURL=blast-radius.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blast-radius.d.ts","sourceRoot":"","sources":["../src/blast-radius.ts"],"names":[],"mappings":"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"}