@jacques-ai/core 0.0.7-alpha.1
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/archive/archive-store.d.ts +166 -0
- package/dist/archive/archive-store.d.ts.map +1 -0
- package/dist/archive/archive-store.js +612 -0
- package/dist/archive/archive-store.js.map +1 -0
- package/dist/archive/bulk-archive.d.ts +63 -0
- package/dist/archive/bulk-archive.d.ts.map +1 -0
- package/dist/archive/bulk-archive.js +315 -0
- package/dist/archive/bulk-archive.js.map +1 -0
- package/dist/archive/filename-utils.d.ts +39 -0
- package/dist/archive/filename-utils.d.ts.map +1 -0
- package/dist/archive/filename-utils.js +78 -0
- package/dist/archive/filename-utils.js.map +1 -0
- package/dist/archive/index.d.ts +21 -0
- package/dist/archive/index.d.ts.map +1 -0
- package/dist/archive/index.js +45 -0
- package/dist/archive/index.js.map +1 -0
- package/dist/archive/manifest-extractor.d.ts +40 -0
- package/dist/archive/manifest-extractor.d.ts.map +1 -0
- package/dist/archive/manifest-extractor.js +456 -0
- package/dist/archive/manifest-extractor.js.map +1 -0
- package/dist/archive/migration.d.ts +59 -0
- package/dist/archive/migration.d.ts.map +1 -0
- package/dist/archive/migration.js +172 -0
- package/dist/archive/migration.js.map +1 -0
- package/dist/archive/plan-cataloger.d.ts +24 -0
- package/dist/archive/plan-cataloger.d.ts.map +1 -0
- package/dist/archive/plan-cataloger.js +100 -0
- package/dist/archive/plan-cataloger.js.map +1 -0
- package/dist/archive/plan-extractor.d.ts +84 -0
- package/dist/archive/plan-extractor.d.ts.map +1 -0
- package/dist/archive/plan-extractor.js +371 -0
- package/dist/archive/plan-extractor.js.map +1 -0
- package/dist/archive/search-indexer.d.ts +50 -0
- package/dist/archive/search-indexer.d.ts.map +1 -0
- package/dist/archive/search-indexer.js +294 -0
- package/dist/archive/search-indexer.js.map +1 -0
- package/dist/archive/subagent-store.d.ts +113 -0
- package/dist/archive/subagent-store.d.ts.map +1 -0
- package/dist/archive/subagent-store.js +173 -0
- package/dist/archive/subagent-store.js.map +1 -0
- package/dist/archive/types.d.ts +236 -0
- package/dist/archive/types.d.ts.map +1 -0
- package/dist/archive/types.js +30 -0
- package/dist/archive/types.js.map +1 -0
- package/dist/branding.d.ts +9 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/branding.js +50 -0
- package/dist/branding.js.map +1 -0
- package/dist/cache/git-utils.d.ts +36 -0
- package/dist/cache/git-utils.d.ts.map +1 -0
- package/dist/cache/git-utils.js +160 -0
- package/dist/cache/git-utils.js.map +1 -0
- package/dist/cache/hidden-projects.d.ts +19 -0
- package/dist/cache/hidden-projects.d.ts.map +1 -0
- package/dist/cache/hidden-projects.js +48 -0
- package/dist/cache/hidden-projects.js.map +1 -0
- package/dist/cache/index.d.ts +15 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +20 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/metadata-extractor.d.ts +62 -0
- package/dist/cache/metadata-extractor.d.ts.map +1 -0
- package/dist/cache/metadata-extractor.js +574 -0
- package/dist/cache/metadata-extractor.js.map +1 -0
- package/dist/cache/mode-detector.d.ts +19 -0
- package/dist/cache/mode-detector.d.ts.map +1 -0
- package/dist/cache/mode-detector.js +161 -0
- package/dist/cache/mode-detector.js.map +1 -0
- package/dist/cache/persistence.d.ts +39 -0
- package/dist/cache/persistence.d.ts.map +1 -0
- package/dist/cache/persistence.js +98 -0
- package/dist/cache/persistence.js.map +1 -0
- package/dist/cache/project-discovery.d.ts +41 -0
- package/dist/cache/project-discovery.d.ts.map +1 -0
- package/dist/cache/project-discovery.js +212 -0
- package/dist/cache/project-discovery.js.map +1 -0
- package/dist/cache/session-index.d.ts +258 -0
- package/dist/cache/session-index.d.ts.map +1 -0
- package/dist/cache/session-index.js +1030 -0
- package/dist/cache/session-index.js.map +1 -0
- package/dist/cache/types.d.ts +159 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +29 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/catalog/bulk-extractor.d.ts +18 -0
- package/dist/catalog/bulk-extractor.d.ts.map +1 -0
- package/dist/catalog/bulk-extractor.js +150 -0
- package/dist/catalog/bulk-extractor.js.map +1 -0
- package/dist/catalog/extractor.d.ts +53 -0
- package/dist/catalog/extractor.d.ts.map +1 -0
- package/dist/catalog/extractor.js +522 -0
- package/dist/catalog/extractor.js.map +1 -0
- package/dist/catalog/index.d.ts +10 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +11 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/types.d.ts +134 -0
- package/dist/catalog/types.d.ts.map +1 -0
- package/dist/catalog/types.js +8 -0
- package/dist/catalog/types.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/websocket-client.d.ts +96 -0
- package/dist/client/websocket-client.d.ts.map +1 -0
- package/dist/client/websocket-client.js +222 -0
- package/dist/client/websocket-client.js.map +1 -0
- package/dist/context/index.d.ts +13 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +26 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/indexer.d.ts +73 -0
- package/dist/context/indexer.d.ts.map +1 -0
- package/dist/context/indexer.js +233 -0
- package/dist/context/indexer.js.map +1 -0
- package/dist/context/manager.d.ts +66 -0
- package/dist/context/manager.d.ts.map +1 -0
- package/dist/context/manager.js +310 -0
- package/dist/context/manager.js.map +1 -0
- package/dist/context/types.d.ts +149 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +36 -0
- package/dist/context/types.js.map +1 -0
- package/dist/handoff/catalog.d.ts +54 -0
- package/dist/handoff/catalog.d.ts.map +1 -0
- package/dist/handoff/catalog.js +121 -0
- package/dist/handoff/catalog.js.map +1 -0
- package/dist/handoff/generator.d.ts +107 -0
- package/dist/handoff/generator.d.ts.map +1 -0
- package/dist/handoff/generator.js +603 -0
- package/dist/handoff/generator.js.map +1 -0
- package/dist/handoff/index.d.ts +13 -0
- package/dist/handoff/index.d.ts.map +1 -0
- package/dist/handoff/index.js +12 -0
- package/dist/handoff/index.js.map +1 -0
- package/dist/handoff/llm-generator.d.ts +77 -0
- package/dist/handoff/llm-generator.d.ts.map +1 -0
- package/dist/handoff/llm-generator.js +513 -0
- package/dist/handoff/llm-generator.js.map +1 -0
- package/dist/handoff/prompts.d.ts +18 -0
- package/dist/handoff/prompts.d.ts.map +1 -0
- package/dist/handoff/prompts.js +22 -0
- package/dist/handoff/prompts.js.map +1 -0
- package/dist/handoff/types.d.ts +28 -0
- package/dist/handoff/types.d.ts.map +1 -0
- package/dist/handoff/types.js +7 -0
- package/dist/handoff/types.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +132 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/claude-operations.d.ts +111 -0
- package/dist/logging/claude-operations.d.ts.map +1 -0
- package/dist/logging/claude-operations.js +132 -0
- package/dist/logging/claude-operations.js.map +1 -0
- package/dist/logging/error-utils.d.ts +18 -0
- package/dist/logging/error-utils.d.ts.map +1 -0
- package/dist/logging/error-utils.js +37 -0
- package/dist/logging/error-utils.js.map +1 -0
- package/dist/logging/index.d.ts +11 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +10 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +25 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +39 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/notifications/constants.d.ts +16 -0
- package/dist/notifications/constants.d.ts.map +1 -0
- package/dist/notifications/constants.js +49 -0
- package/dist/notifications/constants.js.map +1 -0
- package/dist/notifications/index.d.ts +9 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +8 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/types.d.ts +28 -0
- package/dist/notifications/types.d.ts.map +1 -0
- package/dist/notifications/types.js +7 -0
- package/dist/notifications/types.js.map +1 -0
- package/dist/notifications/utils.d.ts +20 -0
- package/dist/notifications/utils.d.ts.map +1 -0
- package/dist/notifications/utils.js +37 -0
- package/dist/notifications/utils.js.map +1 -0
- package/dist/plan/index.d.ts +12 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +15 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/plan/plan-parser.d.ts +33 -0
- package/dist/plan/plan-parser.d.ts.map +1 -0
- package/dist/plan/plan-parser.js +189 -0
- package/dist/plan/plan-parser.js.map +1 -0
- package/dist/plan/progress-computer.d.ts +34 -0
- package/dist/plan/progress-computer.d.ts.map +1 -0
- package/dist/plan/progress-computer.js +211 -0
- package/dist/plan/progress-computer.js.map +1 -0
- package/dist/plan/progress-matcher.d.ts +34 -0
- package/dist/plan/progress-matcher.d.ts.map +1 -0
- package/dist/plan/progress-matcher.js +297 -0
- package/dist/plan/progress-matcher.js.map +1 -0
- package/dist/plan/task-extractor.d.ts +30 -0
- package/dist/plan/task-extractor.d.ts.map +1 -0
- package/dist/plan/task-extractor.js +435 -0
- package/dist/plan/task-extractor.js.map +1 -0
- package/dist/plan/types.d.ts +131 -0
- package/dist/plan/types.d.ts.map +1 -0
- package/dist/plan/types.js +8 -0
- package/dist/plan/types.js.map +1 -0
- package/dist/project/aggregator.d.ts +43 -0
- package/dist/project/aggregator.d.ts.map +1 -0
- package/dist/project/aggregator.js +218 -0
- package/dist/project/aggregator.js.map +1 -0
- package/dist/project/index.d.ts +9 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +9 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/types.d.ts +65 -0
- package/dist/project/types.d.ts.map +1 -0
- package/dist/project/types.js +27 -0
- package/dist/project/types.js.map +1 -0
- package/dist/session/detector.d.ts +113 -0
- package/dist/session/detector.d.ts.map +1 -0
- package/dist/session/detector.js +333 -0
- package/dist/session/detector.js.map +1 -0
- package/dist/session/filters.d.ts +32 -0
- package/dist/session/filters.d.ts.map +1 -0
- package/dist/session/filters.js +100 -0
- package/dist/session/filters.js.map +1 -0
- package/dist/session/format-title.d.ts +16 -0
- package/dist/session/format-title.d.ts.map +1 -0
- package/dist/session/format-title.js +54 -0
- package/dist/session/format-title.js.map +1 -0
- package/dist/session/index.d.ts +16 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +10 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/parser.d.ts +264 -0
- package/dist/session/parser.d.ts.map +1 -0
- package/dist/session/parser.js +588 -0
- package/dist/session/parser.js.map +1 -0
- package/dist/session/token-estimator.d.ts +32 -0
- package/dist/session/token-estimator.d.ts.map +1 -0
- package/dist/session/token-estimator.js +139 -0
- package/dist/session/token-estimator.js.map +1 -0
- package/dist/session/transformer.d.ts +126 -0
- package/dist/session/transformer.d.ts.map +1 -0
- package/dist/session/transformer.js +158 -0
- package/dist/session/transformer.js.map +1 -0
- package/dist/setup/hooks-config.d.ts +35 -0
- package/dist/setup/hooks-config.d.ts.map +1 -0
- package/dist/setup/hooks-config.js +107 -0
- package/dist/setup/hooks-config.js.map +1 -0
- package/dist/setup/hooks-symlink.d.ts +17 -0
- package/dist/setup/hooks-symlink.d.ts.map +1 -0
- package/dist/setup/hooks-symlink.js +89 -0
- package/dist/setup/hooks-symlink.js.map +1 -0
- package/dist/setup/index.d.ts +13 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +12 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/prerequisites.d.ts +11 -0
- package/dist/setup/prerequisites.d.ts.map +1 -0
- package/dist/setup/prerequisites.js +72 -0
- package/dist/setup/prerequisites.js.map +1 -0
- package/dist/setup/settings-merge.d.ts +33 -0
- package/dist/setup/settings-merge.d.ts.map +1 -0
- package/dist/setup/settings-merge.js +131 -0
- package/dist/setup/settings-merge.js.map +1 -0
- package/dist/setup/skills-install.d.ts +17 -0
- package/dist/setup/skills-install.d.ts.map +1 -0
- package/dist/setup/skills-install.js +60 -0
- package/dist/setup/skills-install.js.map +1 -0
- package/dist/setup/types.d.ts +39 -0
- package/dist/setup/types.d.ts.map +1 -0
- package/dist/setup/types.js +7 -0
- package/dist/setup/types.js.map +1 -0
- package/dist/setup/verification.d.ts +9 -0
- package/dist/setup/verification.d.ts.map +1 -0
- package/dist/setup/verification.js +91 -0
- package/dist/setup/verification.js.map +1 -0
- package/dist/shortcuts/index.d.ts +8 -0
- package/dist/shortcuts/index.d.ts.map +1 -0
- package/dist/shortcuts/index.js +6 -0
- package/dist/shortcuts/index.js.map +1 -0
- package/dist/shortcuts/key-utils.d.ts +54 -0
- package/dist/shortcuts/key-utils.d.ts.map +1 -0
- package/dist/shortcuts/key-utils.js +129 -0
- package/dist/shortcuts/key-utils.js.map +1 -0
- package/dist/shortcuts/shortcut-registry.d.ts +37 -0
- package/dist/shortcuts/shortcut-registry.d.ts.map +1 -0
- package/dist/shortcuts/shortcut-registry.js +322 -0
- package/dist/shortcuts/shortcut-registry.js.map +1 -0
- package/dist/sources/config.d.ts +91 -0
- package/dist/sources/config.d.ts.map +1 -0
- package/dist/sources/config.js +229 -0
- package/dist/sources/config.js.map +1 -0
- package/dist/sources/googledocs.d.ts +43 -0
- package/dist/sources/googledocs.d.ts.map +1 -0
- package/dist/sources/googledocs.js +298 -0
- package/dist/sources/googledocs.js.map +1 -0
- package/dist/sources/index.d.ts +14 -0
- package/dist/sources/index.d.ts.map +1 -0
- package/dist/sources/index.js +19 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/notion.d.ts +35 -0
- package/dist/sources/notion.d.ts.map +1 -0
- package/dist/sources/notion.js +352 -0
- package/dist/sources/notion.js.map +1 -0
- package/dist/sources/obsidian.d.ts +38 -0
- package/dist/sources/obsidian.d.ts.map +1 -0
- package/dist/sources/obsidian.js +228 -0
- package/dist/sources/obsidian.js.map +1 -0
- package/dist/sources/types.d.ts +133 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +19 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/writer.d.ts +86 -0
- package/dist/storage/writer.d.ts.map +1 -0
- package/dist/storage/writer.js +137 -0
- package/dist/storage/writer.js.map +1 -0
- package/dist/types.d.ts +203 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/claude-token.d.ts +49 -0
- package/dist/utils/claude-token.d.ts.map +1 -0
- package/dist/utils/claude-token.js +169 -0
- package/dist/utils/claude-token.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +13 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/settings.d.ts +100 -0
- package/dist/utils/settings.d.ts.map +1 -0
- package/dist/utils/settings.js +206 -0
- package/dist/utils/settings.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress Computer
|
|
3
|
+
*
|
|
4
|
+
* Orchestrates plan progress computation:
|
|
5
|
+
* 1. Parse plan markdown
|
|
6
|
+
* 2. Load linked sessions
|
|
7
|
+
* 3. Extract task signals
|
|
8
|
+
* 4. Match signals to plan items
|
|
9
|
+
* 5. Compute and cache progress
|
|
10
|
+
*/
|
|
11
|
+
import { promises as fs } from "fs";
|
|
12
|
+
import { join } from "path";
|
|
13
|
+
import { createHash } from "crypto";
|
|
14
|
+
import { homedir } from "os";
|
|
15
|
+
import { parseJSONL } from "../session/parser.js";
|
|
16
|
+
import { readSessionIndex } from "../cache/index.js";
|
|
17
|
+
import { parsePlanMarkdown } from "./plan-parser.js";
|
|
18
|
+
import { extractTaskSignals } from "./task-extractor.js";
|
|
19
|
+
import { matchSignalsToPlanItems, determineItemStatus, isTrackableForProgress, } from "./progress-matcher.js";
|
|
20
|
+
/** Cache directory for plan progress */
|
|
21
|
+
const PROGRESS_CACHE_DIR = join(homedir(), ".jacques", "cache", "plan-progress");
|
|
22
|
+
/**
|
|
23
|
+
* Compute full progress for a plan.
|
|
24
|
+
*
|
|
25
|
+
* @param plan - The plan entry from the project index
|
|
26
|
+
* @param planContent - The markdown content of the plan
|
|
27
|
+
* @param cwd - The project working directory
|
|
28
|
+
*/
|
|
29
|
+
export async function computePlanProgress(plan, planContent, cwd) {
|
|
30
|
+
// 1. Parse plan markdown
|
|
31
|
+
const parsedPlan = parsePlanMarkdown(planContent);
|
|
32
|
+
// 2. Compute cache key
|
|
33
|
+
const cacheKey = await computeCacheKey(plan, planContent);
|
|
34
|
+
// 3. Check cache
|
|
35
|
+
const cached = await readProgressCache(plan.id);
|
|
36
|
+
if (cached && cached.cacheKey === cacheKey) {
|
|
37
|
+
return cached;
|
|
38
|
+
}
|
|
39
|
+
// 4. Load sessions and extract signals
|
|
40
|
+
const allSignals = [];
|
|
41
|
+
const sessionIds = [];
|
|
42
|
+
const sessionIndex = await readSessionIndex();
|
|
43
|
+
for (const sessionId of plan.sessions) {
|
|
44
|
+
const sessionEntry = sessionIndex.sessions.find((s) => s.id === sessionId);
|
|
45
|
+
if (!sessionEntry?.jsonlPath) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
try {
|
|
49
|
+
const entries = await parseJSONL(sessionEntry.jsonlPath);
|
|
50
|
+
const signals = extractTaskSignals(entries, sessionId);
|
|
51
|
+
allSignals.push(...signals);
|
|
52
|
+
sessionIds.push(sessionId);
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Session file not found or unreadable, skip
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
// 5. Match signals to plan items
|
|
60
|
+
const matches = matchSignalsToPlanItems(parsedPlan.items, allSignals);
|
|
61
|
+
// 6. Build per-item progress
|
|
62
|
+
const itemProgress = [];
|
|
63
|
+
for (const item of parsedPlan.items) {
|
|
64
|
+
if (!isTrackableForProgress(item)) {
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const match = matches.get(item.id) || null;
|
|
68
|
+
const status = determineItemStatus(item, match);
|
|
69
|
+
itemProgress.push({
|
|
70
|
+
planItemId: item.id,
|
|
71
|
+
status,
|
|
72
|
+
bestMatch: match,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
// 7. Compute summary
|
|
76
|
+
const summary = computeSummary(itemProgress);
|
|
77
|
+
// 8. Build result
|
|
78
|
+
const progress = {
|
|
79
|
+
planId: plan.id,
|
|
80
|
+
computedAt: new Date().toISOString(),
|
|
81
|
+
items: itemProgress,
|
|
82
|
+
summary,
|
|
83
|
+
sessionIds,
|
|
84
|
+
cacheKey,
|
|
85
|
+
};
|
|
86
|
+
// 9. Save to cache
|
|
87
|
+
await writeProgressCache(plan.id, progress);
|
|
88
|
+
return progress;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Compute a lightweight progress summary for list views.
|
|
92
|
+
* Faster than full progress - only computes the percentage.
|
|
93
|
+
*/
|
|
94
|
+
export async function computePlanProgressSummary(plan, planContent, cwd) {
|
|
95
|
+
try {
|
|
96
|
+
const progress = await computePlanProgress(plan, planContent, cwd);
|
|
97
|
+
return {
|
|
98
|
+
planId: plan.id,
|
|
99
|
+
percentage: progress.summary.percentage,
|
|
100
|
+
loading: false,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return {
|
|
105
|
+
planId: plan.id,
|
|
106
|
+
percentage: 0,
|
|
107
|
+
loading: false,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Compute cache key from plan content and session file modification times.
|
|
113
|
+
*/
|
|
114
|
+
async function computeCacheKey(plan, planContent) {
|
|
115
|
+
const hash = createHash("sha256");
|
|
116
|
+
// Include plan content
|
|
117
|
+
hash.update(planContent);
|
|
118
|
+
// Include session file mtimes
|
|
119
|
+
const sessionIndex = await readSessionIndex();
|
|
120
|
+
const mtimes = [];
|
|
121
|
+
for (const sessionId of plan.sessions) {
|
|
122
|
+
const sessionEntry = sessionIndex.sessions.find((s) => s.id === sessionId);
|
|
123
|
+
if (sessionEntry?.modifiedAt) {
|
|
124
|
+
mtimes.push(sessionEntry.modifiedAt);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// Sort for deterministic key
|
|
128
|
+
mtimes.sort();
|
|
129
|
+
hash.update(mtimes.join(","));
|
|
130
|
+
return hash.digest("hex").substring(0, 16);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Compute summary statistics from item progress.
|
|
134
|
+
*/
|
|
135
|
+
function computeSummary(items) {
|
|
136
|
+
let completed = 0;
|
|
137
|
+
let inProgress = 0;
|
|
138
|
+
let notStarted = 0;
|
|
139
|
+
for (const item of items) {
|
|
140
|
+
switch (item.status) {
|
|
141
|
+
case "completed":
|
|
142
|
+
completed++;
|
|
143
|
+
break;
|
|
144
|
+
case "in_progress":
|
|
145
|
+
inProgress++;
|
|
146
|
+
break;
|
|
147
|
+
case "not_started":
|
|
148
|
+
notStarted++;
|
|
149
|
+
break;
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
const total = items.length;
|
|
153
|
+
const percentage = total > 0 ? Math.round((completed / total) * 100) : 0;
|
|
154
|
+
return {
|
|
155
|
+
total,
|
|
156
|
+
completed,
|
|
157
|
+
inProgress,
|
|
158
|
+
notStarted,
|
|
159
|
+
percentage,
|
|
160
|
+
};
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Read progress from cache.
|
|
164
|
+
*/
|
|
165
|
+
async function readProgressCache(planId) {
|
|
166
|
+
try {
|
|
167
|
+
const cachePath = join(PROGRESS_CACHE_DIR, `${planId}.json`);
|
|
168
|
+
const content = await fs.readFile(cachePath, "utf-8");
|
|
169
|
+
return JSON.parse(content);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
return null;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Write progress to cache.
|
|
177
|
+
*/
|
|
178
|
+
async function writeProgressCache(planId, progress) {
|
|
179
|
+
try {
|
|
180
|
+
await fs.mkdir(PROGRESS_CACHE_DIR, { recursive: true });
|
|
181
|
+
const cachePath = join(PROGRESS_CACHE_DIR, `${planId}.json`);
|
|
182
|
+
await fs.writeFile(cachePath, JSON.stringify(progress, null, 2), "utf-8");
|
|
183
|
+
}
|
|
184
|
+
catch {
|
|
185
|
+
// Cache write failures are non-blocking
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Clear the progress cache for a plan.
|
|
190
|
+
*/
|
|
191
|
+
export async function clearProgressCache(planId) {
|
|
192
|
+
try {
|
|
193
|
+
const cachePath = join(PROGRESS_CACHE_DIR, `${planId}.json`);
|
|
194
|
+
await fs.unlink(cachePath);
|
|
195
|
+
}
|
|
196
|
+
catch {
|
|
197
|
+
// Ignore errors if file doesn't exist
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Clear all progress cache.
|
|
202
|
+
*/
|
|
203
|
+
export async function clearAllProgressCache() {
|
|
204
|
+
try {
|
|
205
|
+
await fs.rm(PROGRESS_CACHE_DIR, { recursive: true, force: true });
|
|
206
|
+
}
|
|
207
|
+
catch {
|
|
208
|
+
// Ignore errors
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
//# sourceMappingURL=progress-computer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-computer.js","sourceRoot":"","sources":["../../src/plan/progress-computer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAqB,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,uBAAuB,EACvB,mBAAmB,EACnB,sBAAsB,GACvB,MAAM,uBAAuB,CAAC;AAS/B,wCAAwC;AACxC,MAAM,kBAAkB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC;AAEjF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,IAAe,EACf,WAAmB,EACnB,GAAW;IAEX,yBAAyB;IACzB,MAAM,UAAU,GAAG,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAElD,uBAAuB;IACvB,MAAM,QAAQ,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAE1D,iBAAiB;IACjB,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChD,IAAI,MAAM,IAAI,MAAM,CAAC,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3C,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,uCAAuC;IACvC,MAAM,UAAU,GAAiB,EAAE,CAAC;IACpC,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAE9C,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAC3E,IAAI,CAAC,YAAY,EAAE,SAAS,EAAE,CAAC;YAC7B,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC;YACzD,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;YACvD,UAAU,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC;YAC5B,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,6CAA6C;YAC7C,SAAS;QACX,CAAC;IACH,CAAC;IAED,iCAAiC;IACjC,MAAM,OAAO,GAAG,uBAAuB,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAEtE,6BAA6B;IAC7B,MAAM,YAAY,GAAuB,EAAE,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACpC,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,SAAS;QACX,CAAC;QAED,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;QAC3C,MAAM,MAAM,GAAG,mBAAmB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QAEhD,YAAY,CAAC,IAAI,CAAC;YAChB,UAAU,EAAE,IAAI,CAAC,EAAE;YACnB,MAAM;YACN,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,qBAAqB;IACrB,MAAM,OAAO,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;IAE7C,kBAAkB;IAClB,MAAM,QAAQ,GAAiB;QAC7B,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,UAAU,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACpC,KAAK,EAAE,YAAY;QACnB,OAAO;QACP,UAAU;QACV,QAAQ;KACT,CAAC;IAEF,mBAAmB;IACnB,MAAM,kBAAkB,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC,CAAC;IAE5C,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAe,EACf,WAAmB,EACnB,GAAW;IAEX,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,IAAI,EAAE,WAAW,EAAE,GAAG,CAAC,CAAC;QACnE,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,UAAU,EAAE,QAAQ,CAAC,OAAO,CAAC,UAAU;YACvC,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO;YACL,MAAM,EAAE,IAAI,CAAC,EAAE;YACf,UAAU,EAAE,CAAC;YACb,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,eAAe,CAC5B,IAAe,EACf,WAAmB;IAEnB,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAElC,uBAAuB;IACvB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAEzB,8BAA8B;IAC9B,MAAM,YAAY,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAC9C,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QACtC,MAAM,YAAY,GAAG,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;QAC3E,IAAI,YAAY,EAAE,UAAU,EAAE,CAAC;YAC7B,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,CAAC,IAAI,EAAE,CAAC;IACd,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAE9B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,KAAyB;IAC/C,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,QAAQ,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,KAAK,WAAW;gBACd,SAAS,EAAE,CAAC;gBACZ,MAAM;YACR,KAAK,aAAa;gBAChB,UAAU,EAAE,CAAC;gBACb,MAAM;YACR,KAAK,aAAa;gBAChB,UAAU,EAAE,CAAC;gBACb,MAAM;QACV,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC;IAC3B,MAAM,UAAU,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,SAAS,GAAG,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEzE,OAAO;QACL,KAAK;QACL,SAAS;QACT,UAAU;QACV,UAAU;QACV,UAAU;KACX,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,iBAAiB,CAAC,MAAc;IAC7C,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAiB,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,MAAc,EACd,QAAsB;IAEtB,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,KAAK,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;QAC7D,MAAM,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5E,CAAC;IAAC,MAAM,CAAC;QACP,wCAAwC;IAC1C,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,MAAc;IACrD,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,EAAE,GAAG,MAAM,OAAO,CAAC,CAAC;QAC7D,MAAM,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB;IACzC,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,EAAE,CAAC,kBAAkB,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpE,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress Matcher
|
|
3
|
+
*
|
|
4
|
+
* Matches task signals to plan items using multiple strategies:
|
|
5
|
+
* 1. Exact text match (confidence 1.0)
|
|
6
|
+
* 2. Keyword overlap via Jaccard similarity (confidence 0.5-0.9)
|
|
7
|
+
* 3. File path match (confidence 0.6)
|
|
8
|
+
* 4. Substring match (confidence 0.4)
|
|
9
|
+
*
|
|
10
|
+
* Confidence is also adjusted by signal source:
|
|
11
|
+
* - task_list: High reliability (explicit task state snapshot)
|
|
12
|
+
* - task_create/task_update: High reliability (direct task management)
|
|
13
|
+
* - todo_write: High reliability (explicit todo tracking)
|
|
14
|
+
* - agent_progress: Medium reliability (inferred from agent description)
|
|
15
|
+
* - bash_progress: Low reliability (heuristic from command output)
|
|
16
|
+
* - file_heuristic: Low reliability (inferred from file changes)
|
|
17
|
+
*/
|
|
18
|
+
import type { PlanItem, TaskSignal, PlanItemMatch, PlanItemStatus } from "./types.js";
|
|
19
|
+
/**
|
|
20
|
+
* Match task signals to plan items.
|
|
21
|
+
* Returns the best match for each plan item (highest confidence).
|
|
22
|
+
* Also matches headings to enable hierarchical propagation.
|
|
23
|
+
*/
|
|
24
|
+
export declare function matchSignalsToPlanItems(planItems: PlanItem[], signals: TaskSignal[]): Map<string, PlanItemMatch>;
|
|
25
|
+
/**
|
|
26
|
+
* Determine the status of a plan item based on its match.
|
|
27
|
+
* Also considers checkboxes marked in the source markdown.
|
|
28
|
+
*/
|
|
29
|
+
export declare function determineItemStatus(item: PlanItem, match: PlanItemMatch | null): PlanItemStatus;
|
|
30
|
+
/**
|
|
31
|
+
* Check if a plan item is considered trackable for progress.
|
|
32
|
+
*/
|
|
33
|
+
export declare function isTrackableForProgress(item: PlanItem): boolean;
|
|
34
|
+
//# sourceMappingURL=progress-matcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-matcher.d.ts","sourceRoot":"","sources":["../../src/plan/progress-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAkBtF;;;;GAIG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,QAAQ,EAAE,EACrB,OAAO,EAAE,UAAU,EAAE,GACpB,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAuB5B;AA4QD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,QAAQ,EACd,KAAK,EAAE,aAAa,GAAG,IAAI,GAC1B,cAAc,CAsBhB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAE9D"}
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Progress Matcher
|
|
3
|
+
*
|
|
4
|
+
* Matches task signals to plan items using multiple strategies:
|
|
5
|
+
* 1. Exact text match (confidence 1.0)
|
|
6
|
+
* 2. Keyword overlap via Jaccard similarity (confidence 0.5-0.9)
|
|
7
|
+
* 3. File path match (confidence 0.6)
|
|
8
|
+
* 4. Substring match (confidence 0.4)
|
|
9
|
+
*
|
|
10
|
+
* Confidence is also adjusted by signal source:
|
|
11
|
+
* - task_list: High reliability (explicit task state snapshot)
|
|
12
|
+
* - task_create/task_update: High reliability (direct task management)
|
|
13
|
+
* - todo_write: High reliability (explicit todo tracking)
|
|
14
|
+
* - agent_progress: Medium reliability (inferred from agent description)
|
|
15
|
+
* - bash_progress: Low reliability (heuristic from command output)
|
|
16
|
+
* - file_heuristic: Low reliability (inferred from file changes)
|
|
17
|
+
*/
|
|
18
|
+
import { calculateSimilarity } from "../archive/plan-extractor.js";
|
|
19
|
+
import { normalizeText } from "./plan-parser.js";
|
|
20
|
+
/** Minimum Jaccard similarity for keyword overlap matching */
|
|
21
|
+
const MIN_KEYWORD_SIMILARITY = 0.3;
|
|
22
|
+
/** Confidence multipliers by signal source */
|
|
23
|
+
const SOURCE_CONFIDENCE_MULTIPLIERS = {
|
|
24
|
+
task_list: 1.0, // Explicit task state - highest confidence
|
|
25
|
+
task_create: 1.0, // Direct task management
|
|
26
|
+
task_update: 1.0, // Direct task management
|
|
27
|
+
todo_write: 1.0, // Explicit todo tracking
|
|
28
|
+
agent_progress: 0.7, // Inferred from agent description
|
|
29
|
+
bash_progress: 0.5, // Heuristic from command output
|
|
30
|
+
file_heuristic: 0.6, // Inferred from file changes
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Match task signals to plan items.
|
|
34
|
+
* Returns the best match for each plan item (highest confidence).
|
|
35
|
+
* Also matches headings to enable hierarchical propagation.
|
|
36
|
+
*/
|
|
37
|
+
export function matchSignalsToPlanItems(planItems, signals) {
|
|
38
|
+
const matches = new Map();
|
|
39
|
+
// First pass: match all items including headings
|
|
40
|
+
for (const item of planItems) {
|
|
41
|
+
let bestMatch = null;
|
|
42
|
+
for (const signal of signals) {
|
|
43
|
+
const match = tryMatch(item, signal);
|
|
44
|
+
if (match && (!bestMatch || match.confidence > bestMatch.confidence)) {
|
|
45
|
+
bestMatch = match;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (bestMatch) {
|
|
49
|
+
matches.set(item.id, bestMatch);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Second pass: propagate matches from parents to children
|
|
53
|
+
propagateParentMatches(planItems, matches);
|
|
54
|
+
return matches;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Propagate matches from parent items to their children.
|
|
58
|
+
* If a heading/parent is matched, its unmatched children inherit that match.
|
|
59
|
+
*/
|
|
60
|
+
function propagateParentMatches(planItems, matches) {
|
|
61
|
+
// Build a map for quick lookup
|
|
62
|
+
const itemMap = new Map();
|
|
63
|
+
for (const item of planItems) {
|
|
64
|
+
itemMap.set(item.id, item);
|
|
65
|
+
}
|
|
66
|
+
// For each item without a match, check if any ancestor has a match
|
|
67
|
+
for (const item of planItems) {
|
|
68
|
+
if (matches.has(item.id)) {
|
|
69
|
+
continue; // Already has a direct match
|
|
70
|
+
}
|
|
71
|
+
// Walk up the parent chain looking for a match
|
|
72
|
+
let parentId = item.parentId;
|
|
73
|
+
while (parentId) {
|
|
74
|
+
const parentMatch = matches.get(parentId);
|
|
75
|
+
if (parentMatch) {
|
|
76
|
+
// Inherit the parent's match with reduced confidence
|
|
77
|
+
matches.set(item.id, {
|
|
78
|
+
...parentMatch,
|
|
79
|
+
planItemId: item.id,
|
|
80
|
+
confidence: parentMatch.confidence * 0.8, // Reduce confidence for inherited matches
|
|
81
|
+
matchMethod: "keyword_overlap", // Mark as inherited
|
|
82
|
+
});
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
const parent = itemMap.get(parentId);
|
|
86
|
+
parentId = parent?.parentId ?? null;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Try to match a signal to a plan item using various strategies.
|
|
92
|
+
* Returns the match if successful, null otherwise.
|
|
93
|
+
* Applies source-based confidence multiplier.
|
|
94
|
+
*/
|
|
95
|
+
function tryMatch(item, signal) {
|
|
96
|
+
let match = null;
|
|
97
|
+
// Strategy 1: Exact text match
|
|
98
|
+
match = tryExactMatch(item, signal);
|
|
99
|
+
if (match) {
|
|
100
|
+
return applySourceMultiplier(match);
|
|
101
|
+
}
|
|
102
|
+
// Strategy 2: Keyword overlap (Jaccard similarity)
|
|
103
|
+
match = tryKeywordMatch(item, signal);
|
|
104
|
+
if (match) {
|
|
105
|
+
return applySourceMultiplier(match);
|
|
106
|
+
}
|
|
107
|
+
// Strategy 3: Identifier match (CamelCase, file names)
|
|
108
|
+
match = tryIdentifierMatch(item, signal);
|
|
109
|
+
if (match) {
|
|
110
|
+
return applySourceMultiplier(match);
|
|
111
|
+
}
|
|
112
|
+
// Strategy 4: File path match
|
|
113
|
+
if (signal.filePath) {
|
|
114
|
+
match = tryFilePathMatch(item, signal);
|
|
115
|
+
if (match) {
|
|
116
|
+
return applySourceMultiplier(match);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
// Strategy 5: Substring match
|
|
120
|
+
match = trySubstringMatch(item, signal);
|
|
121
|
+
if (match) {
|
|
122
|
+
return applySourceMultiplier(match);
|
|
123
|
+
}
|
|
124
|
+
return null;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Apply source-based confidence multiplier to a match.
|
|
128
|
+
*/
|
|
129
|
+
function applySourceMultiplier(match) {
|
|
130
|
+
const multiplier = SOURCE_CONFIDENCE_MULTIPLIERS[match.signal.source] ?? 1.0;
|
|
131
|
+
return {
|
|
132
|
+
...match,
|
|
133
|
+
confidence: Math.min(1.0, match.confidence * multiplier),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Try exact text match (normalized).
|
|
138
|
+
*/
|
|
139
|
+
function tryExactMatch(item, signal) {
|
|
140
|
+
const normalizedItem = normalizeText(item.text);
|
|
141
|
+
const normalizedSignal = normalizeText(signal.text);
|
|
142
|
+
if (normalizedItem === normalizedSignal) {
|
|
143
|
+
return {
|
|
144
|
+
planItemId: item.id,
|
|
145
|
+
signal,
|
|
146
|
+
confidence: 1.0,
|
|
147
|
+
matchMethod: "exact_text",
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Try keyword overlap match using Jaccard similarity.
|
|
154
|
+
*/
|
|
155
|
+
function tryKeywordMatch(item, signal) {
|
|
156
|
+
const similarity = calculateSimilarity(item.text, signal.text);
|
|
157
|
+
if (similarity >= MIN_KEYWORD_SIMILARITY) {
|
|
158
|
+
// Map similarity (0.3-1.0) to confidence (0.5-0.9)
|
|
159
|
+
const confidence = 0.5 + (similarity - MIN_KEYWORD_SIMILARITY) * (0.4 / (1 - MIN_KEYWORD_SIMILARITY));
|
|
160
|
+
return {
|
|
161
|
+
planItemId: item.id,
|
|
162
|
+
signal,
|
|
163
|
+
confidence: Math.min(0.9, confidence),
|
|
164
|
+
matchMethod: "keyword_overlap",
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Try identifier match - match shared CamelCase names or file.ext names.
|
|
171
|
+
* Catches component names (PlanViewerView), file names (index.ts), etc.
|
|
172
|
+
*/
|
|
173
|
+
function tryIdentifierMatch(item, signal) {
|
|
174
|
+
const itemIdentifiers = extractIdentifiers(item.text);
|
|
175
|
+
const signalIdentifiers = extractIdentifiers(signal.text);
|
|
176
|
+
// Find shared identifiers
|
|
177
|
+
const shared = itemIdentifiers.filter((id) => signalIdentifiers.includes(id));
|
|
178
|
+
// Need at least one significant shared identifier
|
|
179
|
+
if (shared.length > 0 && shared.some((id) => id.length >= 5)) {
|
|
180
|
+
return {
|
|
181
|
+
planItemId: item.id,
|
|
182
|
+
signal,
|
|
183
|
+
confidence: 0.55,
|
|
184
|
+
matchMethod: "keyword_overlap", // Treat as keyword match type
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
return null;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Extract identifiers from text:
|
|
191
|
+
* - CamelCase names (PlanViewerView, App, Dashboard)
|
|
192
|
+
* - File names with extensions (index.ts, plan-parser.ts)
|
|
193
|
+
* - Hyphenated names (plan-parser, progress-matcher)
|
|
194
|
+
*/
|
|
195
|
+
function extractIdentifiers(text) {
|
|
196
|
+
const identifiers = [];
|
|
197
|
+
// CamelCase names (at least 2 capitals or one capital followed by lowercase)
|
|
198
|
+
const camelCaseMatches = text.match(/[A-Z][a-zA-Z0-9]+/g) || [];
|
|
199
|
+
identifiers.push(...camelCaseMatches.map((m) => m.toLowerCase()));
|
|
200
|
+
// File names with extensions
|
|
201
|
+
const fileMatches = text.match(/[\w-]+\.(ts|tsx|js|jsx|md|json)/g) || [];
|
|
202
|
+
for (const file of fileMatches) {
|
|
203
|
+
// Add both with and without extension
|
|
204
|
+
identifiers.push(file.toLowerCase());
|
|
205
|
+
identifiers.push(file.replace(/\.[^.]+$/, "").toLowerCase());
|
|
206
|
+
}
|
|
207
|
+
// Hyphenated names
|
|
208
|
+
const hyphenMatches = text.match(/[a-z]+-[a-z]+(-[a-z]+)*/gi) || [];
|
|
209
|
+
identifiers.push(...hyphenMatches.map((m) => m.toLowerCase()));
|
|
210
|
+
return [...new Set(identifiers)]; // Dedupe
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Try file path match - check if file basename appears in plan item text.
|
|
214
|
+
*/
|
|
215
|
+
function tryFilePathMatch(item, signal) {
|
|
216
|
+
if (!signal.filePath) {
|
|
217
|
+
return null;
|
|
218
|
+
}
|
|
219
|
+
// Extract the file basename
|
|
220
|
+
const basename = signal.filePath.split(/[/\\]/).pop() || "";
|
|
221
|
+
if (!basename) {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
// Remove extension for matching
|
|
225
|
+
const nameWithoutExt = basename.replace(/\.[^.]+$/, "");
|
|
226
|
+
const normalizedItem = normalizeText(item.text);
|
|
227
|
+
const normalizedBasename = normalizeText(nameWithoutExt);
|
|
228
|
+
// Check if the filename (without extension) appears in the item text
|
|
229
|
+
if (normalizedItem.includes(normalizedBasename) && normalizedBasename.length >= 3) {
|
|
230
|
+
return {
|
|
231
|
+
planItemId: item.id,
|
|
232
|
+
signal,
|
|
233
|
+
confidence: 0.6,
|
|
234
|
+
matchMethod: "file_path",
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
return null;
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Try substring match - check if core phrases from plan item are in signal.
|
|
241
|
+
*/
|
|
242
|
+
function trySubstringMatch(item, signal) {
|
|
243
|
+
const normalizedItem = normalizeText(item.text);
|
|
244
|
+
const normalizedSignal = normalizeText(signal.text);
|
|
245
|
+
// Extract significant phrases (3+ words) from the item
|
|
246
|
+
const words = normalizedItem.split(" ").filter((w) => w.length > 2);
|
|
247
|
+
if (words.length < 2) {
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
// Try matching consecutive word sequences
|
|
251
|
+
for (let len = Math.min(4, words.length); len >= 2; len--) {
|
|
252
|
+
for (let i = 0; i <= words.length - len; i++) {
|
|
253
|
+
const phrase = words.slice(i, i + len).join(" ");
|
|
254
|
+
if (phrase.length >= 8 && normalizedSignal.includes(phrase)) {
|
|
255
|
+
return {
|
|
256
|
+
planItemId: item.id,
|
|
257
|
+
signal,
|
|
258
|
+
confidence: 0.4,
|
|
259
|
+
matchMethod: "substring",
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return null;
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Determine the status of a plan item based on its match.
|
|
268
|
+
* Also considers checkboxes marked in the source markdown.
|
|
269
|
+
*/
|
|
270
|
+
export function determineItemStatus(item, match) {
|
|
271
|
+
// Checkboxes marked in source are always completed
|
|
272
|
+
if (item.isCheckedInSource) {
|
|
273
|
+
return "completed";
|
|
274
|
+
}
|
|
275
|
+
// No match means not started
|
|
276
|
+
if (!match) {
|
|
277
|
+
return "not_started";
|
|
278
|
+
}
|
|
279
|
+
// Use the signal's status
|
|
280
|
+
switch (match.signal.status) {
|
|
281
|
+
case "completed":
|
|
282
|
+
return "completed";
|
|
283
|
+
case "in_progress":
|
|
284
|
+
return "in_progress";
|
|
285
|
+
case "pending":
|
|
286
|
+
return "not_started";
|
|
287
|
+
default:
|
|
288
|
+
return "not_started";
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
/**
|
|
292
|
+
* Check if a plan item is considered trackable for progress.
|
|
293
|
+
*/
|
|
294
|
+
export function isTrackableForProgress(item) {
|
|
295
|
+
return item.type !== "heading";
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=progress-matcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progress-matcher.js","sourceRoot":"","sources":["../../src/plan/progress-matcher.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Task Extractor
|
|
3
|
+
*
|
|
4
|
+
* Extracts task signals from parsed JSONL entries.
|
|
5
|
+
* Handles:
|
|
6
|
+
* - TaskCreate, TaskUpdate, TaskList tool calls
|
|
7
|
+
* - TodoWrite tool calls (legacy)
|
|
8
|
+
* - agent_progress entries (subagent work)
|
|
9
|
+
* - bash_progress entries (command execution)
|
|
10
|
+
* - File heuristics (fallback)
|
|
11
|
+
*/
|
|
12
|
+
import type { ParsedEntry } from "../session/parser.js";
|
|
13
|
+
import type { TaskSignal } from "./types.js";
|
|
14
|
+
/**
|
|
15
|
+
* Extract task signals from parsed JSONL entries.
|
|
16
|
+
*
|
|
17
|
+
* Handles multiple signal sources:
|
|
18
|
+
* 1. TaskCreate/TaskUpdate (current) - Build task state map, emit final states
|
|
19
|
+
* 2. TaskList (current) - Parse task list snapshots for state
|
|
20
|
+
* 3. TodoWrite (legacy) - Extract todos[] array
|
|
21
|
+
* 4. agent_progress - Subagent completion signals
|
|
22
|
+
* 5. bash_progress - Command execution with test/build keywords
|
|
23
|
+
* 6. File heuristic (fallback) - Write/Edit file paths as completed signals
|
|
24
|
+
*/
|
|
25
|
+
export declare function extractTaskSignals(entries: ParsedEntry[], sessionId: string): TaskSignal[];
|
|
26
|
+
/**
|
|
27
|
+
* Get all unique file paths modified in the session.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getModifiedFiles(entries: ParsedEntry[]): string[];
|
|
30
|
+
//# sourceMappingURL=task-extractor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-extractor.d.ts","sourceRoot":"","sources":["../../src/plan/task-extractor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAa7C;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,WAAW,EAAE,EACtB,SAAS,EAAE,MAAM,GAChB,UAAU,EAAE,CA6Id;AAmVD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,EAAE,CAoBjE"}
|