@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,233 @@
1
+ /**
2
+ * Context Indexer
3
+ *
4
+ * Reads and writes .jacques/index.json - the unified project knowledge index.
5
+ * Tracks context files, sessions, and plans in a single location.
6
+ */
7
+ import { promises as fs } from "fs";
8
+ import { existsSync } from "fs";
9
+ import { join } from "path";
10
+ import { getDefaultIndex, migrateIndex } from "./types.js";
11
+ const JACQUES_DIR = ".jacques";
12
+ const INDEX_FILE = "index.json";
13
+ /**
14
+ * Get the path to the index file for a project
15
+ */
16
+ export function getIndexPath(cwd) {
17
+ return join(cwd, JACQUES_DIR, INDEX_FILE);
18
+ }
19
+ /**
20
+ * Read the unified project index from .jacques/index.json
21
+ * Automatically migrates legacy format (files-only) to new format
22
+ */
23
+ export async function readProjectIndex(cwd) {
24
+ const indexPath = getIndexPath(cwd);
25
+ try {
26
+ if (!existsSync(indexPath)) {
27
+ return getDefaultIndex();
28
+ }
29
+ const content = await fs.readFile(indexPath, "utf-8");
30
+ const parsed = JSON.parse(content);
31
+ // Check if this is a legacy format (has 'files' instead of 'context')
32
+ if (parsed.files && !parsed.context) {
33
+ // Migrate legacy format
34
+ return migrateIndex(parsed);
35
+ }
36
+ // New format - validate and merge with defaults (v2 adds subagents)
37
+ return {
38
+ version: parsed.version || "2.0.0",
39
+ updatedAt: parsed.updatedAt || new Date().toISOString(),
40
+ context: Array.isArray(parsed.context) ? parsed.context : [],
41
+ sessions: Array.isArray(parsed.sessions) ? parsed.sessions : [],
42
+ plans: Array.isArray(parsed.plans) ? parsed.plans : [],
43
+ subagents: Array.isArray(parsed.subagents) ? parsed.subagents : [],
44
+ };
45
+ }
46
+ catch {
47
+ return getDefaultIndex();
48
+ }
49
+ }
50
+ /**
51
+ * Write the project index to .jacques/index.json
52
+ */
53
+ export async function writeProjectIndex(cwd, index) {
54
+ const jacquesDir = join(cwd, JACQUES_DIR);
55
+ const indexPath = getIndexPath(cwd);
56
+ // Ensure .jacques directory exists
57
+ await fs.mkdir(jacquesDir, { recursive: true });
58
+ // Update timestamp
59
+ index.updatedAt = new Date().toISOString();
60
+ // Write with pretty formatting
61
+ await fs.writeFile(indexPath, JSON.stringify(index, null, 2), "utf-8");
62
+ }
63
+ // ============================================================
64
+ // Context File Operations
65
+ // ============================================================
66
+ /**
67
+ * Add a context file to the index
68
+ */
69
+ export async function addContextToIndex(cwd, file) {
70
+ const index = await readProjectIndex(cwd);
71
+ const existingIdx = index.context.findIndex((f) => f.id === file.id);
72
+ if (existingIdx >= 0) {
73
+ index.context[existingIdx] = file;
74
+ }
75
+ else {
76
+ index.context.push(file);
77
+ }
78
+ await writeProjectIndex(cwd, index);
79
+ return index;
80
+ }
81
+ /**
82
+ * Remove a context file from the index
83
+ */
84
+ export async function removeContextFromIndex(cwd, fileId) {
85
+ const index = await readProjectIndex(cwd);
86
+ index.context = index.context.filter((f) => f.id !== fileId);
87
+ await writeProjectIndex(cwd, index);
88
+ return index;
89
+ }
90
+ // ============================================================
91
+ // Session Operations
92
+ // ============================================================
93
+ /**
94
+ * Add a session to the index
95
+ */
96
+ export async function addSessionToIndex(cwd, session) {
97
+ const index = await readProjectIndex(cwd);
98
+ const existingIdx = index.sessions.findIndex((s) => s.id === session.id);
99
+ if (existingIdx >= 0) {
100
+ index.sessions[existingIdx] = session;
101
+ }
102
+ else {
103
+ index.sessions.push(session);
104
+ }
105
+ // Sort sessions by savedAt (newest first)
106
+ index.sessions.sort((a, b) => new Date(b.savedAt).getTime() - new Date(a.savedAt).getTime());
107
+ await writeProjectIndex(cwd, index);
108
+ return index;
109
+ }
110
+ /**
111
+ * Remove a session from the index
112
+ */
113
+ export async function removeSessionFromIndex(cwd, sessionId) {
114
+ const index = await readProjectIndex(cwd);
115
+ index.sessions = index.sessions.filter((s) => s.id !== sessionId);
116
+ await writeProjectIndex(cwd, index);
117
+ return index;
118
+ }
119
+ // ============================================================
120
+ // Plan Operations
121
+ // ============================================================
122
+ /**
123
+ * Add a plan to the index
124
+ */
125
+ export async function addPlanToIndex(cwd, plan) {
126
+ const index = await readProjectIndex(cwd);
127
+ const existingIdx = index.plans.findIndex((p) => p.id === plan.id);
128
+ if (existingIdx >= 0) {
129
+ // Merge session references
130
+ const existing = index.plans[existingIdx];
131
+ const mergedSessions = [
132
+ ...new Set([...existing.sessions, ...plan.sessions]),
133
+ ];
134
+ index.plans[existingIdx] = { ...plan, sessions: mergedSessions };
135
+ }
136
+ else {
137
+ index.plans.push(plan);
138
+ }
139
+ // Sort plans by updatedAt (newest first)
140
+ index.plans.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
141
+ await writeProjectIndex(cwd, index);
142
+ return index;
143
+ }
144
+ /**
145
+ * Remove a plan from the index
146
+ */
147
+ export async function removePlanFromIndex(cwd, planId) {
148
+ const index = await readProjectIndex(cwd);
149
+ index.plans = index.plans.filter((p) => p.id !== planId);
150
+ await writeProjectIndex(cwd, index);
151
+ return index;
152
+ }
153
+ // ============================================================
154
+ // Subagent Operations
155
+ // ============================================================
156
+ /**
157
+ * Add a subagent entry to the index
158
+ */
159
+ export async function addSubagentToIndex(cwd, entry) {
160
+ const index = await readProjectIndex(cwd);
161
+ const existingIdx = index.subagents.findIndex((s) => s.id === entry.id);
162
+ if (existingIdx >= 0) {
163
+ index.subagents[existingIdx] = entry;
164
+ }
165
+ else {
166
+ index.subagents.push(entry);
167
+ }
168
+ // Sort subagents by timestamp (newest first)
169
+ index.subagents.sort((a, b) => new Date(b.timestamp).getTime() - new Date(a.timestamp).getTime());
170
+ await writeProjectIndex(cwd, index);
171
+ return index;
172
+ }
173
+ /**
174
+ * Remove a subagent entry from the index
175
+ */
176
+ export async function removeSubagentFromIndex(cwd, subagentId) {
177
+ const index = await readProjectIndex(cwd);
178
+ index.subagents = index.subagents.filter((s) => s.id !== subagentId);
179
+ await writeProjectIndex(cwd, index);
180
+ return index;
181
+ }
182
+ // ============================================================
183
+ // Legacy Compatibility
184
+ // ============================================================
185
+ /**
186
+ * @deprecated Use readProjectIndex instead
187
+ */
188
+ export async function readContextIndex(cwd) {
189
+ const index = await readProjectIndex(cwd);
190
+ return {
191
+ version: index.version,
192
+ updatedAt: index.updatedAt,
193
+ files: index.context,
194
+ };
195
+ }
196
+ /**
197
+ * @deprecated Use writeProjectIndex instead
198
+ */
199
+ export async function writeContextIndex(cwd, legacyIndex) {
200
+ const index = await readProjectIndex(cwd);
201
+ index.context = legacyIndex.files;
202
+ await writeProjectIndex(cwd, index);
203
+ }
204
+ /**
205
+ * @deprecated Use addContextToIndex instead
206
+ */
207
+ export async function addToIndex(cwd, file) {
208
+ const index = await addContextToIndex(cwd, file);
209
+ return {
210
+ version: index.version,
211
+ updatedAt: index.updatedAt,
212
+ files: index.context,
213
+ };
214
+ }
215
+ /**
216
+ * @deprecated Use removeContextFromIndex instead
217
+ */
218
+ export async function removeFromIndex(cwd, fileId) {
219
+ const index = await removeContextFromIndex(cwd, fileId);
220
+ return {
221
+ version: index.version,
222
+ updatedAt: index.updatedAt,
223
+ files: index.context,
224
+ };
225
+ }
226
+ /**
227
+ * Check if a context file exists in the index
228
+ */
229
+ export async function fileExistsInIndex(cwd, fileId) {
230
+ const index = await readProjectIndex(cwd);
231
+ return index.context.some((f) => f.id === fileId);
232
+ }
233
+ //# sourceMappingURL=indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/context/indexer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Context Manager
3
+ *
4
+ * Manages adding/removing context files to/from .jacques/context/
5
+ */
6
+ import type { ContextFile, AddContextOptions } from "./types.js";
7
+ /**
8
+ * Extract tags from Obsidian file content.
9
+ * Supports both frontmatter tags and inline #tags.
10
+ */
11
+ export declare function extractTags(filePath: string): Promise<string[]>;
12
+ /**
13
+ * Generate a unique ID for a context file
14
+ * Format: slugified-name-randomhex
15
+ */
16
+ export declare function generateContextId(name: string): string;
17
+ /**
18
+ * Sanitize a filename for safe filesystem use
19
+ * - Converts spaces to dashes
20
+ * - Removes special characters
21
+ * - Keeps alphanumeric, dashes, underscores
22
+ */
23
+ export declare function sanitizeFilename(name: string): string;
24
+ /**
25
+ * Get the context directory path for a project
26
+ */
27
+ export declare function getContextDir(cwd: string): string;
28
+ /**
29
+ * Add a context file from an external source
30
+ * Copies the file to .jacques/context/ and updates the index
31
+ */
32
+ export declare function addContext(options: AddContextOptions): Promise<ContextFile>;
33
+ /**
34
+ * Remove a context file by ID
35
+ * Deletes the file from .jacques/context/ and updates the index
36
+ */
37
+ export declare function removeContext(cwd: string, contextFile: ContextFile): Promise<void>;
38
+ /**
39
+ * Check if context directory exists and has files
40
+ */
41
+ export declare function hasContextFiles(cwd: string): Promise<boolean>;
42
+ /**
43
+ * Format file size in human-readable format
44
+ */
45
+ export declare function formatFileSize(bytes: number): string;
46
+ /**
47
+ * Estimate tokens from file size (quick estimation).
48
+ * Uses ~4.5 characters per token for English markdown text.
49
+ */
50
+ export declare function estimateTokensFromSize(bytes: number): number;
51
+ /**
52
+ * Count tokens in text content using tiktoken.
53
+ * Falls back to character-based estimation if tiktoken unavailable.
54
+ */
55
+ export declare function countTokens(text: string): Promise<number>;
56
+ /**
57
+ * Count tokens in a file using tiktoken.
58
+ * Falls back to size-based estimation if file read fails.
59
+ */
60
+ export declare function countFileTokens(filePath: string): Promise<number>;
61
+ /**
62
+ * Format token count as human-readable string.
63
+ * Examples: "523", "1.2k", "45.2k"
64
+ */
65
+ export declare function formatTokenCount(tokens: number): string;
66
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/context/manager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA4FjE;;;GAGG;AACH,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAiCrE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAItD;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAOrD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAEjD;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,WAAW,CAAC,CAuCtB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,WAAW,GACvB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQnE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAQpD;AA2BD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAe/D;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAavE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAKvD"}
@@ -0,0 +1,310 @@
1
+ /**
2
+ * Context Manager
3
+ *
4
+ * Manages adding/removing context files to/from .jacques/context/
5
+ */
6
+ import { promises as fs } from "fs";
7
+ import { join } from "path";
8
+ import { addToIndex } from "./indexer.js";
9
+ const JACQUES_DIR = ".jacques";
10
+ const CONTEXT_DIR = "context";
11
+ /**
12
+ * Parse YAML frontmatter from markdown content.
13
+ * Returns null if no frontmatter found.
14
+ */
15
+ function parseFrontmatter(content) {
16
+ // Frontmatter must start at the beginning of the file
17
+ if (!content.startsWith("---")) {
18
+ return null;
19
+ }
20
+ // Find the closing ---
21
+ const endIndex = content.indexOf("\n---", 3);
22
+ if (endIndex === -1) {
23
+ return null;
24
+ }
25
+ const yamlContent = content.substring(4, endIndex).trim();
26
+ if (!yamlContent) {
27
+ return null;
28
+ }
29
+ // Simple YAML parser for common frontmatter patterns
30
+ const result = {};
31
+ const lines = yamlContent.split("\n");
32
+ let currentKey = null;
33
+ let currentArray = null;
34
+ for (const line of lines) {
35
+ const trimmed = line.trim();
36
+ // Skip empty lines and comments
37
+ if (!trimmed || trimmed.startsWith("#")) {
38
+ continue;
39
+ }
40
+ // Check for array item (starts with -)
41
+ if (trimmed.startsWith("- ") && currentKey && currentArray) {
42
+ // Remove quotes from array item
43
+ const item = trimmed.substring(2).trim().replace(/^["']|["']$/g, "");
44
+ currentArray.push(item);
45
+ continue;
46
+ }
47
+ // Check for key: value pair
48
+ const colonIndex = trimmed.indexOf(":");
49
+ if (colonIndex > 0) {
50
+ // Save previous array if exists
51
+ if (currentKey && currentArray) {
52
+ result[currentKey] = currentArray;
53
+ }
54
+ currentKey = trimmed.substring(0, colonIndex).trim();
55
+ const value = trimmed.substring(colonIndex + 1).trim();
56
+ if (value) {
57
+ // Inline value - could be array [a, b, c] or string
58
+ if (value.startsWith("[") && value.endsWith("]")) {
59
+ // Inline array: [tag1, tag2, tag3]
60
+ const arrayContent = value.substring(1, value.length - 1);
61
+ result[currentKey] = arrayContent
62
+ .split(",")
63
+ .map((s) => s.trim().replace(/^["']|["']$/g, ""))
64
+ .filter((s) => s.length > 0);
65
+ currentKey = null;
66
+ currentArray = null;
67
+ }
68
+ else {
69
+ // String value
70
+ result[currentKey] = value.replace(/^["']|["']$/g, "");
71
+ currentKey = null;
72
+ currentArray = null;
73
+ }
74
+ }
75
+ else {
76
+ // Value on next lines (array)
77
+ currentArray = [];
78
+ }
79
+ }
80
+ }
81
+ // Save final array if exists
82
+ if (currentKey && currentArray) {
83
+ result[currentKey] = currentArray;
84
+ }
85
+ return Object.keys(result).length > 0 ? result : null;
86
+ }
87
+ /**
88
+ * Extract tags from Obsidian file content.
89
+ * Supports both frontmatter tags and inline #tags.
90
+ */
91
+ export async function extractTags(filePath) {
92
+ try {
93
+ const content = await fs.readFile(filePath, "utf-8");
94
+ const tags = new Set();
95
+ // Extract from frontmatter
96
+ const frontmatter = parseFrontmatter(content);
97
+ if (frontmatter?.tags) {
98
+ const fmTags = Array.isArray(frontmatter.tags)
99
+ ? frontmatter.tags
100
+ : [frontmatter.tags];
101
+ fmTags.forEach((tag) => {
102
+ // Remove # prefix if present
103
+ const cleaned = tag.replace(/^#/, "").trim();
104
+ if (cleaned)
105
+ tags.add(cleaned);
106
+ });
107
+ }
108
+ // Also check for 'tag' (singular) in frontmatter
109
+ if (frontmatter?.tag) {
110
+ const fmTag = Array.isArray(frontmatter.tag)
111
+ ? frontmatter.tag
112
+ : [frontmatter.tag];
113
+ fmTag.forEach((tag) => {
114
+ const cleaned = tag.replace(/^#/, "").trim();
115
+ if (cleaned)
116
+ tags.add(cleaned);
117
+ });
118
+ }
119
+ return Array.from(tags).sort();
120
+ }
121
+ catch {
122
+ return [];
123
+ }
124
+ }
125
+ /**
126
+ * Generate a unique ID for a context file
127
+ * Format: slugified-name-randomhex
128
+ */
129
+ export function generateContextId(name) {
130
+ const slug = sanitizeFilename(name).toLowerCase().substring(0, 30);
131
+ const randomSuffix = Math.random().toString(16).substring(2, 8);
132
+ return `${slug}-${randomSuffix}`;
133
+ }
134
+ /**
135
+ * Sanitize a filename for safe filesystem use
136
+ * - Converts spaces to dashes
137
+ * - Removes special characters
138
+ * - Keeps alphanumeric, dashes, underscores
139
+ */
140
+ export function sanitizeFilename(name) {
141
+ return name
142
+ .trim()
143
+ .replace(/\s+/g, "-") // spaces to dashes
144
+ .replace(/[^a-zA-Z0-9_-]/g, "") // remove special chars
145
+ .replace(/-+/g, "-") // collapse multiple dashes
146
+ .replace(/^-|-$/g, ""); // trim leading/trailing dashes
147
+ }
148
+ /**
149
+ * Get the context directory path for a project
150
+ */
151
+ export function getContextDir(cwd) {
152
+ return join(cwd, JACQUES_DIR, CONTEXT_DIR);
153
+ }
154
+ /**
155
+ * Add a context file from an external source
156
+ * Copies the file to .jacques/context/ and updates the index
157
+ */
158
+ export async function addContext(options) {
159
+ const { cwd, sourceFile, name, source, description } = options;
160
+ // Ensure context directory exists
161
+ const contextDir = getContextDir(cwd);
162
+ await fs.mkdir(contextDir, { recursive: true });
163
+ // Generate unique ID and destination filename
164
+ const id = generateContextId(name);
165
+ const destFilename = `${sanitizeFilename(name)}.md`;
166
+ const destPath = join(contextDir, destFilename);
167
+ const relativePath = join(JACQUES_DIR, CONTEXT_DIR, destFilename);
168
+ // Extract tags before copying (from source file)
169
+ const tags = await extractTags(sourceFile);
170
+ // Copy the file
171
+ await fs.copyFile(sourceFile, destPath);
172
+ // Get file size
173
+ const stats = await fs.stat(destPath);
174
+ // Create context file entry
175
+ const contextFile = {
176
+ id,
177
+ name,
178
+ path: relativePath,
179
+ source,
180
+ sourceFile,
181
+ addedAt: new Date().toISOString(),
182
+ description,
183
+ sizeBytes: stats.size,
184
+ ...(tags.length > 0 && { tags }),
185
+ };
186
+ // Add to index
187
+ await addToIndex(cwd, contextFile);
188
+ return contextFile;
189
+ }
190
+ /**
191
+ * Remove a context file by ID
192
+ * Deletes the file from .jacques/context/ and updates the index
193
+ */
194
+ export async function removeContext(cwd, contextFile) {
195
+ // Delete the file
196
+ const filePath = join(cwd, contextFile.path);
197
+ try {
198
+ await fs.unlink(filePath);
199
+ }
200
+ catch {
201
+ // File may already be deleted
202
+ }
203
+ // Remove from index
204
+ const { removeFromIndex } = await import("./indexer.js");
205
+ await removeFromIndex(cwd, contextFile.id);
206
+ }
207
+ /**
208
+ * Check if context directory exists and has files
209
+ */
210
+ export async function hasContextFiles(cwd) {
211
+ const contextDir = getContextDir(cwd);
212
+ try {
213
+ const entries = await fs.readdir(contextDir);
214
+ return entries.some((e) => e.endsWith(".md"));
215
+ }
216
+ catch {
217
+ return false;
218
+ }
219
+ }
220
+ /**
221
+ * Format file size in human-readable format
222
+ */
223
+ export function formatFileSize(bytes) {
224
+ if (bytes < 1024) {
225
+ return `${bytes} B`;
226
+ }
227
+ if (bytes < 1024 * 1024) {
228
+ return `${(bytes / 1024).toFixed(1)} KB`;
229
+ }
230
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
231
+ }
232
+ // Lazy-load tiktoken to avoid import errors if unavailable
233
+ let tiktokenModule = null;
234
+ let encoder = null;
235
+ /**
236
+ * Initialize tiktoken encoder (lazy-loaded).
237
+ * Uses cl100k_base encoding which is compatible with Claude models.
238
+ */
239
+ async function getEncoder() {
240
+ if (encoder)
241
+ return encoder;
242
+ try {
243
+ if (!tiktokenModule) {
244
+ tiktokenModule = await import("@dqbd/tiktoken");
245
+ }
246
+ encoder = tiktokenModule.get_encoding("cl100k_base");
247
+ return encoder;
248
+ }
249
+ catch {
250
+ return null;
251
+ }
252
+ }
253
+ /**
254
+ * Estimate tokens from file size (quick estimation).
255
+ * Uses ~4.5 characters per token for English markdown text.
256
+ */
257
+ export function estimateTokensFromSize(bytes) {
258
+ return Math.ceil(bytes / 4.5);
259
+ }
260
+ /**
261
+ * Count tokens in text content using tiktoken.
262
+ * Falls back to character-based estimation if tiktoken unavailable.
263
+ */
264
+ export async function countTokens(text) {
265
+ if (!text)
266
+ return 0;
267
+ const enc = await getEncoder();
268
+ if (enc) {
269
+ try {
270
+ const tokens = enc.encode(text);
271
+ return tokens.length;
272
+ }
273
+ catch {
274
+ // Fall through to estimation
275
+ }
276
+ }
277
+ // Fallback: character-based estimation
278
+ return Math.ceil(text.length / 4.5);
279
+ }
280
+ /**
281
+ * Count tokens in a file using tiktoken.
282
+ * Falls back to size-based estimation if file read fails.
283
+ */
284
+ export async function countFileTokens(filePath) {
285
+ try {
286
+ const content = await fs.readFile(filePath, "utf-8");
287
+ return countTokens(content);
288
+ }
289
+ catch {
290
+ // If we can't read the file, estimate from size
291
+ try {
292
+ const stats = await fs.stat(filePath);
293
+ return estimateTokensFromSize(stats.size);
294
+ }
295
+ catch {
296
+ return 0;
297
+ }
298
+ }
299
+ }
300
+ /**
301
+ * Format token count as human-readable string.
302
+ * Examples: "523", "1.2k", "45.2k"
303
+ */
304
+ export function formatTokenCount(tokens) {
305
+ if (tokens < 1000) {
306
+ return tokens.toString();
307
+ }
308
+ return `${(tokens / 1000).toFixed(1)}k`;
309
+ }
310
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manager.js","sourceRoot":"","sources":["../../src/context/manager.ts"],"names":[],"mappings":"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"}