redline-review 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -8,36 +8,19 @@ Adaptive AI code review skill for any frontier agent — context-aware, rule-dri
8
8
 
9
9
  ## Getting started
10
10
 
11
- ### Step 1 — Clone the repo
11
+ ### Step 1 — Install
12
12
 
13
13
  ```bash
14
- git clone https://github.com/nabil1440/redline-review
15
- cd redline-review
14
+ npm install -g redline-review
16
15
  ```
17
16
 
18
- ### Step 2 — Install dependencies and build
19
-
20
- ```bash
21
- npm install
22
- ```
23
-
24
- The build runs automatically as part of install (`prepare` script). You should see `tsc` compile without errors.
25
-
26
- ### Step 3 — Install globally
27
-
28
- ```bash
29
- npm link
30
- ```
31
-
32
- This makes `redline-review` available as a global command from any directory on your machine.
33
-
34
- ### Step 4 — Verify it works
17
+ ### Step 2 — Verify it works
35
18
 
36
19
  ```bash
37
20
  which redline-review
38
21
  # → /path/to/node/bin/redline-review
39
22
 
40
- redline-review --help 2>&1 || redline-review | head -5
23
+ redline-review | head -5
41
24
  ```
42
25
 
43
26
  ---
@@ -50,7 +33,7 @@ There are two ways to install the command — global (recommended) or per-projec
50
33
 
51
34
  ```bash
52
35
  mkdir -p ~/.claude/commands
53
- cp /path/to/redline-review/adapters/claude/redline-review.md ~/.claude/commands/redline-review.md
36
+ cp $(npm root -g)/redline-review/adapters/claude/redline-review.md ~/.claude/commands/redline-review.md
54
37
  ```
55
38
 
56
39
  That's it. Open any project in Claude Code and `/redline-review` will be available immediately — no per-project setup needed.
@@ -60,10 +43,10 @@ That's it. Open any project in Claude Code and `/redline-review` will be availab
60
43
  ```bash
61
44
  cd /your/project
62
45
  mkdir -p .claude/commands
63
- cp /path/to/redline-review/adapters/claude/redline-review.md .claude/commands/redline-review.md
46
+ cp $(npm root -g)/redline-review/adapters/claude/redline-review.md .claude/commands/redline-review.md
64
47
  ```
65
48
 
66
- ### Step 6 — Use it in Claude Code
49
+ ### Use it in Claude Code
67
50
 
68
51
  Open any project in Claude Code and type:
69
52
 
@@ -86,17 +69,100 @@ You can pass flags directly:
86
69
 
87
70
  ---
88
71
 
