@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,172 @@
1
+ /**
2
+ * Migration Module
3
+ *
4
+ * Handles migrations for the archive system, including adding projectId
5
+ * to existing manifests that only have projectSlug.
6
+ */
7
+ import * as path from "path";
8
+ import { listManifests, readManifest, saveManifest, writeGlobalIndex, } from "./archive-store.js";
9
+ import { addToIndex } from "./search-indexer.js";
10
+ import { getDefaultSearchIndex } from "./types.js";
11
+ import { decodeProjectPath } from "../session/detector.js";
12
+ /**
13
+ * Migrate existing manifests to include projectId.
14
+ *
15
+ * For manifests that have projectPath but no projectId, generates
16
+ * projectId from the full path using dash-encoding pattern.
17
+ *
18
+ * Also rebuilds the search index to use projectId as keys.
19
+ */
20
+ export async function migrateToProjectId() {
21
+ const result = {
22
+ updated: 0,
23
+ skipped: 0,
24
+ errors: [],
25
+ };
26
+ try {
27
+ // 1. Get all manifest IDs
28
+ const manifestIds = await listManifests();
29
+ // 2. Migrate each manifest
30
+ const migratedManifests = [];
31
+ for (const id of manifestIds) {
32
+ try {
33
+ const manifest = await readManifest(id);
34
+ if (!manifest) {
35
+ result.errors.push(`Could not read manifest: ${id}`);
36
+ continue;
37
+ }
38
+ // Check if migration is needed
39
+ if (manifest.projectId) {
40
+ result.skipped++;
41
+ migratedManifests.push(manifest);
42
+ continue;
43
+ }
44
+ // Generate projectId from projectPath
45
+ if (manifest.projectPath) {
46
+ manifest.projectId = manifest.projectPath.replace(/\//g, "-");
47
+ await saveManifest(manifest);
48
+ result.updated++;
49
+ migratedManifests.push(manifest);
50
+ }
51
+ else {
52
+ // Fallback: use projectSlug if no projectPath (shouldn't happen)
53
+ manifest.projectId = manifest.projectSlug;
54
+ await saveManifest(manifest);
55
+ result.updated++;
56
+ migratedManifests.push(manifest);
57
+ result.errors.push(`Manifest ${id} has no projectPath, used projectSlug as fallback`);
58
+ }
59
+ }
60
+ catch (err) {
61
+ result.errors.push(`Failed to migrate manifest ${id}: ${err instanceof Error ? err.message : String(err)}`);
62
+ }
63
+ }
64
+ // 3. Rebuild the search index with new projectId keys
65
+ const newIndex = getDefaultSearchIndex();
66
+ for (const manifest of migratedManifests) {
67
+ addToIndex(newIndex, manifest);
68
+ }
69
+ await writeGlobalIndex(newIndex);
70
+ }
71
+ catch (err) {
72
+ result.errors.push(`Migration failed: ${err instanceof Error ? err.message : String(err)}`);
73
+ }
74
+ return result;
75
+ }
76
+ /**
77
+ * Check if migration is needed.
78
+ * Returns true if any manifests are missing projectId.
79
+ */
80
+ export async function isMigrationNeeded() {
81
+ try {
82
+ const manifestIds = await listManifests();
83
+ // Check a sample of manifests (first 10)
84
+ const sampleIds = manifestIds.slice(0, 10);
85
+ for (const id of sampleIds) {
86
+ const manifest = await readManifest(id);
87
+ if (manifest && !manifest.projectId) {
88
+ return true;
89
+ }
90
+ }
91
+ return false;
92
+ }
93
+ catch {
94
+ return false;
95
+ }
96
+ }
97
+ /**
98
+ * Get migration status (how many manifests need migration).
99
+ */
100
+ export async function getMigrationStatus() {
101
+ const manifestIds = await listManifests();
102
+ let needsMigration = 0;
103
+ let alreadyMigrated = 0;
104
+ for (const id of manifestIds) {
105
+ const manifest = await readManifest(id);
106
+ if (manifest) {
107
+ if (manifest.projectId) {
108
+ alreadyMigrated++;
109
+ }
110
+ else {
111
+ needsMigration++;
112
+ }
113
+ }
114
+ }
115
+ return {
116
+ total: manifestIds.length,
117
+ needsMigration,
118
+ alreadyMigrated,
119
+ };
120
+ }
121
+ /**
122
+ * Migrate manifest project paths using the fixed decodeProjectPath().
123
+ *
124
+ * Re-decodes each manifest's projectId (which is the encoded dir name)
125
+ * to get the correct projectPath and projectSlug using sessions-index.json.
126
+ * Updates manifests where the decoded values differ from what's stored.
127
+ */
128
+ export async function migrateProjectPaths() {
129
+ const result = {
130
+ updated: 0,
131
+ skipped: 0,
132
+ errors: [],
133
+ };
134
+ try {
135
+ const manifestIds = await listManifests();
136
+ for (const id of manifestIds) {
137
+ try {
138
+ const manifest = await readManifest(id);
139
+ if (!manifest) {
140
+ result.errors.push(`Could not read manifest: ${id}`);
141
+ continue;
142
+ }
143
+ // Use projectId (encoded path) to re-decode
144
+ const encodedDir = manifest.projectId || manifest.projectPath?.replace(/\//g, "-");
145
+ if (!encodedDir) {
146
+ result.errors.push(`Manifest ${id} has no projectId or projectPath`);
147
+ continue;
148
+ }
149
+ const correctPath = await decodeProjectPath(encodedDir);
150
+ const correctSlug = path.basename(correctPath);
151
+ // Check if update is needed
152
+ if (manifest.projectPath === correctPath && manifest.projectSlug === correctSlug) {
153
+ result.skipped++;
154
+ continue;
155
+ }
156
+ // Update the manifest
157
+ manifest.projectPath = correctPath;
158
+ manifest.projectSlug = correctSlug;
159
+ await saveManifest(manifest);
160
+ result.updated++;
161
+ }
162
+ catch (err) {
163
+ result.errors.push(`Failed to migrate manifest ${id}: ${err instanceof Error ? err.message : String(err)}`);
164
+ }
165
+ }
166
+ }
167
+ catch (err) {
168
+ result.errors.push(`Migration failed: ${err instanceof Error ? err.message : String(err)}`);
169
+ }
170
+ return result;
171
+ }
172
+ //# sourceMappingURL=migration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.js","sourceRoot":"","sources":["../../src/archive/migration.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Plan Cataloger
3
+ *
4
+ * Ensures plan content is cataloged in .jacques/index.json with content-based dedup.
5
+ * This is the single entry point for adding plans to the catalog regardless of source
6
+ * (embedded, written, or agent-generated).
7
+ */
8
+ import type { PlanEntry } from "../context/types.js";
9
+ export interface CatalogPlanInput {
10
+ title: string;
11
+ content: string;
12
+ sessionId: string;
13
+ }
14
+ /**
15
+ * Catalog a plan in the project index.
16
+ *
17
+ * Takes plan content and ensures it exists in .jacques/index.json:
18
+ * 1. Normalize content → SHA-256 hash (full content + body only)
19
+ * 2. Check for existing entry with same contentHash or bodyHash
20
+ * 3. If exists: merge sessionId into sessions[], return existing entry
21
+ * 4. If new: write .md file, add to index, return new entry
22
+ */
23
+ export declare function catalogPlan(projectPath: string, input: CatalogPlanInput): Promise<PlanEntry>;
24
+ //# sourceMappingURL=plan-cataloger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-cataloger.d.ts","sourceRoot":"","sources":["../../src/archive/plan-cataloger.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AASrD,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,SAAS,CAAC,CA0FpB"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Plan Cataloger
3
+ *
4
+ * Ensures plan content is cataloged in .jacques/index.json with content-based dedup.
5
+ * This is the single entry point for adding plans to the catalog regardless of source
6
+ * (embedded, written, or agent-generated).
7
+ */
8
+ import { promises as fs } from "fs";
9
+ import { join } from "path";
10
+ import { readProjectIndex, addPlanToIndex } from "../context/indexer.js";
11
+ import { generatePlanFingerprint, extractPlanTitle, findDuplicatePlan, } from "./plan-extractor.js";
12
+ import { generatePlanFilename, generateVersionedFilename } from "./filename-utils.js";
13
+ /**
14
+ * Catalog a plan in the project index.
15
+ *
16
+ * Takes plan content and ensures it exists in .jacques/index.json:
17
+ * 1. Normalize content → SHA-256 hash (full content + body only)
18
+ * 2. Check for existing entry with same contentHash or bodyHash
19
+ * 3. If exists: merge sessionId into sessions[], return existing entry
20
+ * 4. If new: write .md file, add to index, return new entry
21
+ */
22
+ export async function catalogPlan(projectPath, input) {
23
+ const { content, sessionId } = input;
24
+ const fingerprint = generatePlanFingerprint(content);
25
+ const now = new Date().toISOString();
26
+ // Check for existing plan with same content hash in index
27
+ const index = await readProjectIndex(projectPath);
28
+ const existingByContentHash = index.plans.find((p) => p.contentHash === fingerprint.contentHash);
29
+ if (existingByContentHash) {
30
+ // Content-hash match: merge session, update timestamp, backfill bodyHash if missing
31
+ const updatedPlan = {
32
+ ...existingByContentHash,
33
+ bodyHash: existingByContentHash.bodyHash || fingerprint.bodyHash,
34
+ updatedAt: now,
35
+ sessions: [...new Set([...existingByContentHash.sessions, sessionId])],
36
+ };
37
+ await addPlanToIndex(projectPath, updatedPlan);
38
+ return updatedPlan;
39
+ }
40
+ // Check for existing plan with same body hash (different title, same body)
41
+ const existingByBodyHash = index.plans.find((p) => p.bodyHash === fingerprint.bodyHash);
42
+ if (existingByBodyHash) {
43
+ // Body-hash match: merge session, update hashes, update timestamp
44
+ const updatedPlan = {
45
+ ...existingByBodyHash,
46
+ contentHash: existingByBodyHash.contentHash || fingerprint.contentHash,
47
+ bodyHash: fingerprint.bodyHash,
48
+ updatedAt: now,
49
+ sessions: [...new Set([...existingByBodyHash.sessions, sessionId])],
50
+ };
51
+ await addPlanToIndex(projectPath, updatedPlan);
52
+ return updatedPlan;
53
+ }
54
+ // Also check fuzzy duplicate (high similarity, no title gate)
55
+ const duplicate = await findDuplicatePlan(content, projectPath);
56
+ if (duplicate) {
57
+ // Fuzzy match: merge session, add hashes, update timestamp
58
+ const updatedPlan = {
59
+ ...duplicate,
60
+ contentHash: duplicate.contentHash || fingerprint.contentHash,
61
+ bodyHash: duplicate.bodyHash || fingerprint.bodyHash,
62
+ updatedAt: now,
63
+ sessions: [...new Set([...duplicate.sessions, sessionId])],
64
+ };
65
+ await addPlanToIndex(projectPath, updatedPlan);
66
+ return updatedPlan;
67
+ }
68
+ // New plan: write file and add to index
69
+ const title = input.title || extractPlanTitle(content);
70
+ let filename = generatePlanFilename(title);
71
+ const plansDir = join(projectPath, ".jacques", "plans");
72
+ await fs.mkdir(plansDir, { recursive: true });
73
+ // Check for filename collision
74
+ try {
75
+ await fs.access(join(plansDir, filename));
76
+ // File exists with different content, create versioned filename
77
+ filename = await generateVersionedFilename(plansDir, filename);
78
+ }
79
+ catch {
80
+ // File doesn't exist, use as-is
81
+ }
82
+ // Write the plan file
83
+ const planPath = join(plansDir, filename);
84
+ await fs.writeFile(planPath, content, "utf-8");
85
+ // Create and save the catalog entry with both hashes
86
+ const planEntry = {
87
+ id: filename.replace(".md", ""),
88
+ title,
89
+ filename,
90
+ path: `plans/${filename}`,
91
+ contentHash: fingerprint.contentHash,
92
+ bodyHash: fingerprint.bodyHash,
93
+ createdAt: now,
94
+ updatedAt: now,
95
+ sessions: [sessionId],
96
+ };
97
+ await addPlanToIndex(projectPath, planEntry);
98
+ return planEntry;
99
+ }
100
+ //# sourceMappingURL=plan-cataloger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-cataloger.js","sourceRoot":"","sources":["../../src/archive/plan-cataloger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * Plan Extractor
3
+ *
4
+ * Detects and extracts embedded plans from user messages in sessions.
5
+ * Plans are often embedded when starting from plan mode with "Implement the following plan:".
6
+ */
7
+ import type { ParsedEntry } from "../session/parser.js";
8
+ import type { PlanReference } from "./types.js";
9
+ import type { PlanEntry } from "../context/types.js";
10
+ /** Patterns that indicate an embedded plan */
11
+ export declare const PLAN_TRIGGER_PATTERNS: RegExp[];
12
+ /**
13
+ * Detected plan with metadata
14
+ */
15
+ export interface DetectedPlan {
16
+ planContent: string;
17
+ messageIndex: number;
18
+ planIndex: number;
19
+ triggeredBy: string;
20
+ }
21
+ /**
22
+ * Plan fingerprint for deduplication
23
+ */
24
+ export interface PlanFingerprint {
25
+ contentHash: string;
26
+ bodyHash: string;
27
+ titleNormalized: string;
28
+ lengthRange: string;
29
+ }
30
+ /**
31
+ * Detect embedded plans in session entries.
32
+ * Checks all user messages for plan trigger patterns.
33
+ */
34
+ export declare function detectEmbeddedPlans(entries: ParsedEntry[]): DetectedPlan[];
35
+ /**
36
+ * Split content that contains multiple plans by top-level headings.
37
+ */
38
+ export declare function splitMultiplePlans(content: string): string[];
39
+ /**
40
+ * Extract title from plan content.
41
+ * Prefers first markdown heading, falls back to first line.
42
+ */
43
+ export declare function extractPlanTitle(content: string): string;
44
+ /**
45
+ * Extract plan body (content without the title heading).
46
+ * Strips the first markdown heading line and returns the rest.
47
+ */
48
+ export declare function extractPlanBody(content: string): string;
49
+ /**
50
+ * Generate a hash of the plan body only (excludes title).
51
+ * Used for detecting duplicates with different titles but same content.
52
+ */
53
+ export declare function generateBodyHash(content: string): string;
54
+ /**
55
+ * Generate a plan fingerprint for deduplication.
56
+ * Normalizes content to ignore whitespace differences.
57
+ */
58
+ export declare function generatePlanFingerprint(content: string): PlanFingerprint;
59
+ /**
60
+ * Calculate text similarity using simple word overlap (Jaccard similarity).
61
+ * Returns a score between 0 (no overlap) and 1 (identical).
62
+ */
63
+ export declare function calculateSimilarity(text1: string, text2: string): number;
64
+ /**
65
+ * Find a duplicate plan in the existing catalog.
66
+ * Uses a two-tier approach:
67
+ * 1. Exact contentHash match (full content identical)
68
+ * 2. Exact bodyHash match (same body, different title)
69
+ * 3. Fuzzy similarity >= 75% within same length range (no title gate)
70
+ *
71
+ * Returns the PlanEntry if found, null otherwise.
72
+ */
73
+ export declare function findDuplicatePlan(content: string, projectPath: string): Promise<PlanEntry | null>;
74
+ /**
75
+ * Index an embedded plan in the project index.
76
+ * Creates or updates the PlanEntry with session link.
77
+ */
78
+ export declare function indexEmbeddedPlan(content: string, filename: string, sessionId: string, projectPath: string): Promise<PlanEntry>;
79
+ /**
80
+ * Extract embedded plans from session entries and save to project.
81
+ * Returns array of PlanReference objects for the manifest.
82
+ */
83
+ export declare function extractEmbeddedPlans(entries: ParsedEntry[], projectPath: string, sessionId: string): Promise<PlanReference[]>;
84
+ //# sourceMappingURL=plan-extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan-extractor.d.ts","sourceRoot":"","sources":["../../src/archive/plan-extractor.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAKH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAKrD,8CAA8C;AAC9C,eAAO,MAAM,qBAAqB,UAIjC,CAAC;AAQF;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,WAAW,EAAE,GAAG,YAAY,EAAE,CA4C1E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAkC5D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAgBxD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAoBvD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAQxD;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,eAAe,CAuCxE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAYxE;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAiD3B;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,SAAS,CAAC,CAgDpB;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,WAAW,EAAE,EACtB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,GAChB,OAAO,CAAC,aAAa,EAAE,CAAC,CAgF1B"}