plan-review 1.0.5 → 1.1.2
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/dist/browser/app.js +64 -40
- package/dist/browser/index.html +451 -42
- package/dist/index.js +30 -272
- package/dist/index.js.map +7 -1
- package/package.json +12 -9
- package/README.md +0 -145
- package/dist/formatter.d.ts +0 -2
- package/dist/formatter.js +0 -60
- package/dist/formatter.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/navigator.d.ts +0 -5
- package/dist/navigator.js +0 -94
- package/dist/navigator.js.map +0 -1
- package/dist/output.d.ts +0 -7
- package/dist/output.js +0 -93
- package/dist/output.js.map +0 -1
- package/dist/parser.d.ts +0 -3
- package/dist/parser.js +0 -265
- package/dist/parser.js.map +0 -1
- package/dist/renderer.d.ts +0 -3
- package/dist/renderer.js +0 -78
- package/dist/renderer.js.map +0 -1
- package/dist/server/assets.d.ts +0 -1
- package/dist/server/assets.js +0 -25
- package/dist/server/assets.js.map +0 -1
- package/dist/server/routes.d.ts +0 -9
- package/dist/server/routes.js +0 -112
- package/dist/server/routes.js.map +0 -1
- package/dist/server/server.d.ts +0 -7
- package/dist/server/server.js +0 -23
- package/dist/server/server.js.map +0 -1
- package/dist/session.d.ts +0 -25
- package/dist/session.js +0 -133
- package/dist/session.js.map +0 -1
- package/dist/transport.d.ts +0 -22
- package/dist/transport.js +0 -35
- package/dist/transport.js.map +0 -1
- package/dist/types.d.ts +0 -34
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/examples/demo-browser.gif +0 -0
- package/examples/demo-plan.md +0 -129
- package/skills/plan-review/SKILL.md +0 -70
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "plan-review",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.2",
|
|
4
4
|
"description": "Interactive CLI for reviewing AI-generated markdown plans",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -13,14 +13,11 @@
|
|
|
13
13
|
"examples"
|
|
14
14
|
],
|
|
15
15
|
"scripts": {
|
|
16
|
-
"build": "
|
|
17
|
-
"build:browser": "node scripts/build-browser.js",
|
|
18
|
-
"dev:browser": "node scripts/build-browser.js --watch",
|
|
16
|
+
"build": "node build.mjs",
|
|
19
17
|
"dev": "tsx src/index.ts",
|
|
20
18
|
"test": "vitest run",
|
|
21
|
-
"test:watch": "vitest",
|
|
22
19
|
"typecheck": "tsc --noEmit",
|
|
23
|
-
"prepublishOnly": "
|
|
20
|
+
"prepublishOnly": ""
|
|
24
21
|
},
|
|
25
22
|
"keywords": [
|
|
26
23
|
"markdown",
|
|
@@ -29,6 +26,15 @@
|
|
|
29
26
|
"cli"
|
|
30
27
|
],
|
|
31
28
|
"license": "MIT",
|
|
29
|
+
"repository": {
|
|
30
|
+
"type": "git",
|
|
31
|
+
"url": "https://github.com/alvaroaac/plan-review.git",
|
|
32
|
+
"directory": "packages/cli"
|
|
33
|
+
},
|
|
34
|
+
"homepage": "https://github.com/alvaroaac/plan-review#readme",
|
|
35
|
+
"bugs": {
|
|
36
|
+
"url": "https://github.com/alvaroaac/plan-review/issues"
|
|
37
|
+
},
|
|
32
38
|
"dependencies": {
|
|
33
39
|
"chalk": "^5.6.2",
|
|
34
40
|
"commander": "^14.0.3",
|
|
@@ -36,12 +42,9 @@
|
|
|
36
42
|
"marked-terminal": "^7.3.0"
|
|
37
43
|
},
|
|
38
44
|
"devDependencies": {
|
|
39
|
-
"@testing-library/preact": "^3.2.4",
|
|
40
|
-
"preact": "^10.29.1",
|
|
41
45
|
"@types/node": "^25.6.0",
|
|
42
46
|
"@vitest/coverage-v8": "^4.1.4",
|
|
43
47
|
"esbuild": "^0.28.0",
|
|
44
|
-
"jsdom": "^29.0.2",
|
|
45
48
|
"tsx": "^4.21.0",
|
|
46
49
|
"typescript": "^6.0.2",
|
|
47
50
|
"vitest": "^4.1.4"
|
package/README.md
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
# plan-review
|
|
2
|
-
|
|
3
|
-
Interactive CLI for reviewing AI-generated markdown plans. Parses plans into sections, renders them in the terminal or browser, collects your comments, and outputs structured feedback — back to the AI or your team.
|
|
4
|
-
|
|
5
|
-
## Install
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
npm install -g plan-review
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
### Claude Code skill (optional)
|
|
12
|
-
|
|
13
|
-
If you use Claude Code, install the companion skill so you can say *"review this plan"*:
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
plan-review install-skill
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Quick start
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
# Try the included demo plan
|
|
23
|
-
plan-review --browser examples/demo-plan.md
|
|
24
|
-
|
|
25
|
-
# Review your own plan
|
|
26
|
-
plan-review path/to/plan.md --browser
|
|
27
|
-
|
|
28
|
-
# Pipe feedback directly to Claude
|
|
29
|
-
plan-review path/to/plan.md --browser -o claude
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## Browser mode (`--browser`)
|
|
33
|
-
|
|
34
|
-

|
|
35
|
-
|
|
36
|
-
The browser mode opens a three-panel review UI:
|
|
37
|
-
|
|
38
|
-
```
|
|
39
|
-
+------------------+----------------------------+------------------+
|
|
40
|
-
| | | |
|
|
41
|
-
| Table of | Rendered markdown | Comment |
|
|
42
|
-
| Contents | with plan metadata | Sidebar |
|
|
43
|
-
| | | |
|
|
44
|
-
| - Milestone 1 | ## Task 1.1 | [Add comment] |
|
|
45
|
-
| * Task 1.1 ✓ | | |
|
|
46
|
-
| * Task 1.2 | **Depends on:** 1.0 | > "Line 3-5" |
|
|
47
|
-
| - Milestone 2 | **Blocks:** 1.2 | Fix the error |
|
|
48
|
-
| * Task 2.1 | | handling here |
|
|
49
|
-
| | Content with line | |
|
|
50
|
-
| | gutters for anchoring | [Submit Review] |
|
|
51
|
-
| | comments to ranges | |
|
|
52
|
-
+------------------+----------------------------+------------------+
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
**Line-anchored comments:** Click a line number in the gutter to start a selection. Shift-click another line to select a range. Your comment is anchored to those exact lines.
|
|
56
|
-
|
|
57
|
-
**Section-level comments:** Click "Add comment to entire section" below any section.
|
|
58
|
-
|
|
59
|
-
**Auto-save:** Comments are saved as you work. Close the browser, come back later, resume where you left off.
|
|
60
|
-
|
|
61
|
-
Click "Submit Review" when done — structured feedback is sent back to the CLI.
|
|
62
|
-
|
|
63
|
-
## Terminal mode (default)
|
|
64
|
-
|
|
65
|
-
```bash
|
|
66
|
-
plan-review path/to/plan.md
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
Interactive terminal UI with table of contents, section navigation, and inline commenting. Works over SSH, in CI, anywhere.
|
|
70
|
-
|
|
71
|
-
| Command | Action |
|
|
72
|
-
|---------|--------|
|
|
73
|
-
| `all` | Linear review through all sections |
|
|
74
|
-
| `1.1` | Jump to a specific section |
|
|
75
|
-
| `done` / `q` | Finish review |
|
|
76
|
-
| `toc` | Return to table of contents |
|
|
77
|
-
| `back` | Go to previous section |
|
|
78
|
-
| *(enter)* | Skip section |
|
|
79
|
-
| *(any text)* | Add comment on current section |
|
|
80
|
-
|
|
81
|
-
## Options
|
|
82
|
-
|
|
83
|
-
```
|
|
84
|
-
-o, --output <target> Output target: stdout, clipboard, file, claude
|
|
85
|
-
--output-file <path> Custom output file path (with --output file)
|
|
86
|
-
--split-by <strategy> Force split strategy: heading, separator
|
|
87
|
-
--fresh Skip session resume, start clean review
|
|
88
|
-
--browser Open browser-based review UI
|
|
89
|
-
-V, --version Show version
|
|
90
|
-
-h, --help Show help
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
## The AI feedback loop
|
|
94
|
-
|
|
95
|
-
The real power is closing the loop between AI-generated plans and human review:
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
AI writes plan → You review with plan-review → Feedback pipes to Claude → AI revises
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
```bash
|
|
102
|
-
# Review in browser, send feedback straight to Claude
|
|
103
|
-
plan-review plan.md --browser -o claude
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
Your anchored, section-by-section comments become structured input the AI can act on — not a wall of text in a chat message.
|
|
107
|
-
|
|
108
|
-
## How it works
|
|
109
|
-
|
|
110
|
-
1. **Parses** your markdown — auto-detects plan-style documents (milestones, tasks, dependencies) or falls back to generic heading-based splitting
|
|
111
|
-
2. **Renders** in terminal or browser depending on mode
|
|
112
|
-
3. **Collects** your comments as you review each section
|
|
113
|
-
4. **Outputs** structured markdown with your comments alongside the original content
|
|
114
|
-
|
|
115
|
-
### Plan mode
|
|
116
|
-
|
|
117
|
-
Documents with `## Milestone` / `### Task` hierarchy and fields like `**Depends On:**`, `**Blocks:**`, `**Verification:**` are detected as plans. Sections show dependency metadata and task IDs.
|
|
118
|
-
|
|
119
|
-
### Generic mode
|
|
120
|
-
|
|
121
|
-
Any markdown with headings gets split into reviewable sections.
|
|
122
|
-
|
|
123
|
-
## Output targets
|
|
124
|
-
|
|
125
|
-
- **stdout** — print to terminal (default)
|
|
126
|
-
- **clipboard** — copy to clipboard (pbcopy/xclip)
|
|
127
|
-
- **file** — write to `<input>.review.md` or custom path
|
|
128
|
-
- **claude** — pipe directly to Claude Code CLI
|
|
129
|
-
|
|
130
|
-
## Saved sessions
|
|
131
|
-
|
|
132
|
-
Review progress is auto-saved as you work. If you close the terminal or browser and re-run `plan-review` on the same file, you'll be prompted to resume where you left off.
|
|
133
|
-
|
|
134
|
-
Sessions are stored in `~/.plan-review/sessions/`.
|
|
135
|
-
|
|
136
|
-
```
|
|
137
|
-
plan-review plan.md --fresh Skip session resume, start clean
|
|
138
|
-
plan-review sessions List all saved sessions
|
|
139
|
-
```
|
|
140
|
-
|
|
141
|
-
Manual cleanup: delete files in `~/.plan-review/sessions/`.
|
|
142
|
-
|
|
143
|
-
## License
|
|
144
|
-
|
|
145
|
-
MIT
|
package/dist/formatter.d.ts
DELETED
package/dist/formatter.js
DELETED
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
function escapeMarkdown(text) {
|
|
2
|
-
return text.replace(/([\\*_`~\[\]#>|])/g, '\\$1');
|
|
3
|
-
}
|
|
4
|
-
function sortComments(comments) {
|
|
5
|
-
return [...comments].sort((a, b) => {
|
|
6
|
-
const aLine = a.anchor?.startLine ?? Infinity;
|
|
7
|
-
const bLine = b.anchor?.startLine ?? Infinity;
|
|
8
|
-
return aLine - bLine;
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
export function formatReview(doc) {
|
|
12
|
-
const commentedSectionIds = new Set(doc.comments.map((c) => c.sectionId));
|
|
13
|
-
const reviewableSections = doc.sections.filter((s) => doc.mode === 'plan' ? s.level === 3 : s.level >= 2);
|
|
14
|
-
const commentedSections = reviewableSections.filter((s) => commentedSectionIds.has(s.id));
|
|
15
|
-
const parts = [];
|
|
16
|
-
parts.push(`# Plan Review: ${doc.title}`);
|
|
17
|
-
parts.push('');
|
|
18
|
-
parts.push('## Review Summary');
|
|
19
|
-
parts.push(`- **Sections reviewed:** ${commentedSections.length}/${reviewableSections.length}`);
|
|
20
|
-
parts.push(`- **Comments:** ${doc.comments.length}`);
|
|
21
|
-
parts.push(`- **Skipped:** ${reviewableSections.length - commentedSections.length} sections without comments`);
|
|
22
|
-
parts.push('');
|
|
23
|
-
parts.push('---');
|
|
24
|
-
for (const section of commentedSections) {
|
|
25
|
-
const sectionComments = sortComments(doc.comments.filter((c) => c.sectionId === section.id));
|
|
26
|
-
parts.push('');
|
|
27
|
-
parts.push(`## Section ${section.id}: ${section.heading}`);
|
|
28
|
-
parts.push('');
|
|
29
|
-
if (doc.mode === 'plan' && section.dependencies) {
|
|
30
|
-
const deps = section.dependencies;
|
|
31
|
-
if (deps.dependsOn.length > 0) {
|
|
32
|
-
parts.push(`Depends on: ${deps.dependsOn.join(', ')}`);
|
|
33
|
-
}
|
|
34
|
-
if (deps.blocks.length > 0) {
|
|
35
|
-
parts.push(`Blocks: ${deps.blocks.join(', ')}`);
|
|
36
|
-
}
|
|
37
|
-
parts.push('');
|
|
38
|
-
}
|
|
39
|
-
for (const comment of sectionComments) {
|
|
40
|
-
if (comment.anchor) {
|
|
41
|
-
parts.push('### Reviewer Comment');
|
|
42
|
-
parts.push('');
|
|
43
|
-
for (const line of comment.anchor.lineTexts) {
|
|
44
|
-
parts.push(`> ${line}`);
|
|
45
|
-
}
|
|
46
|
-
parts.push('');
|
|
47
|
-
parts.push(escapeMarkdown(comment.text));
|
|
48
|
-
}
|
|
49
|
-
else {
|
|
50
|
-
parts.push('### Reviewer Comment (entire section)');
|
|
51
|
-
parts.push('');
|
|
52
|
-
parts.push(escapeMarkdown(comment.text));
|
|
53
|
-
}
|
|
54
|
-
parts.push('');
|
|
55
|
-
parts.push('---');
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return parts.join('\n');
|
|
59
|
-
}
|
|
60
|
-
//# sourceMappingURL=formatter.js.map
|
package/dist/formatter.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
DELETED
package/dist/navigator.d.ts
DELETED
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { PlanDocument, Section } from './types.js';
|
|
2
|
-
export declare function navigate(doc: PlanDocument, inputFromStdin?: boolean, onCommentChange?: () => void): Promise<PlanDocument>;
|
|
3
|
-
export declare function findSection(doc: PlanDocument, input: string): Section | undefined;
|
|
4
|
-
export declare function getReviewableSections(doc: PlanDocument): Section[];
|
|
5
|
-
export declare function printSummary(doc: PlanDocument): void;
|
package/dist/navigator.js
DELETED
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
import * as readline from 'node:readline';
|
|
2
|
-
import chalk from 'chalk';
|
|
3
|
-
import { renderSection, renderToc } from './renderer.js';
|
|
4
|
-
export async function navigate(doc, inputFromStdin = false, onCommentChange) {
|
|
5
|
-
// When input was read from stdin, stdin is exhausted.
|
|
6
|
-
// Open /dev/tty directly for interactive prompts.
|
|
7
|
-
const ttyInput = inputFromStdin
|
|
8
|
-
? (await import('node:fs')).createReadStream('/dev/tty')
|
|
9
|
-
: process.stdin;
|
|
10
|
-
const rl = readline.createInterface({
|
|
11
|
-
input: ttyInput,
|
|
12
|
-
output: process.stderr,
|
|
13
|
-
});
|
|
14
|
-
const ask = (prompt) => new Promise((resolve) => {
|
|
15
|
-
rl.question(prompt, (answer) => resolve(answer.trim()));
|
|
16
|
-
});
|
|
17
|
-
const reviewableSections = getReviewableSections(doc);
|
|
18
|
-
let running = true;
|
|
19
|
-
while (running) {
|
|
20
|
-
console.error(renderToc(doc));
|
|
21
|
-
const input = await ask(chalk.cyan('> Enter section (e.g. 1.1), \'all\' for linear review, or \'done\' to finish: '));
|
|
22
|
-
if (input === 'done' || input === 'q') {
|
|
23
|
-
running = false;
|
|
24
|
-
}
|
|
25
|
-
else if (input === 'all') {
|
|
26
|
-
await linearReview(doc, reviewableSections, ask, onCommentChange);
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
const section = findSection(doc, input);
|
|
30
|
-
if (section) {
|
|
31
|
-
const startIdx = reviewableSections.indexOf(section);
|
|
32
|
-
await linearReview(doc, reviewableSections.slice(startIdx), ask, onCommentChange);
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
console.error(chalk.red(`Section "${input}" not found. Try again.`));
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
rl.close();
|
|
40
|
-
printSummary(doc);
|
|
41
|
-
return doc;
|
|
42
|
-
}
|
|
43
|
-
async function linearReview(doc, sections, ask, onCommentChange) {
|
|
44
|
-
for (let i = 0; i < sections.length; i++) {
|
|
45
|
-
const section = sections[i];
|
|
46
|
-
console.error(renderSection(section));
|
|
47
|
-
const input = await ask(chalk.cyan('> Comment (enter to skip, \'toc\' for menu, \'back\' for previous): '));
|
|
48
|
-
if (input === 'toc') {
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
else if (input === 'back') {
|
|
52
|
-
i -= (i > 0) ? 2 : 1; // -2 to go back (loop increments), -1 to re-show current
|
|
53
|
-
continue;
|
|
54
|
-
}
|
|
55
|
-
else if (input !== '') {
|
|
56
|
-
doc.comments.push({
|
|
57
|
-
sectionId: section.id,
|
|
58
|
-
text: input,
|
|
59
|
-
timestamp: new Date(),
|
|
60
|
-
});
|
|
61
|
-
onCommentChange?.();
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
export function findSection(doc, input) {
|
|
66
|
-
// Try exact ID match first
|
|
67
|
-
const byId = doc.sections.find((s) => s.id === input);
|
|
68
|
-
if (byId)
|
|
69
|
-
return byId;
|
|
70
|
-
// Try numeric index for generic mode
|
|
71
|
-
const num = parseInt(input, 10);
|
|
72
|
-
if (!isNaN(num)) {
|
|
73
|
-
const reviewable = getReviewableSections(doc);
|
|
74
|
-
if (num >= 1 && num <= reviewable.length) {
|
|
75
|
-
return reviewable[num - 1];
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
return undefined;
|
|
79
|
-
}
|
|
80
|
-
export function getReviewableSections(doc) {
|
|
81
|
-
return doc.sections.filter((s) => doc.mode === 'plan' ? s.level === 3 : s.level >= 2);
|
|
82
|
-
}
|
|
83
|
-
export function printSummary(doc) {
|
|
84
|
-
const reviewable = getReviewableSections(doc);
|
|
85
|
-
const commentedIds = new Set(doc.comments.map((c) => c.sectionId));
|
|
86
|
-
console.error('');
|
|
87
|
-
console.error(chalk.bold('Review Summary'));
|
|
88
|
-
console.error(` Sections: ${reviewable.length}`);
|
|
89
|
-
console.error(` Commented: ${chalk.green(String(commentedIds.size))}`);
|
|
90
|
-
console.error(` Skipped: ${chalk.dim(String(reviewable.length - commentedIds.size))}`);
|
|
91
|
-
console.error(` Total comments: ${doc.comments.length}`);
|
|
92
|
-
console.error('');
|
|
93
|
-
}
|
|
94
|
-
//# sourceMappingURL=navigator.js.map
|
package/dist/navigator.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigator.js","sourceRoot":"","sources":["../src/navigator.ts"],"names":[],"mappings":"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"}
|
package/dist/output.d.ts
DELETED
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import type { OutputTarget } from './types.js';
|
|
2
|
-
export declare function writeOutput(content: string, target: OutputTarget, options?: {
|
|
3
|
-
outputFile?: string;
|
|
4
|
-
inputFile?: string;
|
|
5
|
-
}): void;
|
|
6
|
-
export declare function getClipboardCommand(platform: string): string | null;
|
|
7
|
-
export declare function isClaudeAvailable(): boolean;
|
package/dist/output.js
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { execSync, spawn } from 'node:child_process';
|
|
2
|
-
import { writeFileSync } from 'node:fs';
|
|
3
|
-
import { resolve } from 'node:path';
|
|
4
|
-
import chalk from 'chalk';
|
|
5
|
-
export function writeOutput(content, target, options = {}) {
|
|
6
|
-
switch (target) {
|
|
7
|
-
case 'stdout':
|
|
8
|
-
process.stdout.write(content + '\n');
|
|
9
|
-
break;
|
|
10
|
-
case 'clipboard':
|
|
11
|
-
writeToClipboard(content);
|
|
12
|
-
break;
|
|
13
|
-
case 'file':
|
|
14
|
-
writeToFile(content, options.outputFile, options.inputFile);
|
|
15
|
-
break;
|
|
16
|
-
case 'claude':
|
|
17
|
-
sendToClaude(content);
|
|
18
|
-
break;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
function writeToClipboard(content) {
|
|
22
|
-
const cmd = getClipboardCommand(process.platform);
|
|
23
|
-
if (!cmd) {
|
|
24
|
-
console.error(chalk.yellow('Clipboard not supported on this platform. Falling back to stdout.'));
|
|
25
|
-
process.stdout.write(content + '\n');
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
try {
|
|
29
|
-
execSync(cmd, { input: content, stdio: ['pipe', 'ignore', 'ignore'] });
|
|
30
|
-
console.error(chalk.green('Review copied to clipboard.'));
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
console.error(chalk.yellow('Failed to copy to clipboard. Falling back to stdout.'));
|
|
34
|
-
process.stdout.write(content + '\n');
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
function writeToFile(content, outputFile, inputFile) {
|
|
38
|
-
const filePath = outputFile
|
|
39
|
-
? resolve(outputFile)
|
|
40
|
-
: inputFile
|
|
41
|
-
? resolve(inputFile.replace(/\.md$/, '.review.md'))
|
|
42
|
-
: resolve('review.md');
|
|
43
|
-
try {
|
|
44
|
-
writeFileSync(filePath, content, 'utf-8');
|
|
45
|
-
console.error(chalk.green(`Review written to ${filePath}`));
|
|
46
|
-
}
|
|
47
|
-
catch (err) {
|
|
48
|
-
const msg = err instanceof Error ? err.message : String(err);
|
|
49
|
-
console.error(chalk.red(`Failed to write file: ${msg}`));
|
|
50
|
-
console.error(chalk.yellow('Falling back to stdout.'));
|
|
51
|
-
process.stdout.write(content + '\n');
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
function sendToClaude(content) {
|
|
55
|
-
if (!isClaudeAvailable()) {
|
|
56
|
-
console.error(chalk.red('Claude CLI not found in PATH.'));
|
|
57
|
-
console.error(chalk.dim('Install: https://docs.anthropic.com/en/docs/claude-code'));
|
|
58
|
-
console.error(chalk.yellow('Falling back to stdout.'));
|
|
59
|
-
process.stdout.write(content + '\n');
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
const child = spawn('claude', [], {
|
|
63
|
-
stdio: ['pipe', 'inherit', 'inherit'],
|
|
64
|
-
});
|
|
65
|
-
child.stdin.write(content);
|
|
66
|
-
child.stdin.end();
|
|
67
|
-
child.on('error', (err) => {
|
|
68
|
-
console.error(chalk.yellow(`Failed to pipe to claude: ${err.message}. Falling back to stdout.`));
|
|
69
|
-
process.stdout.write(content + '\n');
|
|
70
|
-
});
|
|
71
|
-
}
|
|
72
|
-
export function getClipboardCommand(platform) {
|
|
73
|
-
switch (platform) {
|
|
74
|
-
case 'darwin':
|
|
75
|
-
return 'pbcopy';
|
|
76
|
-
case 'linux':
|
|
77
|
-
return 'xclip -selection clipboard';
|
|
78
|
-
case 'win32':
|
|
79
|
-
return 'clip';
|
|
80
|
-
default:
|
|
81
|
-
return null;
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
export function isClaudeAvailable() {
|
|
85
|
-
try {
|
|
86
|
-
execSync('which claude', { stdio: 'ignore' });
|
|
87
|
-
return true;
|
|
88
|
-
}
|
|
89
|
-
catch {
|
|
90
|
-
return false;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=output.js.map
|
package/dist/output.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","sourceRoot":"","sources":["../src/output.ts"],"names":[],"mappings":"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"}
|
package/dist/parser.d.ts
DELETED