@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.
Files changed (341) hide show
  1. package/dist/archive/archive-store.d.ts +166 -0
  2. package/dist/archive/archive-store.d.ts.map +1 -0
  3. package/dist/archive/archive-store.js +612 -0
  4. package/dist/archive/archive-store.js.map +1 -0
  5. package/dist/archive/bulk-archive.d.ts +63 -0
  6. package/dist/archive/bulk-archive.d.ts.map +1 -0
  7. package/dist/archive/bulk-archive.js +315 -0
  8. package/dist/archive/bulk-archive.js.map +1 -0
  9. package/dist/archive/filename-utils.d.ts +39 -0
  10. package/dist/archive/filename-utils.d.ts.map +1 -0
  11. package/dist/archive/filename-utils.js +78 -0
  12. package/dist/archive/filename-utils.js.map +1 -0
  13. package/dist/archive/index.d.ts +21 -0
  14. package/dist/archive/index.d.ts.map +1 -0
  15. package/dist/archive/index.js +45 -0
  16. package/dist/archive/index.js.map +1 -0
  17. package/dist/archive/manifest-extractor.d.ts +40 -0
  18. package/dist/archive/manifest-extractor.d.ts.map +1 -0
  19. package/dist/archive/manifest-extractor.js +456 -0
  20. package/dist/archive/manifest-extractor.js.map +1 -0
  21. package/dist/archive/migration.d.ts +59 -0
  22. package/dist/archive/migration.d.ts.map +1 -0
  23. package/dist/archive/migration.js +172 -0
  24. package/dist/archive/migration.js.map +1 -0
  25. package/dist/archive/plan-cataloger.d.ts +24 -0
  26. package/dist/archive/plan-cataloger.d.ts.map +1 -0
  27. package/dist/archive/plan-cataloger.js +100 -0
  28. package/dist/archive/plan-cataloger.js.map +1 -0
  29. package/dist/archive/plan-extractor.d.ts +84 -0
  30. package/dist/archive/plan-extractor.d.ts.map +1 -0
  31. package/dist/archive/plan-extractor.js +371 -0
  32. package/dist/archive/plan-extractor.js.map +1 -0
  33. package/dist/archive/search-indexer.d.ts +50 -0
  34. package/dist/archive/search-indexer.d.ts.map +1 -0
  35. package/dist/archive/search-indexer.js +294 -0
  36. package/dist/archive/search-indexer.js.map +1 -0
  37. package/dist/archive/subagent-store.d.ts +113 -0
  38. package/dist/archive/subagent-store.d.ts.map +1 -0
  39. package/dist/archive/subagent-store.js +173 -0
  40. package/dist/archive/subagent-store.js.map +1 -0
  41. package/dist/archive/types.d.ts +236 -0
  42. package/dist/archive/types.d.ts.map +1 -0
  43. package/dist/archive/types.js +30 -0
  44. package/dist/archive/types.js.map +1 -0
  45. package/dist/branding.d.ts +9 -0
  46. package/dist/branding.d.ts.map +1 -0
  47. package/dist/branding.js +50 -0
  48. package/dist/branding.js.map +1 -0
  49. package/dist/cache/git-utils.d.ts +36 -0
  50. package/dist/cache/git-utils.d.ts.map +1 -0
  51. package/dist/cache/git-utils.js +160 -0
  52. package/dist/cache/git-utils.js.map +1 -0
  53. package/dist/cache/hidden-projects.d.ts +19 -0
  54. package/dist/cache/hidden-projects.d.ts.map +1 -0
  55. package/dist/cache/hidden-projects.js +48 -0
  56. package/dist/cache/hidden-projects.js.map +1 -0
  57. package/dist/cache/index.d.ts +15 -0
  58. package/dist/cache/index.d.ts.map +1 -0
  59. package/dist/cache/index.js +20 -0
  60. package/dist/cache/index.js.map +1 -0
  61. package/dist/cache/metadata-extractor.d.ts +62 -0
  62. package/dist/cache/metadata-extractor.d.ts.map +1 -0
  63. package/dist/cache/metadata-extractor.js +574 -0
  64. package/dist/cache/metadata-extractor.js.map +1 -0
  65. package/dist/cache/mode-detector.d.ts +19 -0
  66. package/dist/cache/mode-detector.d.ts.map +1 -0
  67. package/dist/cache/mode-detector.js +161 -0
  68. package/dist/cache/mode-detector.js.map +1 -0
  69. package/dist/cache/persistence.d.ts +39 -0
  70. package/dist/cache/persistence.d.ts.map +1 -0
  71. package/dist/cache/persistence.js +98 -0
  72. package/dist/cache/persistence.js.map +1 -0
  73. package/dist/cache/project-discovery.d.ts +41 -0
  74. package/dist/cache/project-discovery.d.ts.map +1 -0
  75. package/dist/cache/project-discovery.js +212 -0
  76. package/dist/cache/project-discovery.js.map +1 -0
  77. package/dist/cache/session-index.d.ts +258 -0
  78. package/dist/cache/session-index.d.ts.map +1 -0
  79. package/dist/cache/session-index.js +1030 -0
  80. package/dist/cache/session-index.js.map +1 -0
  81. package/dist/cache/types.d.ts +159 -0
  82. package/dist/cache/types.d.ts.map +1 -0
  83. package/dist/cache/types.js +29 -0
  84. package/dist/cache/types.js.map +1 -0
  85. package/dist/catalog/bulk-extractor.d.ts +18 -0
  86. package/dist/catalog/bulk-extractor.d.ts.map +1 -0
  87. package/dist/catalog/bulk-extractor.js +150 -0
  88. package/dist/catalog/bulk-extractor.js.map +1 -0
  89. package/dist/catalog/extractor.d.ts +53 -0
  90. package/dist/catalog/extractor.d.ts.map +1 -0
  91. package/dist/catalog/extractor.js +522 -0
  92. package/dist/catalog/extractor.js.map +1 -0
  93. package/dist/catalog/index.d.ts +10 -0
  94. package/dist/catalog/index.d.ts.map +1 -0
  95. package/dist/catalog/index.js +11 -0
  96. package/dist/catalog/index.js.map +1 -0
  97. package/dist/catalog/types.d.ts +134 -0
  98. package/dist/catalog/types.d.ts.map +1 -0
  99. package/dist/catalog/types.js +8 -0
  100. package/dist/catalog/types.js.map +1 -0
  101. package/dist/client/index.d.ts +6 -0
  102. package/dist/client/index.d.ts.map +1 -0
  103. package/dist/client/index.js +5 -0
  104. package/dist/client/index.js.map +1 -0
  105. package/dist/client/websocket-client.d.ts +96 -0
  106. package/dist/client/websocket-client.d.ts.map +1 -0
  107. package/dist/client/websocket-client.js +222 -0
  108. package/dist/client/websocket-client.js.map +1 -0
  109. package/dist/context/index.d.ts +13 -0
  110. package/dist/context/index.d.ts.map +1 -0
  111. package/dist/context/index.js +26 -0
  112. package/dist/context/index.js.map +1 -0
  113. package/dist/context/indexer.d.ts +73 -0
  114. package/dist/context/indexer.d.ts.map +1 -0
  115. package/dist/context/indexer.js +233 -0
  116. package/dist/context/indexer.js.map +1 -0
  117. package/dist/context/manager.d.ts +66 -0
  118. package/dist/context/manager.d.ts.map +1 -0
  119. package/dist/context/manager.js +310 -0
  120. package/dist/context/manager.js.map +1 -0
  121. package/dist/context/types.d.ts +149 -0
  122. package/dist/context/types.d.ts.map +1 -0
  123. package/dist/context/types.js +36 -0
  124. package/dist/context/types.js.map +1 -0
  125. package/dist/handoff/catalog.d.ts +54 -0
  126. package/dist/handoff/catalog.d.ts.map +1 -0
  127. package/dist/handoff/catalog.js +121 -0
  128. package/dist/handoff/catalog.js.map +1 -0
  129. package/dist/handoff/generator.d.ts +107 -0
  130. package/dist/handoff/generator.d.ts.map +1 -0
  131. package/dist/handoff/generator.js +603 -0
  132. package/dist/handoff/generator.js.map +1 -0
  133. package/dist/handoff/index.d.ts +13 -0
  134. package/dist/handoff/index.d.ts.map +1 -0
  135. package/dist/handoff/index.js +12 -0
  136. package/dist/handoff/index.js.map +1 -0
  137. package/dist/handoff/llm-generator.d.ts +77 -0
  138. package/dist/handoff/llm-generator.d.ts.map +1 -0
  139. package/dist/handoff/llm-generator.js +513 -0
  140. package/dist/handoff/llm-generator.js.map +1 -0
  141. package/dist/handoff/prompts.d.ts +18 -0
  142. package/dist/handoff/prompts.d.ts.map +1 -0
  143. package/dist/handoff/prompts.js +22 -0
  144. package/dist/handoff/prompts.js.map +1 -0
  145. package/dist/handoff/types.d.ts +28 -0
  146. package/dist/handoff/types.d.ts.map +1 -0
  147. package/dist/handoff/types.js +7 -0
  148. package/dist/handoff/types.js.map +1 -0
  149. package/dist/index.d.ts +56 -0
  150. package/dist/index.d.ts.map +1 -0
  151. package/dist/index.js +132 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/logging/claude-operations.d.ts +111 -0
  154. package/dist/logging/claude-operations.d.ts.map +1 -0
  155. package/dist/logging/claude-operations.js +132 -0
  156. package/dist/logging/claude-operations.js.map +1 -0
  157. package/dist/logging/error-utils.d.ts +18 -0
  158. package/dist/logging/error-utils.d.ts.map +1 -0
  159. package/dist/logging/error-utils.js +37 -0
  160. package/dist/logging/error-utils.js.map +1 -0
  161. package/dist/logging/index.d.ts +11 -0
  162. package/dist/logging/index.d.ts.map +1 -0
  163. package/dist/logging/index.js +10 -0
  164. package/dist/logging/index.js.map +1 -0
  165. package/dist/logging/logger.d.ts +25 -0
  166. package/dist/logging/logger.d.ts.map +1 -0
  167. package/dist/logging/logger.js +39 -0
  168. package/dist/logging/logger.js.map +1 -0
  169. package/dist/notifications/constants.d.ts +16 -0
  170. package/dist/notifications/constants.d.ts.map +1 -0
  171. package/dist/notifications/constants.js +49 -0
  172. package/dist/notifications/constants.js.map +1 -0
  173. package/dist/notifications/index.d.ts +9 -0
  174. package/dist/notifications/index.d.ts.map +1 -0
  175. package/dist/notifications/index.js +8 -0
  176. package/dist/notifications/index.js.map +1 -0
  177. package/dist/notifications/types.d.ts +28 -0
  178. package/dist/notifications/types.d.ts.map +1 -0
  179. package/dist/notifications/types.js +7 -0
  180. package/dist/notifications/types.js.map +1 -0
  181. package/dist/notifications/utils.d.ts +20 -0
  182. package/dist/notifications/utils.d.ts.map +1 -0
  183. package/dist/notifications/utils.js +37 -0
  184. package/dist/notifications/utils.js.map +1 -0
  185. package/dist/plan/index.d.ts +12 -0
  186. package/dist/plan/index.d.ts.map +1 -0
  187. package/dist/plan/index.js +15 -0
  188. package/dist/plan/index.js.map +1 -0
  189. package/dist/plan/plan-parser.d.ts +33 -0
  190. package/dist/plan/plan-parser.d.ts.map +1 -0
  191. package/dist/plan/plan-parser.js +189 -0
  192. package/dist/plan/plan-parser.js.map +1 -0
  193. package/dist/plan/progress-computer.d.ts +34 -0
  194. package/dist/plan/progress-computer.d.ts.map +1 -0
  195. package/dist/plan/progress-computer.js +211 -0
  196. package/dist/plan/progress-computer.js.map +1 -0
  197. package/dist/plan/progress-matcher.d.ts +34 -0
  198. package/dist/plan/progress-matcher.d.ts.map +1 -0
  199. package/dist/plan/progress-matcher.js +297 -0
  200. package/dist/plan/progress-matcher.js.map +1 -0
  201. package/dist/plan/task-extractor.d.ts +30 -0
  202. package/dist/plan/task-extractor.d.ts.map +1 -0
  203. package/dist/plan/task-extractor.js +435 -0
  204. package/dist/plan/task-extractor.js.map +1 -0
  205. package/dist/plan/types.d.ts +131 -0
  206. package/dist/plan/types.d.ts.map +1 -0
  207. package/dist/plan/types.js +8 -0
  208. package/dist/plan/types.js.map +1 -0
  209. package/dist/project/aggregator.d.ts +43 -0
  210. package/dist/project/aggregator.d.ts.map +1 -0
  211. package/dist/project/aggregator.js +218 -0
  212. package/dist/project/aggregator.js.map +1 -0
  213. package/dist/project/index.d.ts +9 -0
  214. package/dist/project/index.d.ts.map +1 -0
  215. package/dist/project/index.js +9 -0
  216. package/dist/project/index.js.map +1 -0
  217. package/dist/project/types.d.ts +65 -0
  218. package/dist/project/types.d.ts.map +1 -0
  219. package/dist/project/types.js +27 -0
  220. package/dist/project/types.js.map +1 -0
  221. package/dist/session/detector.d.ts +113 -0
  222. package/dist/session/detector.d.ts.map +1 -0
  223. package/dist/session/detector.js +333 -0
  224. package/dist/session/detector.js.map +1 -0
  225. package/dist/session/filters.d.ts +32 -0
  226. package/dist/session/filters.d.ts.map +1 -0
  227. package/dist/session/filters.js +100 -0
  228. package/dist/session/filters.js.map +1 -0
  229. package/dist/session/format-title.d.ts +16 -0
  230. package/dist/session/format-title.d.ts.map +1 -0
  231. package/dist/session/format-title.js +54 -0
  232. package/dist/session/format-title.js.map +1 -0
  233. package/dist/session/index.d.ts +16 -0
  234. package/dist/session/index.d.ts.map +1 -0
  235. package/dist/session/index.js +10 -0
  236. package/dist/session/index.js.map +1 -0
  237. package/dist/session/parser.d.ts +264 -0
  238. package/dist/session/parser.d.ts.map +1 -0
  239. package/dist/session/parser.js +588 -0
  240. package/dist/session/parser.js.map +1 -0
  241. package/dist/session/token-estimator.d.ts +32 -0
  242. package/dist/session/token-estimator.d.ts.map +1 -0
  243. package/dist/session/token-estimator.js +139 -0
  244. package/dist/session/token-estimator.js.map +1 -0
  245. package/dist/session/transformer.d.ts +126 -0
  246. package/dist/session/transformer.d.ts.map +1 -0
  247. package/dist/session/transformer.js +158 -0
  248. package/dist/session/transformer.js.map +1 -0
  249. package/dist/setup/hooks-config.d.ts +35 -0
  250. package/dist/setup/hooks-config.d.ts.map +1 -0
  251. package/dist/setup/hooks-config.js +107 -0
  252. package/dist/setup/hooks-config.js.map +1 -0
  253. package/dist/setup/hooks-symlink.d.ts +17 -0
  254. package/dist/setup/hooks-symlink.d.ts.map +1 -0
  255. package/dist/setup/hooks-symlink.js +89 -0
  256. package/dist/setup/hooks-symlink.js.map +1 -0
  257. package/dist/setup/index.d.ts +13 -0
  258. package/dist/setup/index.d.ts.map +1 -0
  259. package/dist/setup/index.js +12 -0
  260. package/dist/setup/index.js.map +1 -0
  261. package/dist/setup/prerequisites.d.ts +11 -0
  262. package/dist/setup/prerequisites.d.ts.map +1 -0
  263. package/dist/setup/prerequisites.js +72 -0
  264. package/dist/setup/prerequisites.js.map +1 -0
  265. package/dist/setup/settings-merge.d.ts +33 -0
  266. package/dist/setup/settings-merge.d.ts.map +1 -0
  267. package/dist/setup/settings-merge.js +131 -0
  268. package/dist/setup/settings-merge.js.map +1 -0
  269. package/dist/setup/skills-install.d.ts +17 -0
  270. package/dist/setup/skills-install.d.ts.map +1 -0
  271. package/dist/setup/skills-install.js +60 -0
  272. package/dist/setup/skills-install.js.map +1 -0
  273. package/dist/setup/types.d.ts +39 -0
  274. package/dist/setup/types.d.ts.map +1 -0
  275. package/dist/setup/types.js +7 -0
  276. package/dist/setup/types.js.map +1 -0
  277. package/dist/setup/verification.d.ts +9 -0
  278. package/dist/setup/verification.d.ts.map +1 -0
  279. package/dist/setup/verification.js +91 -0
  280. package/dist/setup/verification.js.map +1 -0
  281. package/dist/shortcuts/index.d.ts +8 -0
  282. package/dist/shortcuts/index.d.ts.map +1 -0
  283. package/dist/shortcuts/index.js +6 -0
  284. package/dist/shortcuts/index.js.map +1 -0
  285. package/dist/shortcuts/key-utils.d.ts +54 -0
  286. package/dist/shortcuts/key-utils.d.ts.map +1 -0
  287. package/dist/shortcuts/key-utils.js +129 -0
  288. package/dist/shortcuts/key-utils.js.map +1 -0
  289. package/dist/shortcuts/shortcut-registry.d.ts +37 -0
  290. package/dist/shortcuts/shortcut-registry.d.ts.map +1 -0
  291. package/dist/shortcuts/shortcut-registry.js +322 -0
  292. package/dist/shortcuts/shortcut-registry.js.map +1 -0
  293. package/dist/sources/config.d.ts +91 -0
  294. package/dist/sources/config.d.ts.map +1 -0
  295. package/dist/sources/config.js +229 -0
  296. package/dist/sources/config.js.map +1 -0
  297. package/dist/sources/googledocs.d.ts +43 -0
  298. package/dist/sources/googledocs.d.ts.map +1 -0
  299. package/dist/sources/googledocs.js +298 -0
  300. package/dist/sources/googledocs.js.map +1 -0
  301. package/dist/sources/index.d.ts +14 -0
  302. package/dist/sources/index.d.ts.map +1 -0
  303. package/dist/sources/index.js +19 -0
  304. package/dist/sources/index.js.map +1 -0
  305. package/dist/sources/notion.d.ts +35 -0
  306. package/dist/sources/notion.d.ts.map +1 -0
  307. package/dist/sources/notion.js +352 -0
  308. package/dist/sources/notion.js.map +1 -0
  309. package/dist/sources/obsidian.d.ts +38 -0
  310. package/dist/sources/obsidian.d.ts.map +1 -0
  311. package/dist/sources/obsidian.js +228 -0
  312. package/dist/sources/obsidian.js.map +1 -0
  313. package/dist/sources/types.d.ts +133 -0
  314. package/dist/sources/types.d.ts.map +1 -0
  315. package/dist/sources/types.js +19 -0
  316. package/dist/sources/types.js.map +1 -0
  317. package/dist/storage/index.d.ts +6 -0
  318. package/dist/storage/index.d.ts.map +1 -0
  319. package/dist/storage/index.js +5 -0
  320. package/dist/storage/index.js.map +1 -0
  321. package/dist/storage/writer.d.ts +86 -0
  322. package/dist/storage/writer.d.ts.map +1 -0
  323. package/dist/storage/writer.js +137 -0
  324. package/dist/storage/writer.js.map +1 -0
  325. package/dist/types.d.ts +203 -0
  326. package/dist/types.d.ts.map +1 -0
  327. package/dist/types.js +8 -0
  328. package/dist/types.js.map +1 -0
  329. package/dist/utils/claude-token.d.ts +49 -0
  330. package/dist/utils/claude-token.d.ts.map +1 -0
  331. package/dist/utils/claude-token.js +169 -0
  332. package/dist/utils/claude-token.js.map +1 -0
  333. package/dist/utils/index.d.ts +7 -0
  334. package/dist/utils/index.d.ts.map +1 -0
  335. package/dist/utils/index.js +13 -0
  336. package/dist/utils/index.js.map +1 -0
  337. package/dist/utils/settings.d.ts +100 -0
  338. package/dist/utils/settings.d.ts.map +1 -0
  339. package/dist/utils/settings.js +206 -0
  340. package/dist/utils/settings.js.map +1 -0
  341. 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":"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"}
@@ -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"}