@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,89 @@
1
+ /**
2
+ * Hooks symlink management.
3
+ *
4
+ * Creates ~/.jacques/ directory and symlinks ~/.jacques/hooks → source hooks dir.
5
+ */
6
+ import { existsSync, mkdirSync, symlinkSync, unlinkSync, readlinkSync, } from "fs";
7
+ import { homedir } from "os";
8
+ import { join } from "path";
9
+ const JACQUES_DIR = join(homedir(), ".jacques");
10
+ /**
11
+ * Create the ~/.jacques/ directory if it doesn't exist.
12
+ */
13
+ export function createJacquesDir() {
14
+ if (existsSync(JACQUES_DIR)) {
15
+ return {
16
+ step: "Create ~/.jacques/ directory",
17
+ success: true,
18
+ message: "~/.jacques/ already exists",
19
+ };
20
+ }
21
+ try {
22
+ mkdirSync(JACQUES_DIR, { recursive: true });
23
+ return {
24
+ step: "Create ~/.jacques/ directory",
25
+ success: true,
26
+ message: "Created ~/.jacques/",
27
+ };
28
+ }
29
+ catch (err) {
30
+ return {
31
+ step: "Create ~/.jacques/ directory",
32
+ success: false,
33
+ message: `Failed to create ~/.jacques/: ${err.message}`,
34
+ };
35
+ }
36
+ }
37
+ /**
38
+ * Set up the hooks symlink: ~/.jacques/hooks → hooksSourceDir.
39
+ *
40
+ * @param hooksSourceDir Absolute path to the source hooks directory
41
+ */
42
+ export function setupHooksSymlink(hooksSourceDir) {
43
+ const hooksTarget = join(JACQUES_DIR, "hooks");
44
+ // Check if symlink already exists and points to the right place
45
+ if (existsSync(hooksTarget)) {
46
+ try {
47
+ const currentTarget = readlinkSync(hooksTarget);
48
+ if (currentTarget === hooksSourceDir) {
49
+ return {
50
+ step: "Set up hooks symlink",
51
+ success: true,
52
+ message: "Hooks symlink already configured",
53
+ };
54
+ }
55
+ }
56
+ catch {
57
+ // Not a symlink — fall through to remove and recreate
58
+ }
59
+ // Remove existing
60
+ try {
61
+ unlinkSync(hooksTarget);
62
+ }
63
+ catch (err) {
64
+ return {
65
+ step: "Set up hooks symlink",
66
+ success: false,
67
+ message: `Failed to remove existing hooks: ${err.message}`,
68
+ };
69
+ }
70
+ }
71
+ // Create symlink (junction on Windows — no admin required)
72
+ try {
73
+ const symlinkType = process.platform === "win32" ? "junction" : "dir";
74
+ symlinkSync(hooksSourceDir, hooksTarget, symlinkType);
75
+ return {
76
+ step: "Set up hooks symlink",
77
+ success: true,
78
+ message: `Created symlink: ~/.jacques/hooks → ${hooksSourceDir}`,
79
+ };
80
+ }
81
+ catch (err) {
82
+ return {
83
+ step: "Set up hooks symlink",
84
+ success: false,
85
+ message: `Failed to create symlink: ${err.message}`,
86
+ };
87
+ }
88
+ }
89
+ //# sourceMappingURL=hooks-symlink.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks-symlink.js","sourceRoot":"","sources":["../../src/setup/hooks-symlink.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACL,UAAU,EACV,SAAS,EACT,WAAW,EACX,UAAU,EACV,YAAY,GACb,MAAM,IAAI,CAAC;AACZ,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC,CAAC;AAEhD;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,4BAA4B;SACtC,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC5C,OAAO;YACL,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,qBAAqB;SAC/B,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,IAAI,EAAE,8BAA8B;YACpC,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,iCAAkC,GAAa,CAAC,OAAO,EAAE;SACnE,CAAC;IACJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,cAAsB;IACtD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAE/C,gEAAgE;IAChE,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,CAAC;YACH,MAAM,aAAa,GAAG,YAAY,CAAC,WAAW,CAAC,CAAC;YAChD,IAAI,aAAa,KAAK,cAAc,EAAE,CAAC;gBACrC,OAAO;oBACL,IAAI,EAAE,sBAAsB;oBAC5B,OAAO,EAAE,IAAI;oBACb,OAAO,EAAE,kCAAkC;iBAC5C,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,sDAAsD;QACxD,CAAC;QAED,kBAAkB;QAClB,IAAI,CAAC;YACH,UAAU,CAAC,WAAW,CAAC,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO;gBACL,IAAI,EAAE,sBAAsB;gBAC5B,OAAO,EAAE,KAAK;gBACd,OAAO,EAAE,oCAAqC,GAAa,CAAC,OAAO,EAAE;aACtE,CAAC;QACJ,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC;QACtE,WAAW,CAAC,cAAc,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC;QACtD,OAAO;YACL,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,IAAI;YACb,OAAO,EAAE,uCAAuC,cAAc,EAAE;SACjE,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,IAAI,EAAE,sBAAsB;YAC5B,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,6BAA8B,GAAa,CAAC,OAAO,EAAE;SAC/D,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Setup module — shared logic for Jacques installation.
3
+ *
4
+ * Used by both the TUI setup wizard and legacy configure scripts.
5
+ */
6
+ export type { PrerequisiteResult, SetupOptions, SetupStepResult, VerificationResult, SyncProgress, SyncResult, } from "./types.js";
7
+ export { checkPrerequisites } from "./prerequisites.js";
8
+ export { getPythonCommand, getHooksDir, getStatusLineConfig, getHooksConfig, getJacquesHooksConfig, } from "./hooks-config.js";
9
+ export { loadClaudeSettings, createSettingsBackup, mergeHooksIntoSettings, writeClaudeSettings, hasJacquesConfigured, } from "./settings-merge.js";
10
+ export { createJacquesDir, setupHooksSymlink } from "./hooks-symlink.js";
11
+ export { installSkills, skillsAlreadyInstalled } from "./skills-install.js";
12
+ export { verifyInstallation } from "./verification.js";
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/setup/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,EACV,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,UAAU,GACX,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Setup module — shared logic for Jacques installation.
3
+ *
4
+ * Used by both the TUI setup wizard and legacy configure scripts.
5
+ */
6
+ export { checkPrerequisites } from "./prerequisites.js";
7
+ export { getPythonCommand, getHooksDir, getStatusLineConfig, getHooksConfig, getJacquesHooksConfig, } from "./hooks-config.js";
8
+ export { loadClaudeSettings, createSettingsBackup, mergeHooksIntoSettings, writeClaudeSettings, hasJacquesConfigured, } from "./settings-merge.js";
9
+ export { createJacquesDir, setupHooksSymlink } from "./hooks-symlink.js";
10
+ export { installSkills, skillsAlreadyInstalled } from "./skills-install.js";
11
+ export { verifyInstallation } from "./verification.js";
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/setup/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,OAAO,EACL,gBAAgB,EAChB,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,qBAAqB,GACtB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EACL,kBAAkB,EAClB,oBAAoB,EACpB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEzE,OAAO,EAAE,aAAa,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAE5E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Prerequisite checks for Jacques setup.
3
+ *
4
+ * Checks Python 3 availability and ~/.claude/ directory existence.
5
+ */
6
+ import type { PrerequisiteResult } from "./types.js";
7
+ /**
8
+ * Check all prerequisites and return structured results.
9
+ */
10
+ export declare function checkPrerequisites(): Promise<PrerequisiteResult[]>;
11
+ //# sourceMappingURL=prerequisites.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerequisites.d.ts","sourceRoot":"","sources":["../../src/setup/prerequisites.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAUxE"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Prerequisite checks for Jacques setup.
3
+ *
4
+ * Checks Python 3 availability and ~/.claude/ directory existence.
5
+ */
6
+ import { execSync } from "child_process";
7
+ import { existsSync } from "fs";
8
+ import { homedir } from "os";
9
+ import { join } from "path";
10
+ /**
11
+ * Check all prerequisites and return structured results.
12
+ */
13
+ export async function checkPrerequisites() {
14
+ const results = [];
15
+ // Check Python 3
16
+ results.push(checkPython());
17
+ // Check ~/.claude/ directory
18
+ results.push(checkClaudeDir());
19
+ return results;
20
+ }
21
+ function checkPython() {
22
+ const commands = process.platform === "win32"
23
+ ? ["python", "python3"]
24
+ : ["python3", "python"];
25
+ for (const cmd of commands) {
26
+ try {
27
+ const version = execSync(`${cmd} --version`, {
28
+ encoding: "utf8",
29
+ timeout: 5000,
30
+ }).trim();
31
+ if (version.includes("3.")) {
32
+ return {
33
+ name: "Python 3",
34
+ status: "pass",
35
+ version: `${version} (${cmd})`,
36
+ };
37
+ }
38
+ }
39
+ catch {
40
+ // Try next command
41
+ }
42
+ }
43
+ return {
44
+ name: "Python 3",
45
+ status: "fail",
46
+ message: "Python 3 not found. Install from https://python.org",
47
+ };
48
+ }
49
+ function checkClaudeDir() {
50
+ const claudeDir = join(homedir(), ".claude");
51
+ if (existsSync(claudeDir)) {
52
+ const projectsDir = join(claudeDir, "projects");
53
+ if (existsSync(projectsDir)) {
54
+ return {
55
+ name: "Claude Code",
56
+ status: "pass",
57
+ message: "~/.claude/ directory found with projects",
58
+ };
59
+ }
60
+ return {
61
+ name: "Claude Code",
62
+ status: "warn",
63
+ message: "~/.claude/ exists but no projects/ found — run Claude Code first for full functionality",
64
+ };
65
+ }
66
+ return {
67
+ name: "Claude Code",
68
+ status: "warn",
69
+ message: "~/.claude/ not found — it will be created during setup",
70
+ };
71
+ }
72
+ //# sourceMappingURL=prerequisites.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prerequisites.js","sourceRoot":"","sources":["../../src/setup/prerequisites.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,OAAO,GAAyB,EAAE,CAAC;IAEzC,iBAAiB;IACjB,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAE5B,6BAA6B;IAC7B,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC;IAE/B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,WAAW;IAClB,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO;QAC3C,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC;QACvB,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAE1B,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,GAAG,YAAY,EAAE;gBAC3C,QAAQ,EAAE,MAAM;gBAChB,OAAO,EAAE,IAAI;aACd,CAAC,CAAC,IAAI,EAAE,CAAC;YAEV,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3B,OAAO;oBACL,IAAI,EAAE,UAAU;oBAChB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE,GAAG,OAAO,KAAK,GAAG,GAAG;iBAC/B,CAAC;YACJ,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,mBAAmB;QACrB,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAU;QAChB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,qDAAqD;KAC/D,CAAC;AACJ,CAAC;AAED,SAAS,cAAc;IACrB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IAE7C,IAAI,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC1B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QAChD,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC5B,OAAO;gBACL,IAAI,EAAE,aAAa;gBACnB,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE,0CAA0C;aACpD,CAAC;QACJ,CAAC;QACD,OAAO;YACL,IAAI,EAAE,aAAa;YACnB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,yFAAyF;SACnG,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,aAAa;QACnB,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,wDAAwD;KAClE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Claude Code settings.json merge logic.
3
+ *
4
+ * Reads, backs up, merges, and writes ~/.claude/settings.json.
5
+ */
6
+ import type { SetupOptions } from "./types.js";
7
+ /**
8
+ * Load existing Claude Code settings. Returns null if not found or invalid.
9
+ */
10
+ export declare function loadClaudeSettings(): Record<string, unknown> | null;
11
+ /**
12
+ * Create a timestamped backup of the current settings.json.
13
+ * Returns the backup path, or null if no settings to back up.
14
+ */
15
+ export declare function createSettingsBackup(): string | null;
16
+ /**
17
+ * Merge Jacques configuration into existing settings.
18
+ *
19
+ * - Always merges hooks (5 event hooks)
20
+ * - Optionally sets statusLine based on options
21
+ * - Preserves all other existing settings
22
+ */
23
+ export declare function mergeHooksIntoSettings(existing: Record<string, unknown>, options: SetupOptions): Record<string, unknown>;
24
+ /**
25
+ * Write merged settings to ~/.claude/settings.json.
26
+ * Creates the directory if needed.
27
+ */
28
+ export declare function writeClaudeSettings(settings: Record<string, unknown>): void;
29
+ /**
30
+ * Check if Jacques hooks are already configured in settings.
31
+ */
32
+ export declare function hasJacquesConfigured(settings: Record<string, unknown> | null): boolean;
33
+ //# sourceMappingURL=settings-merge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-merge.d.ts","sourceRoot":"","sources":["../../src/setup/settings-merge.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAWH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAM/C;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAUnE;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CAYpD;AA4CD;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,YAAY,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAazB;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAQ3E;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GACvC,OAAO,CA2BT"}
@@ -0,0 +1,131 @@
1
+ /**
2
+ * Claude Code settings.json merge logic.
3
+ *
4
+ * Reads, backs up, merges, and writes ~/.claude/settings.json.
5
+ */
6
+ import { existsSync, readFileSync, writeFileSync, copyFileSync, mkdirSync, } from "fs";
7
+ import { homedir } from "os";
8
+ import { join } from "path";
9
+ import { getHooksConfig, getStatusLineConfig } from "./hooks-config.js";
10
+ const CLAUDE_DIR = join(homedir(), ".claude");
11
+ const CLAUDE_SETTINGS_PATH = join(CLAUDE_DIR, "settings.json");
12
+ /**
13
+ * Load existing Claude Code settings. Returns null if not found or invalid.
14
+ */
15
+ export function loadClaudeSettings() {
16
+ if (!existsSync(CLAUDE_SETTINGS_PATH)) {
17
+ return null;
18
+ }
19
+ try {
20
+ const content = readFileSync(CLAUDE_SETTINGS_PATH, "utf8");
21
+ return JSON.parse(content);
22
+ }
23
+ catch {
24
+ return null;
25
+ }
26
+ }
27
+ /**
28
+ * Create a timestamped backup of the current settings.json.
29
+ * Returns the backup path, or null if no settings to back up.
30
+ */
31
+ export function createSettingsBackup() {
32
+ if (!existsSync(CLAUDE_SETTINGS_PATH)) {
33
+ return null;
34
+ }
35
+ const timestamp = new Date().toISOString().replace(/[:.]/g, "-");
36
+ const backupPath = join(CLAUDE_DIR, `settings.backup.${timestamp}.json`);
37
+ try {
38
+ copyFileSync(CLAUDE_SETTINGS_PATH, backupPath);
39
+ return backupPath;
40
+ }
41
+ catch {
42
+ return null;
43
+ }
44
+ }
45
+ /**
46
+ * Check if a hook command belongs to Jacques.
47
+ */
48
+ function isJacquesHook(hook) {
49
+ return typeof hook.command === "string" && hook.command.includes("jacques");
50
+ }
51
+ /**
52
+ * Merge Jacques hooks into existing hooks, preserving non-Jacques hooks.
53
+ */
54
+ function mergeHooksArrays(existing, jacques) {
55
+ const merged = { ...existing };
56
+ for (const [eventType, jacquesGroups] of Object.entries(jacques)) {
57
+ if (!merged[eventType]) {
58
+ merged[eventType] = [];
59
+ }
60
+ for (const jacquesGroup of jacquesGroups) {
61
+ const existingIndex = merged[eventType].findIndex((group) => {
62
+ if (group.matcher !== jacquesGroup.matcher)
63
+ return false;
64
+ return group.hooks?.some((h) => isJacquesHook(h));
65
+ });
66
+ if (existingIndex >= 0) {
67
+ merged[eventType][existingIndex] = jacquesGroup;
68
+ }
69
+ else {
70
+ merged[eventType].push(jacquesGroup);
71
+ }
72
+ }
73
+ }
74
+ return merged;
75
+ }
76
+ /**
77
+ * Merge Jacques configuration into existing settings.
78
+ *
79
+ * - Always merges hooks (5 event hooks)
80
+ * - Optionally sets statusLine based on options
81
+ * - Preserves all other existing settings
82
+ */
83
+ export function mergeHooksIntoSettings(existing, options) {
84
+ const merged = { ...existing };
85
+ // Merge hooks
86
+ const existingHooks = (merged.hooks ?? {});
87
+ merged.hooks = mergeHooksArrays(existingHooks, getHooksConfig());
88
+ // Optionally set statusLine
89
+ if (options.installStatusLine) {
90
+ merged.statusLine = getStatusLineConfig();
91
+ }
92
+ return merged;
93
+ }
94
+ /**
95
+ * Write merged settings to ~/.claude/settings.json.
96
+ * Creates the directory if needed.
97
+ */
98
+ export function writeClaudeSettings(settings) {
99
+ if (!existsSync(CLAUDE_DIR)) {
100
+ mkdirSync(CLAUDE_DIR, { recursive: true });
101
+ }
102
+ writeFileSync(CLAUDE_SETTINGS_PATH, JSON.stringify(settings, null, 2) + "\n");
103
+ }
104
+ /**
105
+ * Check if Jacques hooks are already configured in settings.
106
+ */
107
+ export function hasJacquesConfigured(settings) {
108
+ if (!settings)
109
+ return false;
110
+ // Check statusLine
111
+ const statusLine = settings.statusLine;
112
+ if (statusLine?.command &&
113
+ typeof statusLine.command === "string" &&
114
+ statusLine.command.includes("jacques")) {
115
+ return true;
116
+ }
117
+ // Check hooks
118
+ const hooks = settings.hooks;
119
+ if (hooks) {
120
+ for (const groups of Object.values(hooks)) {
121
+ for (const group of groups) {
122
+ const hookList = group.hooks;
123
+ if (hookList?.some((h) => isJacquesHook(h))) {
124
+ return true;
125
+ }
126
+ }
127
+ }
128
+ }
129
+ return false;
130
+ }
131
+ //# sourceMappingURL=settings-merge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-merge.js","sourceRoot":"","sources":["../../src/setup/settings-merge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Jacques skills installation.
3
+ *
4
+ * Copies skill SKILL.md files to ~/.claude/skills/.
5
+ */
6
+ import type { SetupStepResult } from "./types.js";
7
+ /**
8
+ * Check if Jacques skills are already installed.
9
+ */
10
+ export declare function skillsAlreadyInstalled(): boolean;
11
+ /**
12
+ * Install Jacques skills to ~/.claude/skills/.
13
+ *
14
+ * @param skillsSourceDir Absolute path to the source skills directory (repo/skills/)
15
+ */
16
+ export declare function installSkills(skillsSourceDir: string): SetupStepResult;
17
+ //# sourceMappingURL=skills-install.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-install.d.ts","sourceRoot":"","sources":["../../src/setup/skills-install.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AASlD;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,OAAO,CAIhD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,eAAe,EAAE,MAAM,GAAG,eAAe,CAsCtE"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Jacques skills installation.
3
+ *
4
+ * Copies skill SKILL.md files to ~/.claude/skills/.
5
+ */
6
+ import { existsSync, mkdirSync, copyFileSync } from "fs";
7
+ import { homedir } from "os";
8
+ import { join } from "path";
9
+ const SKILLS_TARGET_DIR = join(homedir(), ".claude", "skills");
10
+ const SKILLS = [
11
+ { name: "jacques-handoff", file: "SKILL.md" },
12
+ { name: "jacques-continue", file: "SKILL.md" },
13
+ ];
14
+ /**
15
+ * Check if Jacques skills are already installed.
16
+ */
17
+ export function skillsAlreadyInstalled() {
18
+ return SKILLS.every((skill) => existsSync(join(SKILLS_TARGET_DIR, skill.name, skill.file)));
19
+ }
20
+ /**
21
+ * Install Jacques skills to ~/.claude/skills/.
22
+ *
23
+ * @param skillsSourceDir Absolute path to the source skills directory (repo/skills/)
24
+ */
25
+ export function installSkills(skillsSourceDir) {
26
+ const installed = [];
27
+ const errors = [];
28
+ for (const skill of SKILLS) {
29
+ const sourceFile = join(skillsSourceDir, skill.name, skill.file);
30
+ const targetDir = join(SKILLS_TARGET_DIR, skill.name);
31
+ const targetFile = join(targetDir, skill.file);
32
+ if (!existsSync(sourceFile)) {
33
+ errors.push(`Source not found: ${sourceFile}`);
34
+ continue;
35
+ }
36
+ try {
37
+ if (!existsSync(targetDir)) {
38
+ mkdirSync(targetDir, { recursive: true });
39
+ }
40
+ copyFileSync(sourceFile, targetFile);
41
+ installed.push(skill.name);
42
+ }
43
+ catch (err) {
44
+ errors.push(`${skill.name}: ${err.message}`);
45
+ }
46
+ }
47
+ if (errors.length > 0) {
48
+ return {
49
+ step: "Install skills",
50
+ success: false,
51
+ message: `Failed to install: ${errors.join(", ")}`,
52
+ };
53
+ }
54
+ return {
55
+ step: "Install skills",
56
+ success: true,
57
+ message: `Installed ${installed.length} skills: ${installed.join(", ")}`,
58
+ };
59
+ }
60
+ //# sourceMappingURL=skills-install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skills-install.js","sourceRoot":"","sources":["../../src/setup/skills-install.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AACzD,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAG5B,MAAM,iBAAiB,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;AAE/D,MAAM,MAAM,GAAG;IACb,EAAE,IAAI,EAAE,iBAAiB,EAAE,IAAI,EAAE,UAAU,EAAE;IAC7C,EAAE,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,UAAU,EAAE;CAC/C,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,sBAAsB;IACpC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAC5B,UAAU,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAC5D,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,eAAuB;IACnD,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,MAAM,GAAa,EAAE,CAAC;IAE5B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjE,MAAM,SAAS,GAAG,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAE/C,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,CAAC,IAAI,CAAC,qBAAqB,UAAU,EAAE,CAAC,CAAC;YAC/C,SAAS;QACX,CAAC;QAED,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC3B,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,CAAC;YACD,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YACrC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,IAAI,KAAM,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,OAAO;YACL,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK;YACd,OAAO,EAAE,sBAAsB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SACnD,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,aAAa,SAAS,CAAC,MAAM,YAAY,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KACzE,CAAC;AACJ,CAAC"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Types for the setup module.
3
+ *
4
+ * Shared between the TUI setup wizard and the legacy configure scripts.
5
+ */
6
+ export interface PrerequisiteResult {
7
+ name: string;
8
+ status: "pass" | "fail" | "warn";
9
+ version?: string;
10
+ message?: string;
11
+ }
12
+ export interface SetupOptions {
13
+ installStatusLine: boolean;
14
+ installSkills: boolean;
15
+ }
16
+ export interface SetupStepResult {
17
+ step: string;
18
+ success: boolean;
19
+ message: string;
20
+ detail?: string;
21
+ }
22
+ export interface VerificationResult {
23
+ check: string;
24
+ status: "pass" | "fail" | "warn";
25
+ message: string;
26
+ }
27
+ export interface SyncProgress {
28
+ phase: "extracting" | "indexing";
29
+ current: number;
30
+ total: number;
31
+ currentItem?: string;
32
+ }
33
+ export interface SyncResult {
34
+ totalSessions: number;
35
+ extracted: number;
36
+ indexed: number;
37
+ errors: number;
38
+ }
39
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/setup/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAY;IAC3B,iBAAiB,EAAE,OAAO,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,YAAY,GAAG,UAAU,CAAC;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,UAAU;IACzB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Types for the setup module.
3
+ *
4
+ * Shared between the TUI setup wizard and the legacy configure scripts.
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/setup/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Post-installation verification checks.
3
+ */
4
+ import type { SetupOptions, VerificationResult } from "./types.js";
5
+ /**
6
+ * Run all verification checks after installation.
7
+ */
8
+ export declare function verifyInstallation(options: SetupOptions): VerificationResult[];
9
+ //# sourceMappingURL=verification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verification.d.ts","sourceRoot":"","sources":["../../src/setup/verification.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEnE;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,kBAAkB,EAAE,CAoF9E"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Post-installation verification checks.
3
+ */
4
+ import { existsSync, readFileSync, readlinkSync } from "fs";
5
+ import { homedir } from "os";
6
+ import { join } from "path";
7
+ /**
8
+ * Run all verification checks after installation.
9
+ */
10
+ export function verifyInstallation(options) {
11
+ const results = [];
12
+ // Check ~/.claude/ directory
13
+ const claudeDir = join(homedir(), ".claude");
14
+ results.push({
15
+ check: "~/.claude/ directory",
16
+ status: existsSync(claudeDir) ? "pass" : "fail",
17
+ message: existsSync(claudeDir)
18
+ ? "~/.claude/ directory found"
19
+ : "~/.claude/ directory missing",
20
+ });
21
+ // Check ~/.claude/projects/
22
+ const projectsDir = join(claudeDir, "projects");
23
+ results.push({
24
+ check: "Claude Code projects",
25
+ status: existsSync(projectsDir) ? "pass" : "warn",
26
+ message: existsSync(projectsDir)
27
+ ? "~/.claude/projects/ exists"
28
+ : "~/.claude/projects/ not found — start Claude Code to create it",
29
+ });
30
+ // Check hooks symlink
31
+ const hooksTarget = join(homedir(), ".jacques", "hooks");
32
+ let hooksStatus = "fail";
33
+ let hooksMessage = "~/.jacques/hooks symlink missing";
34
+ if (existsSync(hooksTarget)) {
35
+ try {
36
+ readlinkSync(hooksTarget);
37
+ hooksStatus = "pass";
38
+ hooksMessage = "~/.jacques/hooks symlink valid";
39
+ }
40
+ catch {
41
+ hooksStatus = "fail";
42
+ hooksMessage = "~/.jacques/hooks exists but is not a symlink";
43
+ }
44
+ }
45
+ results.push({ check: "Hooks symlink", status: hooksStatus, message: hooksMessage });
46
+ // Check settings.json
47
+ const settingsPath = join(claudeDir, "settings.json");
48
+ if (existsSync(settingsPath)) {
49
+ try {
50
+ const content = readFileSync(settingsPath, "utf8");
51
+ const settings = JSON.parse(content);
52
+ const hasHooks = settings.hooks && Object.keys(settings.hooks).length > 0;
53
+ results.push({
54
+ check: "settings.json",
55
+ status: hasHooks ? "pass" : "warn",
56
+ message: hasHooks
57
+ ? "settings.json contains Jacques hooks"
58
+ : "settings.json exists but no hooks found",
59
+ });
60
+ }
61
+ catch {
62
+ results.push({
63
+ check: "settings.json",
64
+ status: "fail",
65
+ message: "settings.json exists but is not valid JSON",
66
+ });
67
+ }
68
+ }
69
+ else {
70
+ results.push({
71
+ check: "settings.json",
72
+ status: "fail",
73
+ message: "settings.json not found",
74
+ });
75
+ }
76
+ // Check skills if installed
77
+ if (options.installSkills) {
78
+ const skillsDir = join(claudeDir, "skills");
79
+ const handoff = existsSync(join(skillsDir, "jacques-handoff", "SKILL.md"));
80
+ const cont = existsSync(join(skillsDir, "jacques-continue", "SKILL.md"));
81
+ results.push({
82
+ check: "Skills",
83
+ status: handoff && cont ? "pass" : "warn",
84
+ message: handoff && cont
85
+ ? "Skills installed (/jacques-handoff, /jacques-continue)"
86
+ : "Some skills missing",
87
+ });
88
+ }
89
+ return results;
90
+ }
91
+ //# sourceMappingURL=verification.js.map