task-summary-extractor 8.1.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/ARCHITECTURE.md +605 -0
- package/EXPLORATION.md +451 -0
- package/QUICK_START.md +272 -0
- package/README.md +544 -0
- package/bin/taskex.js +64 -0
- package/package.json +63 -0
- package/process_and_upload.js +107 -0
- package/prompt.json +265 -0
- package/setup.js +505 -0
- package/src/config.js +327 -0
- package/src/logger.js +355 -0
- package/src/pipeline.js +2006 -0
- package/src/renderers/markdown.js +968 -0
- package/src/services/firebase.js +106 -0
- package/src/services/gemini.js +779 -0
- package/src/services/git.js +329 -0
- package/src/services/video.js +305 -0
- package/src/utils/adaptive-budget.js +266 -0
- package/src/utils/change-detector.js +466 -0
- package/src/utils/cli.js +415 -0
- package/src/utils/context-manager.js +499 -0
- package/src/utils/cost-tracker.js +156 -0
- package/src/utils/deep-dive.js +549 -0
- package/src/utils/diff-engine.js +315 -0
- package/src/utils/dynamic-mode.js +567 -0
- package/src/utils/focused-reanalysis.js +317 -0
- package/src/utils/format.js +32 -0
- package/src/utils/fs.js +39 -0
- package/src/utils/global-config.js +315 -0
- package/src/utils/health-dashboard.js +216 -0
- package/src/utils/inject-cli-flags.js +58 -0
- package/src/utils/json-parser.js +245 -0
- package/src/utils/learning-loop.js +301 -0
- package/src/utils/progress-updater.js +451 -0
- package/src/utils/progress.js +166 -0
- package/src/utils/prompt.js +32 -0
- package/src/utils/quality-gate.js +429 -0
- package/src/utils/retry.js +129 -0
package/README.md
ADDED
|
@@ -0,0 +1,544 @@
|
|
|
1
|
+
# Task Summary Extractor
|
|
2
|
+
|
|
3
|
+
> **v8.1.0** — AI-powered meeting analysis & document generation CLI. Install globally, run anywhere.
|
|
4
|
+
|
|
5
|
+
<p align="center">
|
|
6
|
+
<img src="https://img.shields.io/badge/node-%3E%3D18.0.0-green" alt="Node.js" />
|
|
7
|
+
<img src="https://img.shields.io/badge/gemini-2.5--flash-blue" alt="Gemini" />
|
|
8
|
+
<img src="https://img.shields.io/badge/firebase-11.x-orange" alt="Firebase" />
|
|
9
|
+
<img src="https://img.shields.io/badge/version-8.1.0-brightgreen" alt="Version" />
|
|
10
|
+
<img src="https://img.shields.io/badge/npm-task--summary--extractor-red" alt="npm" />
|
|
11
|
+
</p>
|
|
12
|
+
|
|
13
|
+
**Record a meeting → get a structured task document.** Or point it at any folder and generate docs from context.
|
|
14
|
+
|
|
15
|
+
📖 **New here?** Jump to [Setup (3 steps)](#setup-3-steps) — you'll be running in under 5 minutes.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## What It Does
|
|
20
|
+
|
|
21
|
+
### 🎥 Video Analysis (default mode)
|
|
22
|
+
|
|
23
|
+
Drop a recording in a folder → run the tool → get a Markdown task document with:
|
|
24
|
+
|
|
25
|
+
- **Tickets** — ID, title, status, assignee, confidence score
|
|
26
|
+
- **Change Requests** — what changed, where, how, why
|
|
27
|
+
- **Action Items** — who does what, by when
|
|
28
|
+
- **Blockers** — severity, owner, proposed resolution
|
|
29
|
+
- **Scope Changes** — added, removed, deferred items
|
|
30
|
+
- **Your Tasks** — personalized list scoped to your name
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
taskex --name "Jane" "my-meeting"
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 📝 Dynamic Mode (`--dynamic`)
|
|
37
|
+
|
|
38
|
+
No video needed. Point at a folder with docs, tell it what you want:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
taskex --dynamic --request "Plan migration from MySQL to Postgres" "db-specs"
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Generates 3–15 Markdown documents: overviews, guides, checklists, decision records, etc.
|
|
45
|
+
|
|
46
|
+
### 🔍 Deep Dive (`--deep-dive`)
|
|
47
|
+
|
|
48
|
+
After video analysis, generate standalone docs for every topic discussed:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
taskex --deep-dive --name "Jane" "my-meeting"
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
### 📊 Progress Tracking (`--update-progress`)
|
|
55
|
+
|
|
56
|
+
Check which items from a previous analysis have been completed, using git evidence:
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
taskex --update-progress --repo "C:\my-project" "my-meeting"
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
> **v7.2.3**: If the call folder isn't a git repo, the tool auto-initializes one for baseline tracking.
|
|
63
|
+
|
|
64
|
+
> See all modes explained with diagrams → [ARCHITECTURE.md](ARCHITECTURE.md#pipeline-phases)
|
|
65
|
+
|
|
66
|
+
---
|
|
67
|
+
|
|
68
|
+
## Setup (3 Steps)
|
|
69
|
+
|
|
70
|
+
### What You Need First
|
|
71
|
+
|
|
72
|
+
| Requirement | How to Check | Get It |
|
|
73
|
+
|-------------|-------------|--------|
|
|
74
|
+
| **Node.js ≥ 18** | `node --version` | [nodejs.org](https://nodejs.org/) |
|
|
75
|
+
| **ffmpeg** | `ffmpeg -version` | [gyan.dev/ffmpeg](https://www.gyan.dev/ffmpeg/builds/) — add to PATH |
|
|
76
|
+
| **Gemini API Key** | — | [Google AI Studio](https://aistudio.google.com/apikey) — free tier available |
|
|
77
|
+
|
|
78
|
+
> **Git** is optional — only needed for `--update-progress` mode.
|
|
79
|
+
|
|
80
|
+
### Step 1: Install
|
|
81
|
+
|
|
82
|
+
**Option A — npm global install (recommended):**
|
|
83
|
+
|
|
84
|
+
```bash
|
|
85
|
+
npm install -g task-summary-extractor
|
|
86
|
+
```
|
|
87
|
+
|
|
88
|
+
Now `taskex` is available system-wide. Done.
|
|
89
|
+
|
|
90
|
+
**Option B — Clone & install (development):**
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
git clone https://github.com/youssefadel94/task-summary-extractor.git
|
|
94
|
+
cd task-summary-extractor
|
|
95
|
+
node setup.js
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
The setup script does everything: installs dependencies, creates your `.env`, prompts for your API key, validates the pipeline. **Follow the prompts — it takes 1 minute.**
|
|
99
|
+
|
|
100
|
+
### Step 2: Add your recording
|
|
101
|
+
|
|
102
|
+
Create a folder and drop your video in it:
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
my-meeting/
|
|
106
|
+
├── Recording.mp4 ← your video file
|
|
107
|
+
└── Recording.vtt ← subtitles (optional, improves quality a lot)
|
|
108
|
+
```
|
|
109
|
+
|
|
110
|
+
> You can also add docs (`.md`, `.pdf`, `.txt`, `.csv`) in any subfolders — the tool finds everything automatically. More context → better results.
|
|
111
|
+
|
|
112
|
+
### Step 3: Run
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
taskex --name "Your Name" "my-meeting"
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Or just run `taskex` inside a folder — it'll walk you through everything interactively.
|
|
119
|
+
|
|
120
|
+
**First time? Save your API key globally (one time):**
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
taskex config
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
This saves your Gemini key to `~/.taskexrc` — you'll never need to pass it again.
|
|
127
|
+
|
|
128
|
+
**Or pass it inline (no setup needed):**
|
|
129
|
+
|
|
130
|
+
```bash
|
|
131
|
+
taskex --gemini-key "YOUR_KEY" --name "Your Name" "my-meeting"
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**Done.** Your results are in `my-meeting/runs/{timestamp}/results.md`.
|
|
135
|
+
|
|
136
|
+
> 🎓 **Full walkthrough** with examples, folder structures, and troubleshooting → [QUICK_START.md](QUICK_START.md)
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## CLI Flags
|
|
141
|
+
|
|
142
|
+
Every flag is optional. Run with no flags for fully interactive mode.
|
|
143
|
+
|
|
144
|
+
### Configuration Flags
|
|
145
|
+
|
|
146
|
+
Pass API keys and config directly — no `.env` file needed:
|
|
147
|
+
|
|
148
|
+
| Flag | What It Does | Example |
|
|
149
|
+
|------|-------------|---------|
|
|
150
|
+
| `--gemini-key <key>` | Gemini API key | `--gemini-key "AIza..."` |
|
|
151
|
+
| `--firebase-key <key>` | Firebase API key | `--firebase-key "AIza..."` |
|
|
152
|
+
| `--firebase-project <id>` | Firebase project ID | `--firebase-project "my-proj"` |
|
|
153
|
+
| `--firebase-bucket <bucket>` | Firebase storage bucket | `--firebase-bucket "my-proj.appspot.com"` |
|
|
154
|
+
| `--firebase-domain <domain>` | Firebase auth domain | `--firebase-domain "my-proj.firebaseapp.com"` |
|
|
155
|
+
|
|
156
|
+
> Config flags override `.env` values. You can mix both — flags take priority.
|
|
157
|
+
|
|
158
|
+
### Everyday Flags
|
|
159
|
+
|
|
160
|
+
These are the ones you'll actually use:
|
|
161
|
+
|
|
162
|
+
| Flag | What It Does | Example |
|
|
163
|
+
|------|-------------|---------|
|
|
164
|
+
| `--name <name>` | Set your name (skips prompt) | `--name "Jane"` |
|
|
165
|
+
| `--model <id>` | Pick a Gemini model (skips selector) | `--model gemini-2.5-pro` |
|
|
166
|
+
| `--skip-upload` | Don't upload to Firebase (local only) | `--skip-upload` |
|
|
167
|
+
| `--force-upload` | Re-upload files even if they already exist | `--force-upload` |
|
|
168
|
+
| `--resume` | Continue an interrupted run | `--resume` |
|
|
169
|
+
| `--reanalyze` | Force fresh analysis (ignore cache) | `--reanalyze` |
|
|
170
|
+
| `--dry-run` | Preview what would run, without running | `--dry-run` |
|
|
171
|
+
|
|
172
|
+
**Typical usage:**
|
|
173
|
+
|
|
174
|
+
```bash
|
|
175
|
+
# Interactive — picks folder, model, prompts for name
|
|
176
|
+
taskex
|
|
177
|
+
|
|
178
|
+
# Specify everything upfront
|
|
179
|
+
taskex --name "Jane" --model gemini-2.5-pro --skip-upload "my-meeting"
|
|
180
|
+
|
|
181
|
+
# Resume a run that crashed halfway
|
|
182
|
+
taskex --resume "my-meeting"
|
|
183
|
+
|
|
184
|
+
# Pass API key directly (no .env needed)
|
|
185
|
+
taskex --gemini-key "AIza..." --name "Jane" "my-meeting"
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
### Mode Flags
|
|
189
|
+
|
|
190
|
+
Choose what the tool does. Only use one at a time:
|
|
191
|
+
|
|
192
|
+
| Flag | Mode | What You Get |
|
|
193
|
+
|------|------|-------------|
|
|
194
|
+
| *(none)* | **Video analysis** | `results.md` — structured task document |
|
|
195
|
+
| `--dynamic` | **Doc generation** | `INDEX.md` + 3–15 topic documents |
|
|
196
|
+
| `--deep-dive` | **Topic explainers** | `INDEX.md` + per-topic deep-dive docs |
|
|
197
|
+
| `--update-progress` | **Progress check** | `progress.md` — item status via git |
|
|
198
|
+
|
|
199
|
+
**Dynamic mode** also uses:
|
|
200
|
+
|
|
201
|
+
| Flag | Purpose | Example |
|
|
202
|
+
|------|---------|---------|
|
|
203
|
+
| `--request <text>` | Tell the AI what to generate | `--request "Create onboarding guide"` |
|
|
204
|
+
|
|
205
|
+
**Progress tracking** also uses:
|
|
206
|
+
|
|
207
|
+
| Flag | Purpose | Example |
|
|
208
|
+
|------|---------|---------|
|
|
209
|
+
| `--repo <path>` | Git repo to check for evidence | `--repo "C:\my-project"` |
|
|
210
|
+
|
|
211
|
+
### Skip Flags
|
|
212
|
+
|
|
213
|
+
Skip parts of the pipeline you don't need:
|
|
214
|
+
|
|
215
|
+
| Flag | What It Skips | When to Use |
|
|
216
|
+
|------|--------------|-------------|
|
|
217
|
+
| `--skip-upload` | Firebase upload | Running locally, no Firebase configured |
|
|
218
|
+
| `--force-upload` | Skip-existing checks | Re-upload files that already exist in Storage |
|
|
219
|
+
| `--no-storage-url` | Storage URL optimization | Force Gemini File API upload (debugging) |
|
|
220
|
+
| `--skip-compression` | Video compression | You already compressed/segmented the video |
|
|
221
|
+
| `--skip-gemini` | AI analysis entirely | You just want to compress & upload |
|
|
222
|
+
|
|
223
|
+
### Tuning Flags
|
|
224
|
+
|
|
225
|
+
**You probably don't need these.** The defaults work well. These are for power users:
|
|
226
|
+
|
|
227
|
+
| Flag | Default | What It Controls |
|
|
228
|
+
|------|---------|-----------------|
|
|
229
|
+
| `--thinking-budget <n>` | `24576` | AI thinking tokens per segment — higher = more thorough, slower, costlier |
|
|
230
|
+
| `--compilation-thinking-budget <n>` | `10240` | AI thinking tokens for the final cross-segment compilation |
|
|
231
|
+
| `--parallel <n>` | `3` | Max concurrent Firebase uploads |
|
|
232
|
+
| `--parallel-analysis <n>` | `2` | Max concurrent AI segment analyses |
|
|
233
|
+
| `--log-level <level>` | `info` | `debug` / `info` / `warn` / `error` |
|
|
234
|
+
| `--output <dir>` | auto | Custom output directory (default: `runs/{timestamp}`) |
|
|
235
|
+
| `--no-focused-pass` | enabled | Disable targeted re-analysis of weak segments |
|
|
236
|
+
| `--no-learning` | enabled | Disable auto-tuning from historical run data |
|
|
237
|
+
| `--no-diff` | enabled | Disable diff comparison with the previous run |
|
|
238
|
+
|
|
239
|
+
### Available Models
|
|
240
|
+
|
|
241
|
+
Use `--model <id>` or run without it for an interactive picker:
|
|
242
|
+
|
|
243
|
+
| Model ID | Speed | Cost | Best For |
|
|
244
|
+
|----------|-------|------|----------|
|
|
245
|
+
| `gemini-2.5-flash` | ⚡ Fast | $ | **Default** — best price-performance |
|
|
246
|
+
| `gemini-2.5-flash-lite` | ⚡⚡ Fastest | ¢ | High volume, budget runs |
|
|
247
|
+
| `gemini-2.5-pro` | 🧠 Slower | $$ | Deep reasoning, complex meetings |
|
|
248
|
+
| `gemini-3-flash-preview` | ⚡ Fast | $ | Latest flash model |
|
|
249
|
+
| `gemini-3.1-pro-preview` | 🧠 Slower | $$$ | Most capable overall |
|
|
250
|
+
|
|
251
|
+
### Cheat Sheet
|
|
252
|
+
|
|
253
|
+
```
|
|
254
|
+
taskex [flags] [folder]
|
|
255
|
+
|
|
256
|
+
CONFIG --gemini-key --firebase-key --firebase-project
|
|
257
|
+
--firebase-bucket --firebase-domain
|
|
258
|
+
MODES --dynamic --deep-dive --update-progress
|
|
259
|
+
CORE --name --model --skip-upload --resume --reanalyze --dry-run
|
|
260
|
+
UPLOAD --force-upload --no-storage-url
|
|
261
|
+
SKIP --skip-compression --skip-gemini
|
|
262
|
+
DYNAMIC --request <text>
|
|
263
|
+
PROGRESS --repo <path>
|
|
264
|
+
TUNING --thinking-budget --compilation-thinking-budget --parallel
|
|
265
|
+
--parallel-analysis --log-level --output
|
|
266
|
+
--no-focused-pass --no-learning --no-diff
|
|
267
|
+
INFO --help (-h) --version (-v)
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## Output
|
|
273
|
+
|
|
274
|
+
### Video Analysis
|
|
275
|
+
|
|
276
|
+
```
|
|
277
|
+
my-meeting/runs/{timestamp}/
|
|
278
|
+
├── results.md ← Open this — your task document
|
|
279
|
+
├── results.json ← Full pipeline data
|
|
280
|
+
└── compilation.json ← All extracted items (JSON)
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Dynamic Mode
|
|
284
|
+
|
|
285
|
+
```
|
|
286
|
+
my-project/runs/{timestamp}/
|
|
287
|
+
├── INDEX.md ← Open this — document index
|
|
288
|
+
├── dm-01-overview.md
|
|
289
|
+
├── dm-02-guide.md
|
|
290
|
+
└── dynamic-run.json
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
### Deep Dive
|
|
294
|
+
|
|
295
|
+
```
|
|
296
|
+
my-meeting/runs/{timestamp}/deep-dive/
|
|
297
|
+
├── INDEX.md ← Open this — topic index
|
|
298
|
+
├── dd-01-topic.md
|
|
299
|
+
├── dd-02-topic.md
|
|
300
|
+
└── deep-dive.json
|
|
301
|
+
```
|
|
302
|
+
|
|
303
|
+
### Progress Update
|
|
304
|
+
|
|
305
|
+
```
|
|
306
|
+
my-meeting/runs/{timestamp}/
|
|
307
|
+
├── progress.md ← Status report with git evidence
|
|
308
|
+
└── progress.json
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## Folder Setup Tips
|
|
314
|
+
|
|
315
|
+
Drop docs alongside your video to give the AI context. **More context = better extraction.**
|
|
316
|
+
|
|
317
|
+
```
|
|
318
|
+
my-meeting/
|
|
319
|
+
├── Recording.mp4 ← Video (required for video mode)
|
|
320
|
+
├── Recording.vtt ← Subtitles (highly recommended)
|
|
321
|
+
├── agenda.md ← Loose docs at root are fine
|
|
322
|
+
│
|
|
323
|
+
├── .tasks/ ← Gets priority weighting (optional)
|
|
324
|
+
│ ├── code-map.md ← What each module/component does
|
|
325
|
+
│ └── current-sprint.md ← Current sprint goals and tickets
|
|
326
|
+
│
|
|
327
|
+
└── specs/ ← Any subfolder name works
|
|
328
|
+
└── requirements.md
|
|
329
|
+
```
|
|
330
|
+
|
|
331
|
+
**Supported formats:** `.mp4` `.mkv` `.webm` `.avi` `.mov` (video) · `.vtt` `.srt` `.txt` `.md` `.csv` `.pdf` (docs)
|
|
332
|
+
|
|
333
|
+
The tool **recursively scans all subfolders**. `.tasks/` gets highest priority weighting but everything is included.
|
|
334
|
+
|
|
335
|
+
| What Helps Most | Why |
|
|
336
|
+
|-----------------|-----|
|
|
337
|
+
| **Subtitles** (`.vtt`/`.srt`) | Dramatically improves name/ID extraction |
|
|
338
|
+
| **Team roster** (`.csv`) | Accurate attribution of action items |
|
|
339
|
+
| **Code map / architecture docs** | AI matches changes to actual files |
|
|
340
|
+
| **Sprint / board exports** | Status context for discussed items |
|
|
341
|
+
|
|
342
|
+
---
|
|
343
|
+
|
|
344
|
+
## Configuration
|
|
345
|
+
|
|
346
|
+
### Global Config (recommended)
|
|
347
|
+
|
|
348
|
+
Save your API keys once — they persist across all projects:
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
taskex config # Interactive setup — saves to ~/.taskexrc
|
|
352
|
+
taskex config --show # View saved config (secrets masked)
|
|
353
|
+
taskex config --clear # Delete saved config
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
**First-run experience:** If no Gemini key is found anywhere, the tool prompts you to enter one and offers to save it globally.
|
|
357
|
+
|
|
358
|
+
### Config Resolution Priority
|
|
359
|
+
|
|
360
|
+
Highest wins:
|
|
361
|
+
|
|
362
|
+
1. **CLI flags** — `--gemini-key`, `--firebase-key`, etc.
|
|
363
|
+
2. **Environment variables** — `export GEMINI_API_KEY=...`
|
|
364
|
+
3. **CWD `.env` file** — project-specific config
|
|
365
|
+
4. **`~/.taskexrc`** — global persistent config
|
|
366
|
+
5. **Package root `.env`** — development fallback
|
|
367
|
+
|
|
368
|
+
All methods are fully backward-compatible.
|
|
369
|
+
|
|
370
|
+
### CLI Config Flags
|
|
371
|
+
|
|
372
|
+
Pass keys directly — no files needed:
|
|
373
|
+
|
|
374
|
+
```bash
|
|
375
|
+
taskex --gemini-key "AIza..." --name "Jane" "my-meeting"
|
|
376
|
+
```
|
|
377
|
+
|
|
378
|
+
### `.env` File
|
|
379
|
+
|
|
380
|
+
For repeated use, create a `.env` in your **working directory**. Run `node setup.js` (from the cloned repo) to generate one automatically.
|
|
381
|
+
|
|
382
|
+
Only `GEMINI_API_KEY` is required — everything else has defaults:
|
|
383
|
+
|
|
384
|
+
```env
|
|
385
|
+
# Required
|
|
386
|
+
GEMINI_API_KEY=your-key-here
|
|
387
|
+
|
|
388
|
+
# Optional — uncomment to customize
|
|
389
|
+
# GEMINI_MODEL=gemini-2.5-flash
|
|
390
|
+
# VIDEO_SPEED=1.5
|
|
391
|
+
# THINKING_BUDGET=24576
|
|
392
|
+
# LOG_LEVEL=info
|
|
393
|
+
|
|
394
|
+
# Optional — Firebase (or just use --skip-upload)
|
|
395
|
+
# FIREBASE_API_KEY=...
|
|
396
|
+
# FIREBASE_AUTH_DOMAIN=...
|
|
397
|
+
# FIREBASE_PROJECT_ID=...
|
|
398
|
+
# FIREBASE_STORAGE_BUCKET=...
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
> Full variable list + video encoding parameters → [ARCHITECTURE.md](ARCHITECTURE.md#tech-stack)
|
|
402
|
+
|
|
403
|
+
---
|
|
404
|
+
|
|
405
|
+
## Features
|
|
406
|
+
|
|
407
|
+
| Feature | Description |
|
|
408
|
+
|---------|-------------|
|
|
409
|
+
| **Video Compression** | H.264 CRF 24, text-optimized sharpening, configurable speed |
|
|
410
|
+
| **Smart Segmentation** | ≤5 min chunks with boundary-aware splitting |
|
|
411
|
+
| **Cross-Segment Continuity** | Ticket IDs, names, and context carry forward |
|
|
412
|
+
| **Document Discovery** | Auto-finds docs in all subfolders |
|
|
413
|
+
| **Storage URL Optimization** | Firebase download URLs reused as Gemini External URLs — skips separate File API upload |
|
|
414
|
+
| **Upload Control Flags** | `--force-upload` to re-upload, `--no-storage-url` to force File API — full control over upload behavior |
|
|
415
|
+
| **3-Strategy File Resolution** | Reuse URI → Storage URL → File API upload (zero redundant uploads) |
|
|
416
|
+
| **Gemini File Cleanup** | Auto-deletes File API uploads after analysis completes |
|
|
417
|
+
| **Quality Gate** | 4-dimension scoring with auto-retry |
|
|
418
|
+
| **Focused Re-Analysis** | Targeted second pass on weak areas |
|
|
419
|
+
| **Learning Loop** | Auto-tunes budgets from past run quality |
|
|
420
|
+
| **Diff Engine** | Shows what changed between runs |
|
|
421
|
+
| **Confidence Scoring** | Every item rated HIGH/MEDIUM/LOW with evidence |
|
|
422
|
+
| **Model Selection** | 5 Gemini models — interactive picker or `--model` |
|
|
423
|
+
| **Git Progress Tracking** | Correlates commits with extracted items |
|
|
424
|
+
| **Deep Dive** | Explanatory docs per topic discussed |
|
|
425
|
+
| **Dynamic Mode** | Generate docs from any content mix |
|
|
426
|
+
| **Interactive CLI** | Run with no args → guided experience |
|
|
427
|
+
| **Resume / Checkpoint** | `--resume` continues interrupted runs |
|
|
428
|
+
| **Firebase Upload** | Team access via cloud (optional) |
|
|
429
|
+
|
|
430
|
+
> Technical details on each feature → [ARCHITECTURE.md](ARCHITECTURE.md)
|
|
431
|
+
|
|
432
|
+
---
|
|
433
|
+
|
|
434
|
+
## Updating
|
|
435
|
+
|
|
436
|
+
**npm global install:**
|
|
437
|
+
|
|
438
|
+
```bash
|
|
439
|
+
npm update -g task-summary-extractor
|
|
440
|
+
```
|
|
441
|
+
|
|
442
|
+
**Git clone:**
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
git checkout main && git pull
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
Your call folders, `.env`, logs, and videos are all `.gitignore`d — nothing gets lost.
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
## Troubleshooting
|
|
453
|
+
|
|
454
|
+
| Problem | Fix |
|
|
455
|
+
|---------|-----|
|
|
456
|
+
| `ffmpeg not found` | [Download](https://www.gyan.dev/ffmpeg/builds/) → add to PATH |
|
|
457
|
+
| `GEMINI_API_KEY not set` | Run `taskex config` to save globally, or edit `.env` → paste key from [AI Studio](https://aistudio.google.com/apikey) |
|
|
458
|
+
| `ECONNREFUSED` | Check your internet — Gemini API needs network |
|
|
459
|
+
| Videos are slow | Normal — ~30-60s per 5-min segment |
|
|
460
|
+
| JSON parse warnings | Expected — the parser has 5 fallback strategies |
|
|
461
|
+
| Something else broken | `node setup.js --check` validates everything |
|
|
462
|
+
|
|
463
|
+
---
|
|
464
|
+
|
|
465
|
+
## Project Structure
|
|
466
|
+
|
|
467
|
+
```
|
|
468
|
+
task-summary-extractor/
|
|
469
|
+
├── bin/
|
|
470
|
+
│ └── taskex.js Global CLI entry point
|
|
471
|
+
├── process_and_upload.js Backward-compatible entry point
|
|
472
|
+
├── setup.js First-time setup & validation
|
|
473
|
+
├── package.json Dependencies, scripts, bin config
|
|
474
|
+
├── prompt.json Gemini extraction prompt
|
|
475
|
+
│
|
|
476
|
+
├── src/
|
|
477
|
+
│ ├── config.js Config, model registry, env vars
|
|
478
|
+
│ ├── logger.js Structured JSONL logger (triple output)
|
|
479
|
+
│ ├── pipeline.js Multi-mode orchestrator (1,985 lines)
|
|
480
|
+
│ ├── services/
|
|
481
|
+
│ │ ├── gemini.js Gemini AI — 3-strategy file resolution + External URL support
|
|
482
|
+
│ │ ├── firebase.js Firebase Storage (async I/O)
|
|
483
|
+
│ │ ├── video.js ffmpeg compression
|
|
484
|
+
│ │ └── git.js Git CLI wrapper
|
|
485
|
+
│ ├── renderers/
|
|
486
|
+
│ │ └── markdown.js Report renderer
|
|
487
|
+
│ └── utils/ 21 modules — see ARCHITECTURE.md
|
|
488
|
+
│
|
|
489
|
+
├── QUICK_START.md Step-by-step setup guide
|
|
490
|
+
├── ARCHITECTURE.md Technical deep dive
|
|
491
|
+
└── EXPLORATION.md Roadmap & future features
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
> Full module map with line counts → [EXPLORATION.md](EXPLORATION.md#full-module-map)
|
|
495
|
+
|
|
496
|
+
---
|
|
497
|
+
|
|
498
|
+
## npm Scripts
|
|
499
|
+
|
|
500
|
+
> If installed globally, just use `taskex` directly. These scripts are for development use with the cloned repo.
|
|
501
|
+
|
|
502
|
+
| Script | What |
|
|
503
|
+
|--------|------|
|
|
504
|
+
| `npm run setup` | First-time setup |
|
|
505
|
+
| `npm run check` | Validate environment |
|
|
506
|
+
| `npm start` | Run the pipeline |
|
|
507
|
+
| `npm run help` | Show CLI help |
|
|
508
|
+
|
|
509
|
+
---
|
|
510
|
+
|
|
511
|
+
## Version History
|
|
512
|
+
|
|
513
|
+
| Version | Highlights |
|
|
514
|
+
|---------|-----------|
|
|
515
|
+
| **v8.1.0** | **Smart global config** — `taskex config` persistent setup (`~/.taskexrc`), first-run prompting, 5-level config resolution, production audit fixes, shared CLI flag injection, boolean flag parser fix |
|
|
516
|
+
| **v8.0.0** | **npm package** — `npm i -g task-summary-extractor`, `taskex` global CLI, `--gemini-key` / `--firebase-*` config flags, run from anywhere, CWD-first `.env` resolution |
|
|
517
|
+
| **v7.2.3** | Production hardening — cross-platform ffmpeg, shell injection fix, auto git init for progress tracking, `runs/` excluded from doc discovery |
|
|
518
|
+
| **v7.2.2** | Upload control flags (`--force-upload`, `--no-storage-url`), production-ready docs |
|
|
519
|
+
| **v7.2.1** | Storage URL optimization, 3-strategy file resolution, Gemini file cleanup, codebase audit fixes |
|
|
520
|
+
| **v7.2** | Interactive model selector, `--model` flag, 5-model registry |
|
|
521
|
+
| **v7.1** | `--dynamic` processes videos too — any content mix |
|
|
522
|
+
| **v7.0** | Dynamic mode, interactive folder selection |
|
|
523
|
+
| **v6.2** | `--deep-dive` → topic docs |
|
|
524
|
+
| **v6.1** | Git progress tracking, `--update-progress` |
|
|
525
|
+
| **v6** | Confidence scoring, learning loop, diff engine |
|
|
526
|
+
| **v5** | Quality gate, adaptive budgets |
|
|
527
|
+
| **v4** | 8-phase pipeline, cost tracking |
|
|
528
|
+
| **v3** | Logger, retry logic, checkpoints |
|
|
529
|
+
|
|
530
|
+
---
|
|
531
|
+
|
|
532
|
+
## Documentation
|
|
533
|
+
|
|
534
|
+
| Doc | What's In It | When to Read |
|
|
535
|
+
|-----|-------------|-------------|
|
|
536
|
+
| 📖 **[QUICK_START.md](QUICK_START.md)** | Full setup walkthrough, examples, troubleshooting | First time using the tool |
|
|
537
|
+
| 🏗️ **[ARCHITECTURE.md](ARCHITECTURE.md)** | Pipeline phases, algorithms, Mermaid diagrams | Understanding how it works |
|
|
538
|
+
| 🔭 **[EXPLORATION.md](EXPLORATION.md)** | Module map, line counts, future roadmap | Contributing or extending |
|
|
539
|
+
|
|
540
|
+
---
|
|
541
|
+
|
|
542
|
+
## License
|
|
543
|
+
|
|
544
|
+
MIT — © 2026 Youssef Adel
|
package/bin/taskex.js
ADDED
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* taskex — AI-powered meeting analysis & document generation.
|
|
4
|
+
*
|
|
5
|
+
* Global CLI entry point for the task-summary-extractor package.
|
|
6
|
+
* Install: npm i -g task-summary-extractor
|
|
7
|
+
* Usage: taskex [options] [folder]
|
|
8
|
+
*
|
|
9
|
+
* Subcommands:
|
|
10
|
+
* taskex config Interactive global config setup (~/.taskexrc)
|
|
11
|
+
* taskex config --show Show saved config (masked secrets)
|
|
12
|
+
* taskex config --clear Remove global config file
|
|
13
|
+
*
|
|
14
|
+
* Config flags (override .env and global config):
|
|
15
|
+
* --gemini-key <key> Gemini API key
|
|
16
|
+
* --firebase-key <key> Firebase API key
|
|
17
|
+
* --firebase-project <id> Firebase project ID
|
|
18
|
+
* --firebase-bucket <bucket> Firebase storage bucket
|
|
19
|
+
* --firebase-domain <domain> Firebase auth domain
|
|
20
|
+
*
|
|
21
|
+
* Config resolution (highest wins):
|
|
22
|
+
* CLI flags → process.env → CWD .env → ~/.taskexrc → package .env
|
|
23
|
+
*/
|
|
24
|
+
|
|
25
|
+
'use strict';
|
|
26
|
+
|
|
27
|
+
// ── Handle `taskex config` subcommand before anything else ────────────────
|
|
28
|
+
const rawArgs = process.argv.slice(2);
|
|
29
|
+
if (rawArgs[0] === 'config') {
|
|
30
|
+
const hasShow = rawArgs.includes('--show');
|
|
31
|
+
const hasClear = rawArgs.includes('--clear');
|
|
32
|
+
const { interactiveSetup } = require('../src/utils/global-config');
|
|
33
|
+
interactiveSetup({ showOnly: hasShow, clear: hasClear }).then(() => {
|
|
34
|
+
process.exit(0);
|
|
35
|
+
}).catch(err => {
|
|
36
|
+
process.stderr.write(`\nError: ${err.message}\n`);
|
|
37
|
+
process.exit(1);
|
|
38
|
+
});
|
|
39
|
+
} else {
|
|
40
|
+
// ── Inject CLI config flags into process.env ────────────────────────────
|
|
41
|
+
// Must run BEFORE any require() that touches config.js / dotenv
|
|
42
|
+
const { injectCliFlags } = require('../src/utils/inject-cli-flags');
|
|
43
|
+
injectCliFlags();
|
|
44
|
+
|
|
45
|
+
// ── Delegate to pipeline ────────────────────────────────────────────────
|
|
46
|
+
const { run, getLog } = require('../src/pipeline');
|
|
47
|
+
|
|
48
|
+
run().catch(err => {
|
|
49
|
+
if (err.code === 'HELP_SHOWN' || err.code === 'VERSION_SHOWN') {
|
|
50
|
+
process.exit(0);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const log = getLog();
|
|
54
|
+
if (log) {
|
|
55
|
+
log.error(`FATAL: ${err.message || err}`);
|
|
56
|
+
log.error(err.stack || '');
|
|
57
|
+
log.step('FAILED');
|
|
58
|
+
log.close();
|
|
59
|
+
}
|
|
60
|
+
process.stderr.write(`\nFATAL: ${err.message || err}\n`);
|
|
61
|
+
process.stderr.write(`${err.stack || ''}\n`);
|
|
62
|
+
process.exit(1);
|
|
63
|
+
});
|
|
64
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "task-summary-extractor",
|
|
3
|
+
"version": "8.1.0",
|
|
4
|
+
"description": "AI-powered meeting analysis & document generation CLI — video + document processing, deep dive docs, dynamic mode, interactive CLI with model selection, confidence scoring, learning loop, git progress tracking",
|
|
5
|
+
"main": "process_and_upload.js",
|
|
6
|
+
"bin": {
|
|
7
|
+
"taskex": "./bin/taskex.js"
|
|
8
|
+
},
|
|
9
|
+
"files": [
|
|
10
|
+
"bin/",
|
|
11
|
+
"src/",
|
|
12
|
+
"prompt.json",
|
|
13
|
+
"process_and_upload.js",
|
|
14
|
+
"setup.js",
|
|
15
|
+
"README.md",
|
|
16
|
+
"QUICK_START.md",
|
|
17
|
+
"ARCHITECTURE.md",
|
|
18
|
+
"EXPLORATION.md"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"setup": "node setup.js",
|
|
22
|
+
"check": "node setup.js --check",
|
|
23
|
+
"start": "node process_and_upload.js",
|
|
24
|
+
"process": "node process_and_upload.js",
|
|
25
|
+
"process:local": "node process_and_upload.js --skip-upload",
|
|
26
|
+
"process:resume": "node process_and_upload.js --resume",
|
|
27
|
+
"process:dry-run": "node process_and_upload.js --dry-run",
|
|
28
|
+
"dynamic": "node process_and_upload.js --dynamic",
|
|
29
|
+
"help": "node process_and_upload.js --help",
|
|
30
|
+
"version": "node process_and_upload.js --version"
|
|
31
|
+
},
|
|
32
|
+
"keywords": [
|
|
33
|
+
"meeting",
|
|
34
|
+
"analysis",
|
|
35
|
+
"gemini",
|
|
36
|
+
"ai",
|
|
37
|
+
"video",
|
|
38
|
+
"transcription",
|
|
39
|
+
"task-extraction",
|
|
40
|
+
"document-generation",
|
|
41
|
+
"cli",
|
|
42
|
+
"firebase",
|
|
43
|
+
"ffmpeg"
|
|
44
|
+
],
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "git+https://github.com/youssefadel94/task-summary-extractor.git"
|
|
48
|
+
},
|
|
49
|
+
"homepage": "https://github.com/youssefadel94/task-summary-extractor#readme",
|
|
50
|
+
"bugs": {
|
|
51
|
+
"url": "https://github.com/youssefadel94/task-summary-extractor/issues"
|
|
52
|
+
},
|
|
53
|
+
"author": "Youssef Adel",
|
|
54
|
+
"license": "MIT",
|
|
55
|
+
"dependencies": {
|
|
56
|
+
"@google/genai": "^1.42.0",
|
|
57
|
+
"dotenv": "^17.3.1",
|
|
58
|
+
"firebase": "^12.9.0"
|
|
59
|
+
},
|
|
60
|
+
"engines": {
|
|
61
|
+
"node": ">=18.0.0"
|
|
62
|
+
}
|
|
63
|
+
}
|