89
- ## How it works
72
+ ## Review modes
73
+
74
+ ### Default — branch diff (PR-style)
75
+
76
+ ```bash
77
+ redline-review
78
+ ```
79
+
80
+ Diffs the current branch against the detected base branch and assembles a review prompt. This is the original behavior — no subcommand needed.
81
+
82
+ ### Range — review between two commits
83
+
84
+ ```bash
85
+ redline-review range --from <commit-ish> --to <commit-ish>
86
+ ```
87
+
88
+ One-shot review of everything that changed between two refs. `--to` defaults to `HEAD` if omitted.
89
+
90
+ ```bash
91
+ # Review changes between two tags
92
+ redline-review range --from v1.0.0 --to v1.1.0
93
+
94
+ # Review the last 5 commits
95
+ redline-review range --from HEAD~5 --to HEAD
96
+
97
+ # Strict mode
98
+ redline-review range --from main --to HEAD --prompt strict
99
+ ```
100
+
101
+ ### Walk — commit-by-commit review
102
+
103
+ ```bash
104
+ redline-review walk --start [--from <ref>] [--to <ref>] [--interval N] [--direction backwards|forwards]
105
+ redline-review walk --next
106
+ redline-review walk --status
107
+ redline-review walk --reset
108
+ ```
109
+
110
+ Steps through commits one at a time (or in batches), emitting a review prompt for each step. State is persisted in `.git/redline-walk.json`.
111
+
112
+ ```bash
113
+ # Start walking backwards from HEAD to main (default)
114
+ redline-review walk --start
115
+
116
+ # Walk in batches of 2 commits
117
+ redline-review walk --start --interval 2
118
+
119
+ # Walk forwards from a specific point
120
+ redline-review walk --start --from v1.0.0 --direction forwards
121
+
122
+ # Get the next review prompt
123
+ redline-review walk --next
124
+
125
+ # Check progress
126
+ redline-review walk --status
127
+
128
+ # Clear walk state
129
+ redline-review walk --reset
130
+ ```
131
+
132
+ The interactive "review → ask → continue" loop lives in your agent (see adapter docs), not in the CLI. The CLI stays stateless per invocation — it reads/writes a small state file but each call is a single deterministic function.
133
+
134
+ Flags passed at `--start` time (`--stack`, `--type`, `--prompt`) are captured into state and reused for every `--next`.
135
+
136
+ ### Repo — full repository review
137
+
138
+ ```bash
139
+ redline-review repo [--max-tree-depth N] [--stack ...] [--type ...] [--prompt ...]
140
+ ```
141
+
142
+ Emits a review prompt that instructs your agent to systematically explore the entire repository. The prompt includes:
143
+
144
+ - An annotated file tree with navigation hints (`[entry-point]`, `[config]`, `[migration]`, `[orchestration]`, `[largest]`)
145
+ - Inlined orientation files (package.json, go.mod, README, CI workflows, etc.)
146
+ - Architecture review dimensions (module boundaries, hidden coupling, consistency, abstraction quality, reliability hazards, architectural drift)
147
+ - Rule-based focus areas auto-detected from file extensions
148
+
149
+ ```bash
150
+ # Review this repo
151
+ redline-review repo
152
+
153
+ # Limit tree depth for large repos
154
+ redline-review repo --max-tree-depth 3
90
155
 
91
- 1. Detects your git diff automatically (`git diff main...HEAD`, falls back through `master...HEAD` → `HEAD~1` → `--cached`)
92
- 2. **Auto-detects relevant rule categories** from the diff content (or uses your `--stack`/`--type` flags)
93
- 3. Prints the assembled review prompt to stdout
94
- 4. Your agent reads that prompt and performs the review — no external calls made by the CLI
156
+ # Override with explicit stack
157
+ redline-review repo --stack go --type architecture,concurrency
158
+ ```
95
159
 
96
160
  ---
97
161
 
98
162
  ## Flags
99
163
 
164
+ All flags work with all modes (default, range, walk, repo).
165
+
100
166
  ### `--type` — focus by concern
101
167
 
102
168
  ```bash
@@ -140,16 +206,27 @@ redline-review --stack go --type backend
140
206
  ### `--prompt` — control review depth
141
207
 
142
208
  ```bash
143
- redline-review --prompt base # default
209
+ redline-review --prompt base # default for diff-based modes
144
210
  redline-review --prompt strict # CRITICAL and HIGH only + fix suggestions
145
211
  redline-review --prompt lightweight # top 3 issues only
146
212
  ```
147
213
 
148
- | Value | Output |
149
- | ---------------- | ------------------------------------------------- |
214
+ | Value | Output |
215
+ | ---------------- | -------------------------------------------------- |
150
216
  | `base` (default) | All issues grouped CRITICAL → HIGH → MEDIUM → LOW |
151
- | `strict` | CRITICAL and HIGH only, concrete fix per issue |
152
- | `lightweight` | Top 3 issues, one tight paragraph each |
217
+ | `strict` | CRITICAL and HIGH only, concrete fix per issue |
218
+ | `lightweight` | Top 3 issues, one tight paragraph each |
219
+
220
+ Repo mode defaults to its own `repo-reviewer` template (agent-driven exploration). Pass `--prompt strict` or `--prompt lightweight` to override.
221
+
222
+ ### `--base` — override base branch
223
+
224
+ ```bash
225
+ redline-review --base origin/develop
226
+ redline-review --base main
227
+ ```
228
+
229
+ Only applies to the default (branch diff) mode. Range and walk use `--from`/`--to` instead.
153
230
 
154
231
  ---
155
232
 
@@ -171,6 +248,17 @@ redline-review --stack java --prompt lightweight
171
248
  # Security review, any stack
172
249
  redline-review --type security
173
250
 
251
+ # Review a release range
252
+ redline-review range --from v1.2.0 --to v1.3.0
253
+
254
+ # Walk through a feature branch commit by commit
255
+ redline-review walk --start --prompt strict
256
+ redline-review walk --next
257
+ redline-review walk --next
258
+
259
+ # Full repo audit
260
+ redline-review repo
261
+
174
262
  # Pipe to clipboard (macOS) — paste into any agent
175
263
  redline-review | pbcopy
176
264
 
@@ -191,6 +279,8 @@ When no `--type` or `--stack` flags are given, `redline-review` scans the diff f
191
279
 
192
280
  If nothing is detected, falls back to `correctness + maintainability + risk-patterns`.
193
281
 
282
+ For repo mode (no diff), detection is based on file extensions in the repository.
283
+
194
284
  Detected domains are printed to stderr so they don't pollute the prompt:
195
285
 
196
286
  ```
