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.
Files changed (43) hide show
  1. package/dist/browser/app.js +64 -40
  2. package/dist/browser/index.html +451 -42
  3. package/dist/index.js +30 -272
  4. package/dist/index.js.map +7 -1
  5. package/package.json +12 -9
  6. package/README.md +0 -145
  7. package/dist/formatter.d.ts +0 -2
  8. package/dist/formatter.js +0 -60
  9. package/dist/formatter.js.map +0 -1
  10. package/dist/index.d.ts +0 -2
  11. package/dist/navigator.d.ts +0 -5
  12. package/dist/navigator.js +0 -94
  13. package/dist/navigator.js.map +0 -1
  14. package/dist/output.d.ts +0 -7
  15. package/dist/output.js +0 -93
  16. package/dist/output.js.map +0 -1
  17. package/dist/parser.d.ts +0 -3
  18. package/dist/parser.js +0 -265
  19. package/dist/parser.js.map +0 -1
  20. package/dist/renderer.d.ts +0 -3
  21. package/dist/renderer.js +0 -78
  22. package/dist/renderer.js.map +0 -1
  23. package/dist/server/assets.d.ts +0 -1
  24. package/dist/server/assets.js +0 -25
  25. package/dist/server/assets.js.map +0 -1
  26. package/dist/server/routes.d.ts +0 -9
  27. package/dist/server/routes.js +0 -112
  28. package/dist/server/routes.js.map +0 -1
  29. package/dist/server/server.d.ts +0 -7
  30. package/dist/server/server.js +0 -23
  31. package/dist/server/server.js.map +0 -1
  32. package/dist/session.d.ts +0 -25
  33. package/dist/session.js +0 -133
  34. package/dist/session.js.map +0 -1
  35. package/dist/transport.d.ts +0 -22
  36. package/dist/transport.js +0 -35
  37. package/dist/transport.js.map +0 -1
  38. package/dist/types.d.ts +0 -34
  39. package/dist/types.js +0 -2
  40. package/dist/types.js.map +0 -1
  41. package/examples/demo-browser.gif +0 -0
  42. package/examples/demo-plan.md +0 -129
  43. package/skills/plan-review/SKILL.md +0 -70
