@tyroneross/bookmark 0.2.0 → 0.3.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 (105) hide show
  1. package/.claude-plugin/marketplace.json +29 -12
  2. package/.claude-plugin/plugin.json +12 -8
  3. package/.codex-plugin/plugin.json +31 -0
  4. package/.mcp.json +8 -0
  5. package/CLAUDE.md +82 -38
  6. package/LICENSE +202 -21
  7. package/README.md +150 -57
  8. package/agents/snapshot-analyst.md +1 -1
  9. package/commands/bookmark.md +29 -0
  10. package/commands/feedback.md +37 -0
  11. package/commands/restore.md +14 -4
  12. package/commands/snapshot.md +19 -7
  13. package/commands/status.md +1 -1
  14. package/dist/cli/index.js +600 -66
  15. package/dist/cli/index.js.map +1 -1
  16. package/dist/cli/snapshot-resolution.d.ts +15 -0
  17. package/dist/cli/snapshot-resolution.d.ts.map +1 -0
  18. package/dist/cli/snapshot-resolution.js +21 -0
  19. package/dist/cli/snapshot-resolution.js.map +1 -0
  20. package/dist/config.d.ts +19 -0
  21. package/dist/config.d.ts.map +1 -1
  22. package/dist/config.js +150 -19
  23. package/dist/config.js.map +1 -1
  24. package/dist/context/freshness.d.ts +3 -0
  25. package/dist/context/freshness.d.ts.map +1 -0
  26. package/dist/context/freshness.js +29 -0
  27. package/dist/context/freshness.js.map +1 -0
  28. package/dist/context/handoff-prompt.d.ts +12 -0
  29. package/dist/context/handoff-prompt.d.ts.map +1 -0
  30. package/dist/context/handoff-prompt.js +29 -0
  31. package/dist/context/handoff-prompt.js.map +1 -0
  32. package/dist/index.d.ts +7 -4
  33. package/dist/index.d.ts.map +1 -1
  34. package/dist/index.js +5 -3
  35. package/dist/index.js.map +1 -1
  36. package/dist/mcp/server.d.ts +9 -0
  37. package/dist/mcp/server.d.ts.map +1 -0
  38. package/dist/mcp/server.js +85 -0
  39. package/dist/mcp/server.js.map +1 -0
  40. package/dist/mcp/tools.d.ts +97 -0
  41. package/dist/mcp/tools.d.ts.map +1 -0
  42. package/dist/mcp/tools.js +304 -0
  43. package/dist/mcp/tools.js.map +1 -0
  44. package/dist/registry.d.ts +40 -0
  45. package/dist/registry.d.ts.map +1 -0
  46. package/dist/registry.js +134 -0
  47. package/dist/registry.js.map +1 -0
  48. package/dist/restore/index.d.ts +13 -1
  49. package/dist/restore/index.d.ts.map +1 -1
  50. package/dist/restore/index.js +154 -256
  51. package/dist/restore/index.js.map +1 -1
  52. package/dist/setup/auto-setup.d.ts +8 -2
  53. package/dist/setup/auto-setup.d.ts.map +1 -1
  54. package/dist/setup/auto-setup.js +281 -66
  55. package/dist/setup/auto-setup.js.map +1 -1
  56. package/dist/setup/configure-hooks.d.ts +14 -3
  57. package/dist/setup/configure-hooks.d.ts.map +1 -1
  58. package/dist/setup/configure-hooks.js +156 -24
  59. package/dist/setup/configure-hooks.js.map +1 -1
  60. package/dist/snapshot/capture.d.ts +12 -10
  61. package/dist/snapshot/capture.d.ts.map +1 -1
  62. package/dist/snapshot/capture.js +36 -48
  63. package/dist/snapshot/capture.js.map +1 -1
  64. package/dist/snapshot/compress.d.ts +3 -3
  65. package/dist/snapshot/compress.d.ts.map +1 -1
  66. package/dist/snapshot/compress.js +16 -51
  67. package/dist/snapshot/compress.js.map +1 -1
  68. package/dist/snapshot/storage.d.ts +1 -0
  69. package/dist/snapshot/storage.d.ts.map +1 -1
  70. package/dist/snapshot/storage.js +7 -6
  71. package/dist/snapshot/storage.js.map +1 -1
  72. package/dist/threshold/state.d.ts +5 -0
  73. package/dist/threshold/state.d.ts.map +1 -1
  74. package/dist/threshold/state.js +28 -2
  75. package/dist/threshold/state.js.map +1 -1
  76. package/dist/threshold/token-usage.d.ts +29 -0
  77. package/dist/threshold/token-usage.d.ts.map +1 -0
  78. package/dist/threshold/token-usage.js +128 -0
  79. package/dist/threshold/token-usage.js.map +1 -0
  80. package/dist/trails/identity.d.ts +76 -0
  81. package/dist/trails/identity.d.ts.map +1 -0
  82. package/dist/trails/identity.js +117 -0
  83. package/dist/trails/identity.js.map +1 -0
  84. package/dist/trails/reader.d.ts +1 -1
  85. package/dist/trails/reader.js +2 -2
  86. package/dist/trails/reader.js.map +1 -1
  87. package/dist/trails/writer.d.ts +2 -8
  88. package/dist/trails/writer.d.ts.map +1 -1
  89. package/dist/trails/writer.js +33 -191
  90. package/dist/trails/writer.js.map +1 -1
  91. package/dist/transcript/extractor.d.ts +8 -9
  92. package/dist/transcript/extractor.d.ts.map +1 -1
  93. package/dist/transcript/extractor.js +97 -360
  94. package/dist/transcript/extractor.js.map +1 -1
  95. package/dist/types.d.ts +34 -41
  96. package/dist/types.d.ts.map +1 -1
  97. package/hooks/hooks.json +12 -14
  98. package/package.json +13 -7
  99. package/scripts/install-plugin.sh +48 -0
  100. package/skills/context-continuity/SKILL.md +43 -24
  101. package/commands/activate.md +0 -20
  102. package/dist/transcript/estimator.d.ts +0 -20
  103. package/dist/transcript/estimator.d.ts.map +0 -1
  104. package/dist/transcript/estimator.js +0 -95
  105. package/dist/transcript/estimator.js.map +0 -1