@@ -222,16 +312,23 @@ Domains (auto-detected): auth.yaml, concurrency.yaml, performance-db.yaml
222
312
 
223
313
  Adapter files for other agents are in `adapters/`:
224
314
 
225
- | Agent | File to use |
226
- | -------------- | -------------------------------------------------------------------------- |
227
- | Claude Code | `adapters/claude/redline-review.md` → `.claude/commands/redline-review.md` |
228
- | GitHub Copilot | `adapters/copilot/redline-review.md` → `.github/copilot-instructions.md` |
229
- | Codex CLI | `adapters/codex/redline-review.md` → `AGENTS.md` |
230
- | OpenCode | `adapters/opencode/redline-review.md` → `AGENTS.md` |
231
- | Anti-gravity | `adapters/antigravity/redline-review.md` |
315
+ | Agent | Command |
316
+ | -------------- | --------------------------------------------------------------------------------------------------------- |
317
+ | Claude Code | `cp $(npm root -g)/redline-review/adapters/claude/redline-review.md ~/.claude/commands/redline-review.md` |
318
+ | GitHub Copilot | `cp $(npm root -g)/redline-review/adapters/copilot/redline-review.md .github/copilot-instructions.md` |
319
+ | Codex CLI | `cp $(npm root -g)/redline-review/adapters/codex/redline-review.md AGENTS.md` |
320
+ | OpenCode | `cp $(npm root -g)/redline-review/adapters/opencode/redline-review.md AGENTS.md` |
321
+ | Anti-gravity | `cp $(npm root -g)/redline-review/adapters/antigravity/redline-review.md <your-config-path>` |
232
322
 
233
323
  Each adapter follows the same pattern: run `redline-review`, take the output as the review task.
234
324
 
325
+ For the commit walk interactive flow, adapters should:
326
+
327
+ 1. Run `redline-review walk --start` and perform the review
328
+ 2. Ask the user: "Continue to the next commit?"
329
+ 3. If yes, run `redline-review walk --next` and repeat
330
+ 4. When walk is complete (exit 0 with no stdout), inform the user
331
+
235
332
  ---
236
333
 
237
334
  ## License