package/dist/parser.js DELETED
@@ -1,265 +0,0 @@
1
- const MIN_SECTION_CHARS = 5;
2
- export function parse(input, strategy = 'auto') {
3
- const lines = input.split('\n');
4
- const title = extractTitle(lines);
5
- const metadata = extractMetadata(lines);
6
- if (strategy === 'auto') {
7
- if (isPlanDocument(input)) {
8
- return parsePlan(input, title, metadata);
9
- }
10
- return parseGeneric(input, title, metadata);
11
- }
12
- if (strategy === 'separator') {
13
- return parseBySeparator(input, title, metadata);
14
- }
15
- return parseGeneric(input, title, metadata);
16
- }
17
- function extractTitle(lines) {
18
- const h1 = lines.find((l) => /^# /.test(l));
19
- return h1 ? h1.replace(/^# /, '').trim() : 'Untitled';
20
- }
21
- function extractMetadata(lines) {
22
- const meta = {};
23
- for (const line of lines.slice(0, 20)) {
24
- const match = line.match(/^\*\*(\w[\w\s]*?):\*\*\s*(.+)/);
25
- if (match) {
26
- meta[match[1].trim()] = match[2].trim();
27
- }
28
- }
29
- return meta;
30
- }
31
- export function isPlanDocument(input) {
32
- const stripped = input.replace(/```[\s\S]*?```/g, '');
33
- const hasH2H3Hierarchy = /^## /m.test(stripped) && /^### /m.test(stripped);
34
- const hasPlanFields = /\*\*Depends On:\*\*/m.test(stripped) ||
35
- /\*\*Blocks:\*\*/m.test(stripped) ||
36
- /\*\*Verification:\*\*/m.test(stripped) ||
37
- /\*\*Related Files:\*\*/m.test(stripped);
38
- return hasH2H3Hierarchy && hasPlanFields;
39
- }
40
- function parseGeneric(input, title, metadata) {
41
- const sections = splitByHeadings(input);
42
- if (sections.length === 0) {
43
- return parseBySeparator(input, title, metadata);
44
- }
45
- return {
46
- title,
47
- metadata,
48
- mode: 'generic',
49
- sections: sections.map((s, i) => ({
50
- id: `section-${i + 1}`,
51
- heading: s.heading,
52
- level: s.level,
53
- body: s.body,
54
- })),
55
- comments: [],
56
- };
57
- }
58
- function splitByHeadings(input) {
59
- const lines = input.split('\n');
60
- const sections = [];
61
- let currentHeading = '';
62
- let currentLevel = 0;
63
- let currentBody = [];
64
- // Find the most common heading level (## or ###)
65
- const h2Count = (input.match(/^## /gm) || []).length;
66
- const h3Count = (input.match(/^### /gm) || []).length;
67
- const splitLevel = h2Count > 0 ? 2 : h3Count > 0 ? 3 : 0;
68
- if (splitLevel === 0)
69
- return [];
70
- const headingRegex = new RegExp(`^${'#'.repeat(splitLevel)} (.+)`);
71
- let inCodeBlock = false;
72
- for (const line of lines) {
73
- if (line.startsWith('```')) {
74
- inCodeBlock = !inCodeBlock;
75
- if (currentHeading) {
76
- currentBody.push(line);
77
- }
78
- continue;
79
- }
80
- if (inCodeBlock) {
81
- if (currentHeading) {
82
- currentBody.push(line);
83
- }
84
- continue;
85
- }
86
- const match = line.match(headingRegex);
87
- if (match) {
88
- if (currentHeading) {
89
- sections.push({
90
- heading: currentHeading,
91
- level: currentLevel,
92
- body: currentBody.join('\n').trim(),
93
- });
94
- }
95
- currentHeading = match[1].trim();
96
- currentLevel = splitLevel;
97
- currentBody = [];
98
- }
99
- else if (currentHeading) {
100
- currentBody.push(line);
101
- }
102
- }
103
- if (currentHeading) {
104
- sections.push({
105
- heading: currentHeading,
106
- level: currentLevel,
107
- body: currentBody.join('\n').trim(),
108
- });
109
- }
110
- return sections;
111
- }
112
- function parseBySeparator(input, title, metadata) {
113
- const parts = input.split(/\n---\n/).filter((p) => {
114
- return p.trim().length >= MIN_SECTION_CHARS;
115
- });
116
- if (parts.length <= 1) {
117
- return {
118
- title,
119
- metadata,
120
- mode: 'generic',
121
- sections: [
122
- {
123
- id: 'section-1',
124
- heading: title,
125
- level: 1,
126
- body: input.trim(),
127
- },
128
- ],
129
- comments: [],
130
- };
131
- }
132
- return {
133
- title,
134
- metadata,
135
- mode: 'generic',
136
- sections: parts.map((p, i) => {
137
- const lines = p.trim().split('\n');
138
- const firstLine = lines[0].replace(/^#+\s*/, '').trim();
139
- return {
140
- id: `section-${i + 1}`,
141
- heading: firstLine || `Section ${i + 1}`,
142
- level: 2,
143
- body: p.trim(),
144
- };
145
- }),
146
- comments: [],
147
- };
148
- }
149
- function parsePlan(input, title, metadata) {
150
- const lines = input.split('\n');
151
- const sections = [];
152
- let milestoneIndex = 0;
153
- let taskIndex = 0;
154
- let currentMilestoneId = '';
155
- let currentHeading = '';
156
- let currentLevel = 0;
157
- let currentBody = [];
158
- let inCodeBlock = false;
159
- function flushSection() {
160
- if (!currentHeading)
161
- return;
162
- const body = currentBody.join('\n').trim();
163
- if (currentLevel === 2) {
164
- milestoneIndex++;
165
- taskIndex = 0;
166
- currentMilestoneId = `milestone-${milestoneIndex}`;
167
- sections.push({
168
- id: currentMilestoneId,
169
- heading: currentHeading,
170
- level: 2,
171
- body,
172
- });
173
- return;
174
- }
175
- taskIndex++;
176
- const id = `${milestoneIndex}.${taskIndex}`;
177
- sections.push({
178
- id,
179
- heading: currentHeading,
180
- level: 3,
181
- body,
182
- parent: currentMilestoneId,
183
- dependencies: extractDependencies(body),
184
- relatedFiles: extractRelatedFiles(body),
185
- verification: extractVerification(body),
186
- });
187
- }
188
- for (const line of lines) {
189
- if (line.startsWith('```')) {
190
- inCodeBlock = !inCodeBlock;
191
- currentBody.push(line);
192
- continue;
193
- }
194
- if (inCodeBlock) {
195
- currentBody.push(line);
196
- continue;
197
- }
198
- const h2Match = line.match(/^## (.+)/);
199
- const h3Match = line.match(/^### (.+)/);
200
- if (h2Match) {
201
- flushSection();
202
- currentHeading = h2Match[1].trim();
203
- currentLevel = 2;
204
- currentBody = [];
205
- }
206
- else if (h3Match) {
207
- flushSection();
208
- currentHeading = h3Match[1].trim();
209
- currentLevel = 3;
210
- currentBody = [];
211
- }
212
- else {
213
- currentBody.push(line);
214
- }
215
- }
216
- flushSection();
217
- return {
218
- title,
219
- metadata,
220
- mode: 'plan',
221
- sections,
222
- comments: [],
223
- };
224
- }
225
- function extractDependencies(body) {
226
- const dependsMatch = body.match(/\*\*Depends On:\*\*\s*(.+)/);
227
- const blocksMatch = body.match(/\*\*Blocks:\*\*\s*(.+)/);
228
- const parseList = (raw) => {
229
- const trimmed = raw.trim();
230
- if (trimmed === '(none)' || trimmed === '')
231
- return [];
232
- return trimmed.split(/,\s*/).map((s) => s.trim());
233
- };
234
- return {
235
- dependsOn: dependsMatch ? parseList(dependsMatch[1]) : [],
236
- blocks: blocksMatch ? parseList(blocksMatch[1]) : [],
237
- };
238
- }
239
- function extractRelatedFiles(body) {
240
- const files = [];
241
- const lines = body.split('\n');
242
- let inRelatedFiles = false;
243
- for (const line of lines) {
244
- if (/\*\*Related Files:\*\*/.test(line)) {
245
- inRelatedFiles = true;
246
- continue;
247
- }
248
- if (inRelatedFiles) {
249
- const fileMatch = line.match(/^- `(.+)`(.*)$/);
250
- if (fileMatch) {
251
- const suffix = fileMatch[2].trim();
252
- files.push(suffix ? `${fileMatch[1]} ${suffix}` : fileMatch[1]);
253
- }
254
- else if (line.trim() === '' || /^\*\*/.test(line.trim())) {
255
- inRelatedFiles = false;
256
- }
257
- }
258
- }
259
- return files;
260
- }
261
- function extractVerification(body) {
262
- const match = body.match(/\*\*Verification:\*\*\s*`(.+?)`/);
263
- return match ? match[1] : undefined;
264
- }
265
- //# sourceMappingURL=parser.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,MAAM,UAAU,KAAK,CAAC,KAAa,EAAE,WAA0B,MAAM;IACnE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAClC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAExC,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;QACxB,IAAI,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;QACD,OAAO,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;QAC7B,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,OAAO,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,YAAY,CAAC,KAAe;IACnC,MAAM,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;AACxD,CAAC;AAED,SAAS,eAAe,CAAC,KAAe;IACtC,MAAM,IAAI,GAA2B,EAAE,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;QACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC1D,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;IACtD,MAAM,gBAAgB,GACpB,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpD,MAAM,aAAa,GACjB,sBAAsB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACrC,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACjC,wBAAwB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACvC,yBAAyB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAE3C,OAAO,gBAAgB,IAAI,aAAa,CAAC;AAC3C,CAAC;AAED,SAAS,YAAY,CACnB,KAAa,EACb,KAAa,EACb,QAAgC;IAEhC,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAExC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,gBAAgB,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;IAED,OAAO;QACL,KAAK;QACL,QAAQ;QACR,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;YAChC,EAAE,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE;YACtB,OAAO,EAAE,CAAC,CAAC,OAAO;YAClB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,IAAI,EAAE,CAAC,CAAC,IAAI;SACb,CAAC,CAAC;QACH,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAQD,SAAS,eAAe,CAAC,KAAa;IACpC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAClC,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAa,EAAE,CAAC;IAE/B,iDAAiD;IACjD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACrD,MAAM,OAAO,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;IACtD,MAAM,UAAU,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzD,IAAI,UAAU,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAEhC,MAAM,YAAY,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IACnE,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,WAAW,GAAG,CAAC,WAAW,CAAC;YAC3B,IAAI,cAAc,EAAE,CAAC;gBACnB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,IAAI,cAAc,EAAE,CAAC;gBACnB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;QACvC,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,cAAc,EAAE,CAAC;gBACnB,QAAQ,CAAC,IAAI,CAAC;oBACZ,OAAO,EAAE,cAAc;oBACvB,KAAK,EAAE,YAAY;oBACnB,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;iBACpC,CAAC,CAAC;YACL,CAAC;YACD,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACjC,YAAY,GAAG,UAAU,CAAC;YAC1B,WAAW,GAAG,EAAE,CAAC;QACnB,CAAC;aAAM,IAAI,cAAc,EAAE,CAAC;YAC1B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IAED,IAAI,cAAc,EAAE,CAAC;QACnB,QAAQ,CAAC,IAAI,CAAC;YACZ,OAAO,EAAE,cAAc;YACvB,KAAK,EAAE,YAAY;YACnB,IAAI,EAAE,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;SACpC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,gBAAgB,CACvB,KAAa,EACb,KAAa,EACb,QAAgC;IAEhC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;QAChD,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,MAAM,IAAI,iBAAiB,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,KAAK;YACL,QAAQ;YACR,IAAI,EAAE,SAAS;YACf,QAAQ,EAAE;gBACR;oBACE,EAAE,EAAE,WAAW;oBACf,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE,CAAC;oBACR,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;iBACnB;aACF;YACD,QAAQ,EAAE,EAAE;SACb,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK;QACL,QAAQ;QACR,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YAC3B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YACnC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YACxD,OAAO;gBACL,EAAE,EAAE,WAAW,CAAC,GAAG,CAAC,EAAE;gBACtB,OAAO,EAAE,SAAS,IAAI,WAAW,CAAC,GAAG,CAAC,EAAE;gBACxC,KAAK,EAAE,CAAC;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE;aACf,CAAC;QACJ,CAAC,CAAC;QACF,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAChB,KAAa,EACb,KAAa,EACb,QAAgC;IAEhC,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,QAAQ,GAAc,EAAE,CAAC;IAE/B,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,kBAAkB,GAAG,EAAE,CAAC;IAC5B,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,YAAY,GAAG,CAAC,CAAC;IACrB,IAAI,WAAW,GAAa,EAAE,CAAC;IAC/B,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,SAAS,YAAY;QACnB,IAAI,CAAC,cAAc;YAAE,OAAO;QAE5B,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QAE3C,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;YACvB,cAAc,EAAE,CAAC;YACjB,SAAS,GAAG,CAAC,CAAC;YACd,kBAAkB,GAAG,aAAa,cAAc,EAAE,CAAC;YACnD,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE,EAAE,kBAAkB;gBACtB,OAAO,EAAE,cAAc;gBACvB,KAAK,EAAE,CAAC;gBACR,IAAI;aACL,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,SAAS,EAAE,CAAC;QACZ,MAAM,EAAE,GAAG,GAAG,cAAc,IAAI,SAAS,EAAE,CAAC;QAC5C,QAAQ,CAAC,IAAI,CAAC;YACZ,EAAE;YACF,OAAO,EAAE,cAAc;YACvB,KAAK,EAAE,CAAC;YACR,IAAI;YACJ,MAAM,EAAE,kBAAkB;YAC1B,YAAY,EAAE,mBAAmB,CAAC,IAAI,CAAC;YACvC,YAAY,EAAE,mBAAmB,CAAC,IAAI,CAAC;YACvC,YAAY,EAAE,mBAAmB,CAAC,IAAI,CAAC;SACxC,CAAC,CAAC;IACL,CAAC;IAED,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAC3B,WAAW,GAAG,CAAC,WAAW,CAAC;YAC3B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QAED,IAAI,WAAW,EAAE,CAAC;YAChB,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAExC,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,EAAE,CAAC;YACf,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,YAAY,GAAG,CAAC,CAAC;YACjB,WAAW,GAAG,EAAE,CAAC;QACnB,CAAC;aAAM,IAAI,OAAO,EAAE,CAAC;YACnB,YAAY,EAAE,CAAC;YACf,cAAc,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACnC,YAAY,GAAG,CAAC,CAAC;YACjB,WAAW,GAAG,EAAE,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,YAAY,EAAE,CAAC;IAEf,OAAO;QACL,KAAK;QACL,QAAQ;QACR,IAAI,EAAE,MAAM;QACZ,QAAQ;QACR,QAAQ,EAAE,EAAE;KACb,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,4BAA4B,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAEzD,MAAM,SAAS,GAAG,CAAC,GAAW,EAAY,EAAE;QAC1C,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QAC3B,IAAI,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,EAAE;YAAE,OAAO,EAAE,CAAC;QACtD,OAAO,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC,CAAC;IAEF,OAAO;QACL,SAAS,EAAE,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;QACzD,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;KACrD,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,cAAc,GAAG,KAAK,CAAC;IAE3B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACxC,cAAc,GAAG,IAAI,CAAC;YACtB,SAAS;QACX,CAAC;QACD,IAAI,cAAc,EAAE,CAAC;YACnB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;YAC/C,IAAI,SAAS,EAAE,CAAC;gBACd,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;gBACnC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAClE,CAAC;iBAAM,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBAC3D,cAAc,GAAG,KAAK,CAAC;YACzB,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC5D,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACtC,CAAC"}
@@ -1,3 +0,0 @@
1
- import type { Section, PlanDocument } from './types.js';
2
- export declare function renderSection(section: Section): string;
3
- export declare function renderToc(doc: PlanDocument): string;
package/dist/renderer.js DELETED
@@ -1,78 +0,0 @@
1
- import { marked } from 'marked';
2
- import { markedTerminal } from 'marked-terminal';
3
- import chalk from 'chalk';
4
- marked.use(markedTerminal());
5
- export function renderSection(section) {
6
- const parts = [];
7
- if (section.level === 3 && section.dependencies) {
8
- parts.push(renderMetadataHeader(section));
9
- parts.push('');
10
- }
11
- const heading = `${'#'.repeat(section.level)} ${section.heading}`;
12
- const body = section.body || '';
13
- const markdown = `${heading}\n\n${body}`;
14
- parts.push(marked.parse(markdown));
15
- return parts.join('\n');
16
- }
17
- function renderMetadataHeader(section) {
18
- const deps = section.dependencies;
19
- const dependsOn = deps.dependsOn.length > 0 ? deps.dependsOn.join(', ') : '(none)';
20
- const blocks = deps.blocks.length > 0 ? deps.blocks.join(', ') : '(none)';
21
- const lines = [
22
- `Task ${section.id}: ${section.heading}`,
23
- `← Depends on: ${dependsOn}`,
24
- `→ Blocks: ${blocks}`,
25
- ];
26
- if (section.relatedFiles && section.relatedFiles.length > 0) {
27
- const fileList = section.relatedFiles.length <= 2
28
- ? section.relatedFiles.join(', ')
29
- : `${section.relatedFiles[0]} (+${section.relatedFiles.length - 1} more)`;
30
- lines.push(`Files: ${fileList}`);
31
- }
32
- if (section.verification) {
33
- lines.push(`Verify: ${section.verification}`);
34
- }
35
- const maxLen = Math.max(...lines.map((l) => l.length));
36
- const width = Math.min(maxLen + 4, process.stdout.columns || 80);
37
- const innerWidth = width - 2;
38
- const top = chalk.dim(`┌${'─'.repeat(innerWidth)}┐`);
39
- const bottom = chalk.dim(`└${'─'.repeat(innerWidth)}┘`);
40
- const content = lines.map((l) => chalk.dim('│') + ' ' + chalk.cyan(l.slice(0, innerWidth - 2).padEnd(innerWidth - 2)) + ' ' + chalk.dim('│'));
41
- return [top, ...content, bottom].join('\n');
42
- }
43
- export function renderToc(doc) {
44
- const parts = [];
45
- const commentedIds = new Set(doc.comments.map((c) => c.sectionId));
46
- parts.push('');
47
- parts.push(chalk.bold.underline(doc.title));
48
- parts.push('');
49
- if (doc.mode === 'plan') {
50
- for (const section of doc.sections) {
51
- if (section.level === 2) {
52
- parts.push(chalk.bold.yellow(` ${section.heading}`));
53
- }
54
- else if (section.level === 3) {
55
- const marker = commentedIds.has(section.id) ? chalk.green('✓') : ' ';
56
- parts.push(` ${marker} ${chalk.dim(section.id)} ${section.heading}`);
57
- }
58
- }
59
- }
60
- else {
61
- const reviewable = doc.sections.filter((s) => s.level >= 2);
62
- for (let i = 0; i < reviewable.length; i++) {
63
- const section = reviewable[i];
64
- const num = String(i + 1).padStart(2);
65
- const marker = commentedIds.has(section.id) ? chalk.green('✓') : ' ';
66
- parts.push(` ${marker} ${chalk.dim(num)} ${section.heading}`);
67
- }
68
- }
69
- const commentedCount = commentedIds.size;
70
- const reviewable = doc.sections.filter((s) => doc.mode === 'plan' ? s.level === 3 : s.level >= 2);
71
- const remaining = reviewable.length - commentedCount;
72
- parts.push('');
73
- parts.push(` ${chalk.green(`${commentedCount} section${commentedCount !== 1 ? 's' : ''} commented`)}` +
74
- ` ${chalk.dim(`${remaining} remaining`)}`);
75
- parts.push('');
76
- return parts.join('\n');
77
- }
78
- //# sourceMappingURL=renderer.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"renderer.js","sourceRoot":"","sources":["../src/renderer.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- export declare function getAssetHtml(): string;
@@ -1,25 +0,0 @@
1
- import { readFileSync, existsSync } from 'node:fs';
2
- import { join, dirname } from 'node:path';
3
- import { fileURLToPath } from 'node:url';
4
- const __dirname = dirname(fileURLToPath(import.meta.url));
5
- // When running from source (vitest), look for pre-built dist/browser/index.html
6
- // When running from dist, the sibling ../browser/ path is used
7
- function resolveHtmlPath() {
8
- const siblingPath = join(__dirname, '..', 'browser', 'index.html');
9
- if (existsSync(siblingPath))
10
- return siblingPath;
11
- // Fallback: walk up to project root and look in dist/browser/
12
- const projectRoot = join(__dirname, '..', '..');
13
- const distPath = join(projectRoot, 'dist', 'browser', 'index.html');
14
- if (existsSync(distPath))
15
- return distPath;
16
- throw new Error(`Browser HTML not found. Run 'npm run build' first.\nLooked in:\n ${siblingPath}\n ${distPath}`);
17
- }
18
- let cached = null;
19
- export function getAssetHtml() {
20
- if (!cached) {
21
- cached = readFileSync(resolveHtmlPath(), 'utf-8');
22
- }
23
- return cached;
24
- }
25
- //# sourceMappingURL=assets.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/server/assets.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,MAAM,SAAS,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAE1D,gFAAgF;AAChF,+DAA+D;AAC/D,SAAS,eAAe;IACtB,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACnE,IAAI,UAAU,CAAC,WAAW,CAAC;QAAE,OAAO,WAAW,CAAC;IAEhD,8DAA8D;IAC9D,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;IACpE,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAE1C,MAAM,IAAI,KAAK,CAAC,qEAAqE,WAAW,OAAO,QAAQ,EAAE,CAAC,CAAC;AACrH,CAAC;AAED,IAAI,MAAM,GAAkB,IAAI,CAAC;AAEjC,MAAM,UAAU,YAAY;IAC1B,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,GAAG,YAAY,CAAC,eAAe,EAAE,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -1,9 +0,0 @@
1
- import type { IncomingMessage, ServerResponse } from 'node:http';
2
- import type { PlanDocument, ReviewComment } from '../types.js';
3
- export interface RouteContext {
4
- getDocument: () => PlanDocument;
5
- onSubmit: (comments: ReviewComment[]) => void;
6
- getAssetHtml: () => string;
7
- onSessionSave?: (comments: ReviewComment[], activeSection: string | null) => void;
8
- }
9
- export declare function createRouteHandler(ctx: RouteContext): (req: IncomingMessage, res: ServerResponse) => void;
@@ -1,112 +0,0 @@
1
- const MAX_BODY_SIZE = 1024 * 1024; // 1MB
2
- function validateComment(obj) {
3
- if (typeof obj !== 'object' || obj === null)
4
- return false;
5
- const c = obj;
6
- return typeof c.sectionId === 'string' && typeof c.text === 'string';
7
- }
8
- export function createRouteHandler(ctx) {
9
- return (req, res) => {
10
- const { method, url } = req;
11
- if (method === 'GET' && url === '/') {
12
- const html = ctx.getAssetHtml();
13
- res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
14
- res.end(html);
15
- return;
16
- }
17
- if (method === 'GET' && url === '/api/doc') {
18
- const doc = ctx.getDocument();
19
- res.writeHead(200, { 'Content-Type': 'application/json' });
20
- res.end(JSON.stringify({ document: doc }));
21
- return;
22
- }
23
- if (method === 'POST' && url === '/api/review') {
24
- let body = '';
25
- let size = 0;
26
- req.on('data', (chunk) => {
27
- size += chunk.length;
28
- if (size > MAX_BODY_SIZE) {
29
- res.writeHead(413, { 'Content-Type': 'application/json' });
30
- res.end(JSON.stringify({ error: 'Request body too large' }));
31
- req.destroy();
32
- return;
33
- }
34
- body += chunk.toString();
35
- });
36
- req.on('end', () => {
37
- if (size > MAX_BODY_SIZE)
38
- return;
39
- try {
40
- const parsed = JSON.parse(body);
41
- const comments = parsed.comments;
42
- if (!Array.isArray(comments)) {
43
- res.writeHead(400, { 'Content-Type': 'application/json' });
44
- res.end(JSON.stringify({ error: 'comments must be an array' }));
45
- return;
46
- }
47
- for (const c of comments) {
48
- if (!validateComment(c)) {
49
- res.writeHead(400, { 'Content-Type': 'application/json' });
50
- res.end(JSON.stringify({ error: 'Each comment must have sectionId (string) and text (string)' }));
51
- return;
52
- }
53
- }
54
- ctx.onSubmit(comments);
55
- res.writeHead(200, { 'Content-Type': 'application/json' });
56
- res.end(JSON.stringify({ success: true }));
57
- }
58
- catch {
59
- res.writeHead(400, { 'Content-Type': 'application/json' });
60
- res.end(JSON.stringify({ error: 'Invalid JSON' }));
61
- }
62
- });
63
- return;
64
- }
65
- if (method === 'PUT' && url === '/api/session') {
66
- let body = '';
67
- let size = 0;
68
- req.on('data', (chunk) => {
69
- size += chunk.length;
70
- if (size > MAX_BODY_SIZE) {
71
- res.writeHead(413, { 'Content-Type': 'application/json' });
72
- res.end(JSON.stringify({ error: 'Request body too large' }));
73
- req.destroy();
74
- return;
75
- }
76
- body += chunk.toString();
77
- });
78
- req.on('end', () => {
79
- if (size > MAX_BODY_SIZE)
80
- return;
81
- try {
82
- const parsed = JSON.parse(body);
83
- const comments = parsed.comments;
84
- if (!Array.isArray(comments)) {
85
- res.writeHead(400, { 'Content-Type': 'application/json' });
86
- res.end(JSON.stringify({ error: 'comments must be an array' }));
87
- return;
88
- }
89
- for (const c of comments) {
90
- if (!validateComment(c)) {
91
- res.writeHead(400, { 'Content-Type': 'application/json' });
92
- res.end(JSON.stringify({ error: 'Each comment must have sectionId (string) and text (string)' }));
93
- return;
94
- }
95
- }
96
- const activeSection = typeof parsed.activeSection === 'string' ? parsed.activeSection : null;
97
- ctx.onSessionSave?.(comments, activeSection);
98
- res.writeHead(200, { 'Content-Type': 'application/json' });
99
- res.end(JSON.stringify({ success: true }));
100
- }
101
- catch {
102
- res.writeHead(400, { 'Content-Type': 'application/json' });
103
- res.end(JSON.stringify({ error: 'Invalid JSON' }));
104
- }
105
- });
106
- return;
107
- }
108
- res.writeHead(404, { 'Content-Type': 'text/plain' });
109
- res.end('Not Found');
110
- };
111
- }
112
- //# sourceMappingURL=routes.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/server/routes.ts"],"names":[],"mappings":"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"}
@@ -1,7 +0,0 @@
1
- import { type Server } from 'node:http';
2
- import { type RouteContext } from './routes.js';
3
- export declare function createReviewServer(ctx: RouteContext): Server;
4
- export declare function startServer(server: Server, port: number): Promise<{
5
- url: string;
6
- }>;
7
- export declare function stopServer(server: Server): Promise<void>;
@@ -1,23 +0,0 @@
1
- import { createServer } from 'node:http';
2
- import { createRouteHandler } from './routes.js';
3
- export function createReviewServer(ctx) {
4
- return createServer(createRouteHandler(ctx));
5
- }
6
- export function startServer(server, port) {
7
- return new Promise((resolve, reject) => {
8
- server.on('error', reject);
9
- server.listen(port, () => {
10
- const addr = server.address();
11
- const actualPort = typeof addr === 'object' && addr ? addr.port : port;
12
- resolve({ url: `http://localhost:${actualPort}` });
13
- });
14
- });
15
- }
16
- export function stopServer(server) {
17
- return new Promise((resolve, reject) => {
18
- server.close((err) => (err ? reject(err) : resolve()));
19
- // Force-close keep-alive sockets so close() doesn't hang on an idle browser tab.
20
- server.closeAllConnections();
21
- });
22
- }
23
- //# sourceMappingURL=server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAe,MAAM,WAAW,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAqB,MAAM,aAAa,CAAC;AAEpE,MAAM,UAAU,kBAAkB,CAAC,GAAiB;IAClD,OAAO,YAAY,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,IAAY;IACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,EAAE;YACvB,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,UAAU,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;YACvE,OAAO,CAAC,EAAE,GAAG,EAAE,oBAAoB,UAAU,EAAE,EAAE,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAc;IACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACvD,iFAAiF;QACjF,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC"}
package/dist/session.d.ts DELETED
@@ -1,25 +0,0 @@
1
- import type { ReviewComment } from './types.js';
2
- export interface SessionData {
3
- version: number;
4
- planPath: string;
5
- contentHash: string;
6
- comments: ReviewComment[];
7
- activeSection: string | null;
8
- lastModified: string;
9
- }
10
- export interface SessionLoadResult {
11
- comments: ReviewComment[];
12
- activeSection: string | null;
13
- stale: boolean;
14
- }
15
- export declare function getSessionDir(): string;
16
- export declare function computeContentHash(content: string): string;
17
- export declare function saveSession(planPath: string, contentHash: string, comments: ReviewComment[], activeSection: string | null): void;
18
- export declare function loadSession(planPath: string, currentContentHash: string): SessionLoadResult | null;
19
- export declare function clearSession(planPath: string): void;
20
- export declare function listSessions(): Array<{
21
- planPath: string;
22
- commentCount: number;
23
- lastModified: string;
24
- stale: boolean | null;
25
- }>;