@@ -1,221 +1,58 @@
1
- // ─── Pattern Definitions ───
2
- const DECISION_PATTERNS = [
3
- /\b(?:decided to|chose|going with|approach:|instead of|opted for|settled on)\b/i,
4
- /\b(?:rationale:|reason:|the advantage|better approach)\b/i,
5
- ];
6
- /** Patterns that indicate conversational narration, not decisions */
7
- const DECISION_NOISE = [
8
- /^let me /i,
9
- /^I'll /i,
10
- /^ok so /i,
11
- /^now /i,
12
- /^here /i,
13
- /^the /i,
14
- /^this /i,
15
- /^it returned/i,
16
- /^0 /,
17
- /^first /i,
18
- ];
19
- const OPEN_ITEM_PATTERNS = [
20
- /\b(?:still need to|TODO|next step|remaining|left to do|pending)\b/i,
21
- /- \[ \]/, // Unchecked markdown checkbox
22
- /\b(?:will need to|must still|haven't implemented)\b/i,
23
- ];
24
- const UNKNOWN_PATTERNS = [
25
- /\b(?:not sure|unclear|blocker|blocked by|need to figure out|question:|unknown|investigate|TBD)\b/i,
26
- /\b(?:might need|may require|haven't determined|needs research|uncertain)\b/i,
27
- ];
28
- const ERROR_PATTERNS = [
29
- /\b(?:error|Error|ERROR|exception|Exception|traceback|Traceback|failed|FAILED)\b/,
30
- /\b(?:TypeError|SyntaxError|ReferenceError|cannot find|not found|undefined is not)\b/,
31
- /\b(?:ENOENT|EACCES|EPERM|ECONNREFUSED|ETIMEDOUT)\b/,
32
- ];
1
+ import { relative, isAbsolute } from 'node:path';
2
+ /**
3
+ * Convert an absolute file path to a project-relative one. Falls back to
4
+ * the original path when projectPath is missing or the file isn't under
5
+ * it (e.g. a tool call that touched something outside the repo, like a
6
+ * scratchpad in /tmp).
7
+ *
8
+ * Why: snapshots used to embed absolute paths
9
+ * (e.g. /Users/tyroneross/Desktop/git-folder/...). When the project moved
10
+ * to ~/dev/git-folder/... every old absolute path went stale, defeating
11
+ * the whole point of the snapshot. Going forward we store paths relative
12
+ * to project_path so a move only needs the project_path field updated
13
+ * (or — for git-tracked moves — nothing at all).
14
+ */
15
+ function toProjectRelative(filePath, projectPath) {
16
+ if (!projectPath || !filePath)
17
+ return filePath;
18
+ if (!isAbsolute(filePath))
19
+ return filePath;
20
+ if (!filePath.startsWith(projectPath))
21
+ return filePath;
22
+ const rel = relative(projectPath, filePath);
23
+ // `relative` returns '' when paths match exactly; preserve a sentinel so
24
+ // downstream code knows it's the project root rather than the empty
25
+ // string (which can read as "missing data").
26
+ return rel === '' ? '.' : rel;
27
+ }
28
+ /**
29
+ * Extractor v0.3 — file tracking + tool summary only.
30
+ *
31
+ * Removed: decision extraction, open items, unknowns, errors, sentiment, status.
32
+ * These produced noise (not signal) via regex. Claude writes semantic content
33
+ * when a lifecycle or token hook requests the handoff instead.
34
+ *
35
+ * Kept: file change tracking (accurate) and tool usage summary (accurate).
36
+ */
33
37
  const FILE_TOOL_NAMES = new Set(['Write', 'Edit', 'write', 'edit']);
34
38
  const FILE_CREATING_BASH_PATTERNS = [
35
39
  /\b(?:mkdir|touch|mv|cp|cat\s+>|echo\s+>|tee)\b/,
36
40
  ];
37
41
  /**
38
- * Extract structured context from transcript entries using pattern matching.
39
- * Zero LLM calls pure heuristic extraction.
42
+ * Extract file changes and tool usage from transcript entries.
43
+ * These are the two extraction functions that actually produce accurate data.
40
44
  */
41
- export function extractFromEntries(entries, options) {
45
+ export function extractFilesAndTools(entries, options) {
42
46
  const projectPath = options?.projectPath;
43
- const decisions = extractDecisions(entries);
44
- const openItems = extractOpenItems(entries);
45
- const unknowns = extractUnknowns(entries);
46
- const filesChanged = extractFilesChanged(entries, projectPath);
47
- const errors = extractErrors(entries);
48
- const toolsSummary = extractToolsSummary(entries);
49
- const currentStatus = extractCurrentStatus(entries);
50
- const sentiment = extractUserSentiment(entries);
51
47
  return {
52
- current_status: currentStatus,
53
- decisions,
54
- open_items: openItems,
55
- unknowns,
56
- files_changed: filesChanged,
57
- errors_encountered: errors,
58
- tools_summary: toolsSummary,
59
- user_sentiment: sentiment,
48
+ files_changed: extractFilesChanged(entries, projectPath),
49
+ tools_summary: extractToolsSummary(entries),
60
50
  };
61
51
  }
62
- function extractDecisions(entries) {
63
- const decisions = [];
64
- const seen = new Set();
65
- // Decisions come from assistant messages where the assistant explicitly
66
- // states a choice. Require strong decision language + rationale.
67
- for (const entry of entries) {
68
- if (entry.type !== 'assistant')
69
- continue;
70
- const text = getEntryText(entry);
71
- if (!text || text.length < 30 || text.length > 2000)
72
- continue;
73
- // Skip formatted output (markdown headers, code blocks)
74
- if (/^#{1,3}\s/m.test(text) || /^```/m.test(text))
75
- continue;
76
- // Must have BOTH a decision keyword AND a rationale keyword
77
- if (!DECISION_PATTERNS[0].test(text) || !DECISION_PATTERNS[1].test(text))
78
- continue;
79
- const sentences = text.split(/[.!?\n]/).filter(s => s.trim().length > 25);
80
- for (const sentence of sentences) {
81
- if (DECISION_PATTERNS[0].test(sentence)) {
82
- const clean = sentence.trim().slice(0, 150);
83
- if (DECISION_NOISE.some(p => p.test(clean)))
84
- continue;
85
- if (clean.split(/\s+/).length < 6)
86
- continue;
87
- // Skip bug descriptions, status reports, code artifacts
88
- if (/^\*\*/.test(clean))
89
- continue;
90
- if (/[/\\](?:b|i|s)\b/.test(clean))
91
- continue;
92
- const key = clean.toLowerCase().slice(0, 50);
93
- if (!seen.has(key)) {
94
- seen.add(key);
95
- decisions.push({ description: clean });
96
- }
97
- }
98
- }
99
- }
100
- return decisions.slice(0, 6);
101
- }
102
- /** Fragments that look like open items but are just conversational narration or artifact */
103
- const OPEN_ITEM_NOISE = [
104
- /^let me /i,
105
- /^I'll /i,
106
- /^I need to /i,
107
- /^I should /i,
108
- /^now I /i,
109
- /^now let me /i,
110
- /^first,? /i,
111
- /^next,? /i,
112
- /^let's /i,
113
- /^we need to /i,
114
- /^you'll need to /i,
115
- /^no need to /i,
116
- /^there's no need /i,
117
- /^\d+→/, // Line-number prefixed (from file reads)
118
- /^\d+\|/, // Alt line-number format
119
- /^- \[ \] (?:\d+→|>)/, // Checkbox with line prefix
120
- /^> /, // Blockquote content
121
- /^SNAP_/, // Snapshot IDs
122
- /^\|/, // Table rows
123
- /^```/, // Code blocks
124
- /^\*bookmark/, // Bookmark signature
125
- ];
126
- function extractOpenItems(entries) {
127
- const items = [];
128
- const seen = new Set();
129
- // Strategy: user messages are the source of truth for "what needs to be done"
130
- // Assistant messages only contribute if they have explicit TODO/FIXME markers
131
- const startIdx = Math.floor(entries.length * 0.7);
132
- for (let i = entries.length - 1; i >= startIdx; i--) {
133
- const entry = entries[i];
134
- if (entry.type !== 'assistant' && entry.type !== 'user')
135
- continue;
136
- const text = getEntryText(entry);
137
- if (!text || text.length > 2000)
138
- continue;
139
- // For assistant messages: only extract literal TODO/FIXME markers
140
- // Must be at start of line or after whitespace, not inside backticks/quotes
141
- if (entry.type === 'assistant') {
142
- // Strip backtick-quoted content before matching
143
- const stripped = text.replace(/`[^`]*`/g, '').replace(/"[^"]*"/g, '');
144
- const todoMatches = stripped.match(/^[ \t]*(?:\/\/|#|--|%%)?\s*(?:TODO|FIXME):\s+(.{10,100})/gm);
145
- if (todoMatches) {
146
- for (const match of todoMatches.slice(0, 2)) {
147
- const clean = match.trim();
148
- if (isCodeArtifact(clean))
149
- continue;
150
- const key = clean.toLowerCase().slice(0, 50);
151
- if (!seen.has(key)) {
152
- seen.add(key);
153
- items.push({ description: clean, priority: 'medium' });
154
- }
155
- }
156
- }
157
- continue; // Skip all other assistant patterns — too noisy
158
- }
159
- // For user messages: use pattern matching but with strict code-artifact filtering
160
- const sentences = text.split(/[.!?\n]/).filter(s => s.trim().length > 25);
161
- for (const sentence of sentences) {
162
- if (OPEN_ITEM_PATTERNS.some(p => p.test(sentence))) {
163
- const clean = sentence.trim().slice(0, 150);
164
- if (OPEN_ITEM_NOISE.some(p => p.test(clean)))
165
- continue;
166
- if (clean.split(/\s+/).length < 5)
167
- continue;
168
- // Hard filter: skip anything that looks like code, regex, or technical artifact
169
- if (isCodeArtifact(clean))
170
- continue;
171
- const key = clean.toLowerCase().slice(0, 50);
172
- if (!seen.has(key)) {
173
- seen.add(key);
174
- items.push({
175
- description: clean,
176
- priority: inferPriority(clean),
177
- });
178
- }
179
- }
180
- }
181
- }
182
- return items.slice(0, 5);
183
- }
184
- function extractUnknowns(entries) {
185
- const unknowns = [];
186
- const seen = new Set();
187
- // Only recent entries, skip research/formatted output
188
- const startIdx = Math.floor(entries.length * 0.7);
189
- for (let i = entries.length - 1; i >= startIdx; i--) {
190
- const entry = entries[i];
191
- if (entry.type !== 'assistant' && entry.type !== 'user')
192
- continue;
193
- const text = getEntryText(entry);
194
- if (!text || text.length > 2000)
195
- continue;
196
- if (/^#{1,3}\s/m.test(text))
197
- continue;
198
- const sentences = text.split(/[.!?\n]/).filter(s => s.trim().length > 20);
199
- for (const sentence of sentences) {
200
- if (UNKNOWN_PATTERNS.some(p => p.test(sentence))) {
201
- const clean = sentence.trim().slice(0, 150);
202
- if (clean.split(/\s+/).length < 5)
203
- continue;
204
- if (/^let me /i.test(clean))
205
- continue;
206
- const key = clean.toLowerCase().slice(0, 50);
207
- if (!seen.has(key)) {
208
- seen.add(key);
209
- unknowns.push(clean);
210
- }
211
- }
212
- }
213
- }
214
- return unknowns.slice(0, 3);
215
- }
216
52
  function extractFilesChanged(entries, projectPath) {
217
53
  const fileMap = new Map();
218
54
  const fileLinesChanged = new Map();
55
+ const fileStructuralChanges = new Map();
219
56
  for (const entry of entries) {
220
57
  if (entry.type === 'tool_use') {
221
58
  const toolName = entry.tool_name ?? '';
@@ -223,31 +60,31 @@ function extractFilesChanged(entries, projectPath) {
223
60
  if (FILE_TOOL_NAMES.has(toolName)) {
224
61
  const filePath = input.file_path ?? input.path ?? '';
225
62
  if (filePath) {
226
- // Skip files outside the project directory
227
63
  if (projectPath && !filePath.startsWith(projectPath))
228
64
  continue;
229
65
  const ops = fileMap.get(filePath) ?? new Set();
230
66
  ops.add(toolName.toLowerCase());
231
67
  fileMap.set(filePath, ops);
232
- // Estimate lines changed from Edit tool inputs
233
68
  const newStr = input.new_string ?? input.content ?? '';
234
69
  const oldStr = input.old_string ?? '';
235
70
  const linesAdded = newStr ? newStr.split('\n').length : 0;
236
71
  const linesRemoved = oldStr ? oldStr.split('\n').length : 0;
237
72
  const delta = Math.abs(linesAdded - linesRemoved) + Math.min(linesAdded, linesRemoved);
238
73
  fileLinesChanged.set(filePath, (fileLinesChanged.get(filePath) ?? 0) + delta);
74
+ const changes = fileStructuralChanges.get(filePath) ?? new Set();
75
+ extractStructuralHints(newStr, oldStr, changes);
76
+ if (changes.size > 0) {
77
+ fileStructuralChanges.set(filePath, changes);
78
+ }
239
79
  }
240
80
  }
241
- // Detect file operations in Bash commands
242
81
  if (toolName === 'Bash' || toolName === 'bash') {
243
82
  const cmd = input.command ?? '';
244
83
  for (const pattern of FILE_CREATING_BASH_PATTERNS) {
245
84
  if (pattern.test(cmd)) {
246
- // Try to extract file path from command
247
85
  const parts = cmd.split(/\s+/);
248
86
  const lastPart = parts[parts.length - 1];
249
87
  if (lastPart && !lastPart.startsWith('-')) {
250
- // Skip files outside the project directory
251
88
  if (projectPath && !lastPart.startsWith(projectPath))
252
89
  break;
253
90
  const ops = fileMap.get(lastPart) ?? new Set();
@@ -262,62 +99,68 @@ function extractFilesChanged(entries, projectPath) {
262
99
  }
263
100
  const result = [];
264
101
  for (const [path, ops] of fileMap) {
102
+ const changes = fileStructuralChanges.get(path);
103
+ const summary = changes && changes.size > 0
104
+ ? [...changes].slice(0, 4).join(', ')
105
+ : undefined;
265
106
  result.push({
266
- path,
107
+ // Store relative to projectPath so snapshots survive a project move.
108
+ // The original absolute path is preserved in `absolute_path` for
109
+ // diagnostic use; consumers should prefer `path` joined to the
110
+ // current project_path.
111
+ path: toProjectRelative(path, projectPath),
267
112
  operations: [...ops],
268
113
  lines_changed: fileLinesChanged.get(path) ?? 0,
114
+ summary,
269
115
  });
270
116
  }
271
- return result.slice(0, 20); // maxFilesTracked
117
+ return result.slice(0, 20);
272
118
  }
273
- /** Strings that look like errors but aren't */
274
- const ERROR_FALSE_POSITIVES = [
275
- /^toolu_/, // Tool use IDs
276
- /^#!\/usr\/bin/, // Shebangs
277
- /^\d+→/, // Line number prefixes from Read tool
278
- /^<retrieval_status>/, // XML status tags
279
- /\.md\b/, // Markdown file names
280
- /\.js\b.*\(toolu_/, // File paths with tool IDs
281
- ];
282
- function extractErrors(entries) {
283
- const errors = [];
284
- const seen = new Set();
285
- const resolvedFiles = new Set();
286
- // First pass: find files that were successfully edited after errors
287
- for (const entry of entries) {
288
- if (entry.type === 'tool_use' && FILE_TOOL_NAMES.has(entry.tool_name ?? '')) {
289
- const filePath = entry.tool_input?.file_path ?? '';
290
- if (filePath)
291
- resolvedFiles.add(filePath);
119
+ function extractStructuralHints(newStr, oldStr, changes) {
120
+ if (!newStr && !oldStr)
121
+ return;
122
+ const newLines = new Set(newStr.split('\n').map(l => l.trim()));
123
+ const oldLines = new Set(oldStr.split('\n').map(l => l.trim()));
124
+ const STRUCTURAL_PATTERNS = [
125
+ { pattern: /^export\s+(?:async\s+)?function\s+(\w+)/, prefix: '+fn' },
126
+ { pattern: /^(?:async\s+)?function\s+(\w+)/, prefix: '+fn' },
127
+ { pattern: /^export\s+(?:const|let)\s+(\w+)\s*=\s*(?:async\s*)?\(/, prefix: '+fn' },
128
+ { pattern: /^(?:const|let)\s+(\w+)\s*=\s*(?:async\s*)?\(/, prefix: '+fn' },
129
+ { pattern: /^export\s+class\s+(\w+)/, prefix: '+class' },
130
+ { pattern: /^class\s+(\w+)/, prefix: '+class' },
131
+ { pattern: /^export\s+interface\s+(\w+)/, prefix: '+interface' },
132
+ { pattern: /^interface\s+(\w+)/, prefix: '+interface' },
133
+ { pattern: /^export\s+type\s+(\w+)/, prefix: '+type' },
134
+ { pattern: /^type\s+(\w+)/, prefix: '+type' },
135
+ { pattern: /^import\s+.*from\s+['"]([^'"]+)['"]/, prefix: '+import' },
136
+ ];
137
+ for (const line of newLines) {
138
+ if (oldLines.has(line))
139
+ continue;
140
+ for (const { pattern, prefix } of STRUCTURAL_PATTERNS) {
141
+ const match = line.match(pattern);
142
+ if (match) {
143
+ changes.add(`${prefix} ${match[1]}`);
144
+ break;
145
+ }
292
146
  }
293
147
  }
294
- for (const entry of entries) {
295
- if (entry.type !== 'tool_result')
296
- continue;
297
- const text = getEntryText(entry);
298
- if (!text || text.length < 10)
299
- continue;
300
- if (ERROR_PATTERNS.some(p => p.test(text))) {
301
- // Extract first meaningful error line
302
- const firstLine = text.split('\n')[0]?.trim().slice(0, 200) ?? '';
303
- // Skip false positives
304
- if (ERROR_FALSE_POSITIVES.some(p => p.test(firstLine)))
305
- continue;
306
- // Skip very short matches (likely noise)
307
- if (firstLine.length < 15)
148
+ if (oldStr) {
149
+ for (const line of oldLines) {
150
+ if (newLines.has(line))
308
151
  continue;
309
- const key = firstLine.toLowerCase().slice(0, 50);
310
- if (!seen.has(key) && firstLine) {
311
- seen.add(key);
312
- errors.push({
313
- message: firstLine,
314
- tool: entry.tool_name,
315
- resolved: false,
316
- });
152
+ for (const { pattern, prefix } of STRUCTURAL_PATTERNS) {
153
+ const match = line.match(pattern);
154
+ if (match) {
155
+ const removePrefix = prefix.replace('+', '-');
156
+ if (!changes.has(`${prefix} ${match[1]}`)) {
157
+ changes.add(`${removePrefix} ${match[1]}`);
158
+ }
159
+ break;
160
+ }
317
161
  }
318
162
  }
319
163
  }
320
- return errors.slice(0, 10); // maxErrorsTracked
321
164
  }
322
165
  function extractToolsSummary(entries) {
323
166
  const summary = {};
@@ -328,112 +171,7 @@ function extractToolsSummary(entries) {
328
171
  }
329
172
  return summary;
330
173
  }
331
- function extractCurrentStatus(entries) {
332
- // Derive status from what was DONE, not from conversational text.
333
- // Look for the last user request to understand the task context.
334
- let lastUserRequest = '';
335
- for (let i = entries.length - 1; i >= 0; i--) {
336
- const entry = entries[i];
337
- if (entry.type !== 'user')
338
- continue;
339
- const text = getEntryText(entry);
340
- if (!text || text.length < 10)
341
- continue;
342
- // Skip very long user messages (likely pasted content)
343
- if (text.length > 500)
344
- continue;
345
- lastUserRequest = text.trim().slice(0, 150);
346
- break;
347
- }
348
- // Count recent tool actions for a factual summary
349
- const recentTools = {};
350
- const startIdx = Math.max(0, entries.length - 30);
351
- for (let i = startIdx; i < entries.length; i++) {
352
- if (entries[i].type === 'tool_use' && entries[i].tool_name) {
353
- const name = entries[i].tool_name;
354
- recentTools[name] = (recentTools[name] ?? 0) + 1;
355
- }
356
- }
357
- const toolSummary = Object.entries(recentTools)
358
- .sort((a, b) => b[1] - a[1])
359
- .slice(0, 3)
360
- .map(([t, c]) => `${t}(${c})`)
361
- .join(', ');
362
- if (lastUserRequest) {
363
- return `Last user direction: "${lastUserRequest}"${toolSummary ? `. Recent activity: ${toolSummary}` : ''}`;
364
- }
365
- return toolSummary ? `Recent activity: ${toolSummary}` : 'No status available';
366
- }
367
- function getEntryText(entry) {
368
- if (typeof entry.content === 'string')
369
- return entry.content;
370
- return '';
371
- }
372
- /** Detect if text is a code artifact rather than natural language */
373
- function isCodeArtifact(text) {
374
- // Regex patterns (contains /pattern/ or \b)
375
- if (/[/](?:[a-z]+\||\\.|\^|\$|\(|\[)/.test(text))
376
- return true;
377
- // Variable/function syntax
378
- if (/(?:const|let|var|function|=>|===|!==)\s/.test(text))
379
- return true;
380
- // Contains backticks (inline code)
381
- if (/`[^`]+`/.test(text) && text.indexOf('`') < 20)
382
- return true;
383
- // Pipe-delimited (regex alternation or table)
384
- if ((text.match(/\|/g) ?? []).length >= 2)
385
- return true;
386
- // Starts with punctuation that indicates code output
387
- if (/^[:\-*#>]/.test(text.trim()))
388
- return true;
389
- return false;
390
- }
391
- function inferPriority(text) {
392
- const lower = text.toLowerCase();
393
- if (/\b(?:must|critical|urgent|blocker|breaking|immediately)\b/.test(lower))
394
- return 'high';
395
- if (/\b(?:should|important|next|before|required)\b/.test(lower))
396
- return 'medium';
397
- return 'low';
398
- }
399
- // ─── User Sentiment ───
400
- const POSITIVE_PATTERNS = [
401
- /\b(?:great|good|perfect|nice|awesome|excellent|looks good|well done|love it|thank|thanks)\b/i,
402
- /\b(?:works|working|fixed|solved|nailed it|ship it|lgtm)\b/i,
403
- ];
404
- const NEGATIVE_PATTERNS = [
405
- /\b(?:wrong|broken|doesn't work|not what I|revert|undo|bad|terrible|hate)\b/i,
406
- /\b(?:no no|stop|don't|shouldn't have|why did you|that's not)\b/i,
407
- ];
408
- function extractUserSentiment(entries) {
409
- let positive = 0;
410
- let negative = 0;
411
- // Only look at recent user messages (last 30%)
412
- const startIdx = Math.floor(entries.length * 0.7);
413
- for (let i = startIdx; i < entries.length; i++) {
414
- const entry = entries[i];
415
- if (entry.type !== 'user')
416
- continue;
417
- const text = getEntryText(entry);
418
- if (!text)
419
- continue;
420
- if (POSITIVE_PATTERNS.some(p => p.test(text)))
421
- positive++;
422
- if (NEGATIVE_PATTERNS.some(p => p.test(text)))
423
- negative++;
424
- }
425
- if (positive > negative && positive >= 2)
426
- return 'positive';
427
- if (negative > positive && negative >= 2)
428
- return 'negative';
429
- return 'neutral';
430
- }
431
- /**
432
- * Detect how many file edits have happened since the last git commit.
433
- * If no commit is found, returns total edits.
434
- */
435
174
  export function extractCommitGap(entries) {
436
- // Find the last git commit in the transcript
437
175
  let lastCommitIdx = -1;
438
176
  for (let i = entries.length - 1; i >= 0; i--) {
439
177
  const entry = entries[i];
@@ -445,7 +183,6 @@ export function extractCommitGap(entries) {
445
183
  }
446
184
  }
447
185
  }
448
- // Count edits since that commit
449
186
  let editCount = 0;
450
187
  const filesEdited = new Set();
451
188
  const searchFrom = lastCommitIdx >= 0 ? lastCommitIdx + 1 : 0;
@@ -1 +1 @@
1
- {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/transcript/extractor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../src/transcript/extractor.ts"],"names":[],"mappings":"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"}