@@ -0,0 +1,2 @@
1
+ export declare function detectRepoStacks(): string[];
2
+ //# sourceMappingURL=detect-repo-stacks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-repo-stacks.d.ts","sourceRoot":"","sources":["../src/detect-repo-stacks.ts"],"names":[],"mappings":"AAkBA,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAkC3C"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectRepoStacks = detectRepoStacks;
4
+ const child_process_1 = require("child_process");
5
+ const build_context_1 = require("./build-context");
6
+ const EXTENSION_STACK_MAP = {
7
+ '.go': 'go',
8
+ '.tsx': 'react',
9
+ '.jsx': 'react',
10
+ '.vue': 'vue',
11
+ '.svelte': 'svelte',
12
+ '.rb': 'rails',
13
+ '.java': 'java',
14
+ '.cs': 'csharp',
15
+ '.py': 'django',
16
+ '.php': 'laravel',
17
+ };
18
+ const FALLBACK_FILES = ['correctness.yaml', 'maintainability.yaml', 'risk-patterns.yaml'];
19
+ function detectRepoStacks() {
20
+ let files;
21
+ try {
22
+ const output = (0, child_process_1.execSync)('git ls-files', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
23
+ files = output ? output.split('\n') : [];
24
+ }
25
+ catch {
26
+ return FALLBACK_FILES;
27
+ }
28
+ const extCounts = new Map();
29
+ for (const f of files) {
30
+ const dot = f.lastIndexOf('.');
31
+ if (dot === -1)
32
+ continue;
33
+ const ext = f.slice(dot).toLowerCase();
34
+ extCounts.set(ext, (extCounts.get(ext) ?? 0) + 1);
35
+ }
36
+ const stacks = new Set();
37
+ for (const [ext, count] of extCounts) {
38
+ if (count < 2)
39
+ continue;
40
+ const stack = EXTENSION_STACK_MAP[ext];
41
+ if (stack)
42
+ stacks.add(stack);
43
+ }
44
+ // Detect Node.js projects by package.json presence
45
+ if (files.includes('package.json') && !stacks.has('react')) {
46
+ stacks.add('node');
47
+ }
48
+ if (stacks.size === 0)
49
+ return FALLBACK_FILES;
50
+ const result = (0, build_context_1.buildReviewContext)({ stack: Array.from(stacks) });
51
+ return result.length > 0 ? result : FALLBACK_FILES;
52
+ }
53
+ //# sourceMappingURL=detect-repo-stacks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detect-repo-stacks.js","sourceRoot":"","sources":["../src/detect-repo-stacks.ts"],"names":[],"mappings":";;AAkBA,4CAkCC;AApDD,iDAAyC;AACzC,mDAAqD;AAErD,MAAM,mBAAmB,GAA2B;IAClD,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,OAAO;IACf,MAAM,EAAE,KAAK;IACb,SAAS,EAAE,QAAQ;IACnB,KAAK,EAAE,OAAO;IACd,OAAO,EAAE,MAAM;IACf,KAAK,EAAE,QAAQ;IACf,KAAK,EAAE,QAAQ;IACf,MAAM,EAAE,SAAS;CAClB,CAAC;AAEF,MAAM,cAAc,GAAG,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,oBAAoB,CAAC,CAAC;AAE1F,SAAgB,gBAAgB;IAC9B,IAAI,KAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,cAAc,EACpC,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAChE,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,GAAG,GAAG,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,SAAS;QACzB,MAAM,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC;QACvC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IACjC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,SAAS,EAAE,CAAC;QACrC,IAAI,KAAK,GAAG,CAAC;YAAE,SAAS;QACxB,MAAM,KAAK,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACvC,IAAI,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,mDAAmD;IACnD,IAAI,KAAK,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3D,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACrB,CAAC;IAED,IAAI,MAAM,CAAC,IAAI,KAAK,CAAC;QAAE,OAAO,cAAc,CAAC;IAE7C,MAAM,MAAM,GAAG,IAAA,kCAAkB,EAAC,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACjE,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;AACrD,CAAC"}
@@ -0,0 +1,8 @@
1
+ export interface ManifestResult {
2
+ tree: string;
3
+ orientationContent: string;
4
+ fileCount: number;
5
+ truncated: boolean;
6
+ }
7
+ export declare function buildManifest(maxDepth?: number): ManifestResult;
8
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"AA2DA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,kBAAkB,EAAE,MAAM,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,wBAAgB,aAAa,CAAC,QAAQ,GAAE,MAAW,GAAG,cAAc,CA0FnE"}
@@ -0,0 +1,154 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.buildManifest = buildManifest;
7
+ const fs_1 = __importDefault(require("fs"));
8
+ const path_1 = __importDefault(require("path"));
9
+ const child_process_1 = require("child_process");
10
+ const ENTRY_POINT_PATTERNS = /^(main|index|app|server|entrypoint|bootstrap|startup)\./i;
11
+ const ORCHESTRATION_PATTERNS = /\b(runtime|scheduler|worker|queue|dispatcher|processor)\b/i;
12
+ const MIGRATION_PATTERNS = /\bmigrations?\b/i;
13
+ const CONFIG_BASENAMES = new Set([
14
+ 'dockerfile', 'docker-compose.yml', 'docker-compose.yaml',
15
+ 'makefile', 'justfile', 'taskfile.yml',
16
+ '.env.example', '.env.sample',
17
+ ]);
18
+ const CONFIG_EXTENSIONS = new Set(['.tf', '.toml', '.ini']);
19
+ const BINARY_EXTENSIONS = new Set([
20
+ '.png', '.jpg', '.jpeg', '.gif', '.ico', '.svg', '.webp', '.bmp',
21
+ '.woff', '.woff2', '.ttf', '.eot', '.otf',
22
+ '.zip', '.tar', '.gz', '.bz2', '.7z', '.rar',
23
+ '.exe', '.dll', '.so', '.dylib', '.bin',
24
+ '.mp3', '.mp4', '.avi', '.mov', '.wav',
25
+ '.pdf', '.doc', '.docx', '.xls', '.xlsx',
26
+ '.pyc', '.class', '.o', '.obj',
27
+ ]);
28
+ const ORIENTATION_FILES = [
29
+ 'package.json', 'go.mod', 'Cargo.toml', 'pyproject.toml',
30
+ 'Gemfile', 'pom.xml', 'build.gradle', 'composer.json',
31
+ 'Makefile', 'justfile', 'Taskfile.yml',
32
+ 'tsconfig.json',
33
+ ];
34
+ const MAX_INLINE_SIZE = 2048;
35
+ const MAX_README_SIZE = 2048;
36
+ function isBinary(filePath) {
37
+ const ext = path_1.default.extname(filePath).toLowerCase();
38
+ return BINARY_EXTENSIONS.has(ext);
39
+ }
40
+ function getTag(filePath, basename) {
41
+ if (ENTRY_POINT_PATTERNS.test(basename))
42
+ return 'entry-point';
43
+ if (MIGRATION_PATTERNS.test(filePath))
44
+ return 'migration';
45
+ if (ORCHESTRATION_PATTERNS.test(basename))
46
+ return 'orchestration';
47
+ if (CONFIG_BASENAMES.has(basename.toLowerCase()))
48
+ return 'config';
49
+ if (CONFIG_EXTENSIONS.has(path_1.default.extname(filePath).toLowerCase()))
50
+ return 'config';
51
+ if (basename.toLowerCase().startsWith('config') || basename.toLowerCase().startsWith('settings'))
52
+ return 'config';
53
+ return null;
54
+ }
55
+ function getLineCount(filePath) {
56
+ try {
57
+ const output = (0, child_process_1.execSync)(`wc -l < "${filePath}"`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
58
+ return parseInt(output, 10) || 0;
59
+ }
60
+ catch {
61
+ return 0;
62
+ }
63
+ }
64
+ function buildManifest(maxDepth = 10) {
65
+ let files;
66
+ try {
67
+ const output = (0, child_process_1.execSync)('git ls-files', { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
68
+ files = output ? output.split('\n') : [];
69
+ }
70
+ catch {
71
+ return { tree: '(no tracked files)', orientationContent: '', fileCount: 0, truncated: false };
72
+ }
73
+ const nonBinary = files.filter(f => !isBinary(f));
74
+ // Compute largest files (top 10 by line count)
75
+ const fileSizes = [];
76
+ for (const f of nonBinary.slice(0, 500)) {
77
+ const lines = getLineCount(f);
78
+ if (lines > 0)
79
+ fileSizes.push({ file: f, lines });
80
+ }
81
+ fileSizes.sort((a, b) => b.lines - a.lines);
82
+ const largestFiles = new Set(fileSizes.slice(0, 10).map(f => f.file));
83
+ const largestMap = new Map(fileSizes.slice(0, 10).map(f => [f.file, f.lines]));
84
+ // Build annotated tree
85
+ let truncated = false;
86
+ const treeLines = [];
87
+ for (const f of nonBinary) {
88
+ const depth = f.split('/').length - 1;
89
+ if (depth > maxDepth) {
90
+ truncated = true;
91
+ continue;
92
+ }
93
+ const basename = path_1.default.basename(f);
94
+ const tag = getTag(f, basename);
95
+ const isLargest = largestFiles.has(f);
96
+ let annotation = '';
97
+ if (tag)
98
+ annotation += ` [${tag}]`;
99
+ if (isLargest)
100
+ annotation += ` (${largestMap.get(f)} lines) [largest]`;
101
+ treeLines.push(f + annotation);
102
+ }
103
+ if (truncated) {
104
+ const truncCount = nonBinary.filter(f => f.split('/').length - 1 > maxDepth).length;
105
+ treeLines.push(`... (${truncCount} files beyond depth ${maxDepth} truncated)`);
106
+ }
107
+ // Inline orientation files
108
+ const orientationParts = [];
109
+ for (const name of ORIENTATION_FILES) {
110
+ if (!files.includes(name))
111
+ continue;
112
+ try {
113
+ const content = fs_1.default.readFileSync(name, 'utf8');
114
+ if (content.length <= MAX_INLINE_SIZE) {
115
+ orientationParts.push(`### ${name}\n\`\`\`\n${content.trimEnd()}\n\`\`\``);
116
+ }
117
+ else {
118
+ orientationParts.push(`### ${name}\n\`\`\`\n${content.slice(0, MAX_INLINE_SIZE).trimEnd()}\n... (truncated)\n\`\`\``);
119
+ }
120
+ }
121
+ catch {
122
+ continue;
123
+ }
124
+ }
125
+ // Inline README (first 2KB)
126
+ const readmeFile = files.find(f => /^readme\.md$/i.test(f));
127
+ if (readmeFile) {
128
+ try {
129
+ const content = fs_1.default.readFileSync(readmeFile, 'utf8');
130
+ const trimmed = content.slice(0, MAX_README_SIZE).trimEnd();
131
+ orientationParts.push(`### ${readmeFile}\n${trimmed}${content.length > MAX_README_SIZE ? '\n... (truncated)' : ''}`);
132
+ }
133
+ catch { /* skip */ }
134
+ }
135
+ // Inline CI workflows (truncated)
136
+ const ciFiles = files.filter(f => f.startsWith('.github/workflows/') && f.endsWith('.yml'));
137
+ for (const f of ciFiles.slice(0, 3)) {
138
+ try {
139
+ const content = fs_1.default.readFileSync(f, 'utf8');
140
+ const trimmed = content.slice(0, 1024).trimEnd();
141
+ orientationParts.push(`### ${f}\n\`\`\`yaml\n${trimmed}${content.length > 1024 ? '\n... (truncated)' : ''}\n\`\`\``);
142
+ }
143
+ catch {
144
+ continue;
145
+ }
146
+ }
147
+ return {
148
+ tree: treeLines.join('\n'),
149
+ orientationContent: orientationParts.join('\n\n'),
150
+ fileCount: files.length,
151
+ truncated,
152
+ };
153
+ }
154
+ //# sourceMappingURL=manifest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.js","sourceRoot":"","sources":["../src/manifest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { ReviewInput } from './redline-review';
2
+ export declare function collectRangeInput(argv: string[]): ReviewInput;
3
+ //# sourceMappingURL=range.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range.d.ts","sourceRoot":"","sources":["../src/range.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAc,MAAM,kBAAkB,CAAC;AAY3D,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,WAAW,CAwC7D"}
package/dist/range.js ADDED
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.collectRangeInput = collectRangeInput;
4
+ const child_process_1 = require("child_process");
5
+ const redline_review_1 = require("./redline-review");
6
+ function resolveRef(ref) {
7
+ try {
8
+ return (0, child_process_1.execSync)(`git rev-parse --verify ${ref}^{commit}`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] }).trim();
9
+ }
10
+ catch {
11
+ process.stderr.write(`Error: "${ref}" is not a valid commit reference.\n`);
12
+ process.exit(1);
13
+ }
14
+ }
15
+ function collectRangeInput(argv) {
16
+ const get = (flag) => {
17
+ const idx = argv.indexOf(flag);
18
+ return idx !== -1 ? argv[idx + 1] : undefined;
19
+ };
20
+ const fromRef = get('--from');
21
+ if (!fromRef) {
22
+ process.stderr.write('Error: --from is required for range review.\n');
23
+ process.exit(1);
24
+ }
25
+ const toRef = get('--to') ?? 'HEAD';
26
+ const fromSha = resolveRef(fromRef);
27
+ const toSha = resolveRef(toRef);
28
+ const diff = (0, redline_review_1.getGitDiff)({ from: fromSha, to: toSha, threeDot: true });
29
+ if (diff.length === 0) {
30
+ process.stderr.write(`No changes between ${fromRef} and ${toRef}.\n`);
31
+ process.exit(0);
32
+ }
33
+ // Warn if --to is an ancestor of --from (args may be swapped)
34
+ try {
35
+ const isAncestor = (0, child_process_1.execSync)(`git merge-base --is-ancestor ${toSha} ${fromSha}`, { stdio: ['pipe', 'pipe', 'pipe'] });
36
+ // If the command succeeds (exit 0), toSha is ancestor of fromSha
37
+ process.stderr.write(`Warning: "${toRef}" is an ancestor of "${fromRef}" — did you swap the arguments?\n`);
38
+ }
39
+ catch {
40
+ // Not an ancestor — expected path, no warning needed
41
+ }
42
+ process.stderr.write(`Range: ${fromRef} (${fromSha.slice(0, 7)}) → ${toRef} (${toSha.slice(0, 7)})\n`);
43
+ return {
44
+ mode: 'range',
45
+ reviewContent: diff,
46
+ metadata: { from: fromRef, to: toRef },
47
+ };
48
+ }
49
+ //# sourceMappingURL=range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"range.js","sourceRoot":"","sources":["../src/range.ts"],"names":[],"mappings":";;AAaA,8CAwCC;AArDD,iDAAyC;AACzC,qDAA2D;AAE3D,SAAS,UAAU,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,OAAO,IAAA,wBAAQ,EAAC,0BAA0B,GAAG,WAAW,EACtD,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IAClE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,GAAG,sCAAsC,CAAC,CAAC;QAC3E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,SAAgB,iBAAiB,CAAC,IAAc;IAC9C,MAAM,GAAG,GAAG,CAAC,IAAY,EAAsB,EAAE;QAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChD,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,MAAM,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;IAEpC,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEhC,MAAM,IAAI,GAAG,IAAA,2BAAU,EAAC,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAEtE,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAO,QAAQ,KAAK,KAAK,CAAC,CAAC;QACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,8DAA8D;IAC9D,IAAI,CAAC;QACH,MAAM,UAAU,GAAG,IAAA,wBAAQ,EAAC,gCAAgC,KAAK,IAAI,OAAO,EAAE,EAC5E,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;QACvC,iEAAiE;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,KAAK,wBAAwB,OAAO,mCAAmC,CAAC,CAAC;IAC7G,CAAC;IAAC,MAAM,CAAC;QACP,qDAAqD;IACvD,CAAC;IAED,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,OAAO,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,OAAO,KAAK,KAAK,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IAEvG,OAAO;QACL,IAAI,EAAE,OAAO;QACb,aAAa,EAAE,IAAI;QACnB,QAAQ,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE;KACvC,CAAC;AACJ,CAAC"}
@@ -1,3 +1,37 @@
1
1
  #!/usr/bin/env node
2
+ interface Rule {
3
+ id: string;
4
+ severity: 'critical' | 'high' | 'medium' | 'low';
5
+ detect: string;
6
+ examples?: string[];
7
+ }
8
+ interface RuleFile {
9
+ category: string;
10
+ severity_context?: string;
11
+ rules: Rule[];
12
+ }
13
+ export interface ReviewInput {
14
+ mode: 'branch' | 'range' | 'walk' | 'repo';
15
+ reviewContent: string;
16
+ metadata?: Record<string, unknown>;
17
+ }
18
+ export interface ParsedArgs {
19
+ stack?: string[];
20
+ reviewType?: string[];
21
+ promptVariant: string;
22
+ base?: string;
23
+ }
24
+ export declare function parseArgs(argv?: string[]): ParsedArgs;
25
+ export declare function getGitDiff(opts: {
26
+ from: string;
27
+ to: string;
28
+ threeDot?: boolean;
29
+ }): string;
30
+ export declare function loadRules(rulesDir: string, selectedFiles?: string[]): RuleFile[];
31
+ export declare function formatRulesForPrompt(ruleFiles: RuleFile[]): string;
32
+ export declare function renderContext(mode: ReviewInput['mode'], metadata?: Record<string, unknown>): string;
33
+ export declare function buildPrompt(template: string, input: ReviewInput, selectedRules: string): string;
34
+ export declare function resolvePromptPath(variant: string, promptsDir: string, mode?: ReviewInput['mode']): string;
35
+ export declare function runPipeline(input: ReviewInput, args: ParsedArgs, preSelectedFiles?: string[]): void;
2
36
  export {};
3
37
  //# sourceMappingURL=redline-review.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"redline-review.d.ts","sourceRoot":"","sources":["../src/redline-review.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"redline-review.d.ts","sourceRoot":"","sources":["../src/redline-review.ts"],"names":[],"mappings":";AAYA,UAAU,IAAI;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,UAAU,QAAQ;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,KAAK,EAAE,IAAI,EAAE,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,CAAC;IAC3C,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,MAAM,WAAW,UAAU;IACzB,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,SAAS,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,UAAU,CAcnE;AAiBD,wBAAgB,UAAU,CAAC,IAAI,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,CAQzF;AA8BD,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,QAAQ,EAAE,CAShF;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,QAAQ,EAAE,GAAG,MAAM,CAYlE;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CA+BnG;AAED,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,CAM/F;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,MAAM,CASzG;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,CAkCnG"}