@jacques-ai/core 0.0.7-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/archive/archive-store.d.ts +166 -0
- package/dist/archive/archive-store.d.ts.map +1 -0
- package/dist/archive/archive-store.js +612 -0
- package/dist/archive/archive-store.js.map +1 -0
- package/dist/archive/bulk-archive.d.ts +63 -0
- package/dist/archive/bulk-archive.d.ts.map +1 -0
- package/dist/archive/bulk-archive.js +315 -0
- package/dist/archive/bulk-archive.js.map +1 -0
- package/dist/archive/filename-utils.d.ts +39 -0
- package/dist/archive/filename-utils.d.ts.map +1 -0
- package/dist/archive/filename-utils.js +78 -0
- package/dist/archive/filename-utils.js.map +1 -0
- package/dist/archive/index.d.ts +21 -0
- package/dist/archive/index.d.ts.map +1 -0
- package/dist/archive/index.js +45 -0
- package/dist/archive/index.js.map +1 -0
- package/dist/archive/manifest-extractor.d.ts +40 -0
- package/dist/archive/manifest-extractor.d.ts.map +1 -0
- package/dist/archive/manifest-extractor.js +456 -0
- package/dist/archive/manifest-extractor.js.map +1 -0
- package/dist/archive/migration.d.ts +59 -0
- package/dist/archive/migration.d.ts.map +1 -0
- package/dist/archive/migration.js +172 -0
- package/dist/archive/migration.js.map +1 -0
- package/dist/archive/plan-cataloger.d.ts +24 -0
- package/dist/archive/plan-cataloger.d.ts.map +1 -0
- package/dist/archive/plan-cataloger.js +100 -0
- package/dist/archive/plan-cataloger.js.map +1 -0
- package/dist/archive/plan-extractor.d.ts +84 -0
- package/dist/archive/plan-extractor.d.ts.map +1 -0
- package/dist/archive/plan-extractor.js +371 -0
- package/dist/archive/plan-extractor.js.map +1 -0
- package/dist/archive/search-indexer.d.ts +50 -0
- package/dist/archive/search-indexer.d.ts.map +1 -0
- package/dist/archive/search-indexer.js +294 -0
- package/dist/archive/search-indexer.js.map +1 -0
- package/dist/archive/subagent-store.d.ts +113 -0
- package/dist/archive/subagent-store.d.ts.map +1 -0
- package/dist/archive/subagent-store.js +173 -0
- package/dist/archive/subagent-store.js.map +1 -0
- package/dist/archive/types.d.ts +236 -0
- package/dist/archive/types.d.ts.map +1 -0
- package/dist/archive/types.js +30 -0
- package/dist/archive/types.js.map +1 -0
- package/dist/branding.d.ts +9 -0
- package/dist/branding.d.ts.map +1 -0
- package/dist/branding.js +50 -0
- package/dist/branding.js.map +1 -0
- package/dist/cache/git-utils.d.ts +36 -0
- package/dist/cache/git-utils.d.ts.map +1 -0
- package/dist/cache/git-utils.js +160 -0
- package/dist/cache/git-utils.js.map +1 -0
- package/dist/cache/hidden-projects.d.ts +19 -0
- package/dist/cache/hidden-projects.d.ts.map +1 -0
- package/dist/cache/hidden-projects.js +48 -0
- package/dist/cache/hidden-projects.js.map +1 -0
- package/dist/cache/index.d.ts +15 -0
- package/dist/cache/index.d.ts.map +1 -0
- package/dist/cache/index.js +20 -0
- package/dist/cache/index.js.map +1 -0
- package/dist/cache/metadata-extractor.d.ts +62 -0
- package/dist/cache/metadata-extractor.d.ts.map +1 -0
- package/dist/cache/metadata-extractor.js +574 -0
- package/dist/cache/metadata-extractor.js.map +1 -0
- package/dist/cache/mode-detector.d.ts +19 -0
- package/dist/cache/mode-detector.d.ts.map +1 -0
- package/dist/cache/mode-detector.js +161 -0
- package/dist/cache/mode-detector.js.map +1 -0
- package/dist/cache/persistence.d.ts +39 -0
- package/dist/cache/persistence.d.ts.map +1 -0
- package/dist/cache/persistence.js +98 -0
- package/dist/cache/persistence.js.map +1 -0
- package/dist/cache/project-discovery.d.ts +41 -0
- package/dist/cache/project-discovery.d.ts.map +1 -0
- package/dist/cache/project-discovery.js +212 -0
- package/dist/cache/project-discovery.js.map +1 -0
- package/dist/cache/session-index.d.ts +258 -0
- package/dist/cache/session-index.d.ts.map +1 -0
- package/dist/cache/session-index.js +1030 -0
- package/dist/cache/session-index.js.map +1 -0
- package/dist/cache/types.d.ts +159 -0
- package/dist/cache/types.d.ts.map +1 -0
- package/dist/cache/types.js +29 -0
- package/dist/cache/types.js.map +1 -0
- package/dist/catalog/bulk-extractor.d.ts +18 -0
- package/dist/catalog/bulk-extractor.d.ts.map +1 -0
- package/dist/catalog/bulk-extractor.js +150 -0
- package/dist/catalog/bulk-extractor.js.map +1 -0
- package/dist/catalog/extractor.d.ts +53 -0
- package/dist/catalog/extractor.d.ts.map +1 -0
- package/dist/catalog/extractor.js +522 -0
- package/dist/catalog/extractor.js.map +1 -0
- package/dist/catalog/index.d.ts +10 -0
- package/dist/catalog/index.d.ts.map +1 -0
- package/dist/catalog/index.js +11 -0
- package/dist/catalog/index.js.map +1 -0
- package/dist/catalog/types.d.ts +134 -0
- package/dist/catalog/types.d.ts.map +1 -0
- package/dist/catalog/types.js +8 -0
- package/dist/catalog/types.js.map +1 -0
- package/dist/client/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +5 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/websocket-client.d.ts +96 -0
- package/dist/client/websocket-client.d.ts.map +1 -0
- package/dist/client/websocket-client.js +222 -0
- package/dist/client/websocket-client.js.map +1 -0
- package/dist/context/index.d.ts +13 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +26 -0
- package/dist/context/index.js.map +1 -0
- package/dist/context/indexer.d.ts +73 -0
- package/dist/context/indexer.d.ts.map +1 -0
- package/dist/context/indexer.js +233 -0
- package/dist/context/indexer.js.map +1 -0
- package/dist/context/manager.d.ts +66 -0
- package/dist/context/manager.d.ts.map +1 -0
- package/dist/context/manager.js +310 -0
- package/dist/context/manager.js.map +1 -0
- package/dist/context/types.d.ts +149 -0
- package/dist/context/types.d.ts.map +1 -0
- package/dist/context/types.js +36 -0
- package/dist/context/types.js.map +1 -0
- package/dist/handoff/catalog.d.ts +54 -0
- package/dist/handoff/catalog.d.ts.map +1 -0
- package/dist/handoff/catalog.js +121 -0
- package/dist/handoff/catalog.js.map +1 -0
- package/dist/handoff/generator.d.ts +107 -0
- package/dist/handoff/generator.d.ts.map +1 -0
- package/dist/handoff/generator.js +603 -0
- package/dist/handoff/generator.js.map +1 -0
- package/dist/handoff/index.d.ts +13 -0
- package/dist/handoff/index.d.ts.map +1 -0
- package/dist/handoff/index.js +12 -0
- package/dist/handoff/index.js.map +1 -0
- package/dist/handoff/llm-generator.d.ts +77 -0
- package/dist/handoff/llm-generator.d.ts.map +1 -0
- package/dist/handoff/llm-generator.js +513 -0
- package/dist/handoff/llm-generator.js.map +1 -0
- package/dist/handoff/prompts.d.ts +18 -0
- package/dist/handoff/prompts.d.ts.map +1 -0
- package/dist/handoff/prompts.js +22 -0
- package/dist/handoff/prompts.js.map +1 -0
- package/dist/handoff/types.d.ts +28 -0
- package/dist/handoff/types.d.ts.map +1 -0
- package/dist/handoff/types.js +7 -0
- package/dist/handoff/types.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +132 -0
- package/dist/index.js.map +1 -0
- package/dist/logging/claude-operations.d.ts +111 -0
- package/dist/logging/claude-operations.d.ts.map +1 -0
- package/dist/logging/claude-operations.js +132 -0
- package/dist/logging/claude-operations.js.map +1 -0
- package/dist/logging/error-utils.d.ts +18 -0
- package/dist/logging/error-utils.d.ts.map +1 -0
- package/dist/logging/error-utils.js +37 -0
- package/dist/logging/error-utils.js.map +1 -0
- package/dist/logging/index.d.ts +11 -0
- package/dist/logging/index.d.ts.map +1 -0
- package/dist/logging/index.js +10 -0
- package/dist/logging/index.js.map +1 -0
- package/dist/logging/logger.d.ts +25 -0
- package/dist/logging/logger.d.ts.map +1 -0
- package/dist/logging/logger.js +39 -0
- package/dist/logging/logger.js.map +1 -0
- package/dist/notifications/constants.d.ts +16 -0
- package/dist/notifications/constants.d.ts.map +1 -0
- package/dist/notifications/constants.js +49 -0
- package/dist/notifications/constants.js.map +1 -0
- package/dist/notifications/index.d.ts +9 -0
- package/dist/notifications/index.d.ts.map +1 -0
- package/dist/notifications/index.js +8 -0
- package/dist/notifications/index.js.map +1 -0
- package/dist/notifications/types.d.ts +28 -0
- package/dist/notifications/types.d.ts.map +1 -0
- package/dist/notifications/types.js +7 -0
- package/dist/notifications/types.js.map +1 -0
- package/dist/notifications/utils.d.ts +20 -0
- package/dist/notifications/utils.d.ts.map +1 -0
- package/dist/notifications/utils.js +37 -0
- package/dist/notifications/utils.js.map +1 -0
- package/dist/plan/index.d.ts +12 -0
- package/dist/plan/index.d.ts.map +1 -0
- package/dist/plan/index.js +15 -0
- package/dist/plan/index.js.map +1 -0
- package/dist/plan/plan-parser.d.ts +33 -0
- package/dist/plan/plan-parser.d.ts.map +1 -0
- package/dist/plan/plan-parser.js +189 -0
- package/dist/plan/plan-parser.js.map +1 -0
- package/dist/plan/progress-computer.d.ts +34 -0
- package/dist/plan/progress-computer.d.ts.map +1 -0
- package/dist/plan/progress-computer.js +211 -0
- package/dist/plan/progress-computer.js.map +1 -0
- package/dist/plan/progress-matcher.d.ts +34 -0
- package/dist/plan/progress-matcher.d.ts.map +1 -0
- package/dist/plan/progress-matcher.js +297 -0
- package/dist/plan/progress-matcher.js.map +1 -0
- package/dist/plan/task-extractor.d.ts +30 -0
- package/dist/plan/task-extractor.d.ts.map +1 -0
- package/dist/plan/task-extractor.js +435 -0
- package/dist/plan/task-extractor.js.map +1 -0
- package/dist/plan/types.d.ts +131 -0
- package/dist/plan/types.d.ts.map +1 -0
- package/dist/plan/types.js +8 -0
- package/dist/plan/types.js.map +1 -0
- package/dist/project/aggregator.d.ts +43 -0
- package/dist/project/aggregator.d.ts.map +1 -0
- package/dist/project/aggregator.js +218 -0
- package/dist/project/aggregator.js.map +1 -0
- package/dist/project/index.d.ts +9 -0
- package/dist/project/index.d.ts.map +1 -0
- package/dist/project/index.js +9 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/types.d.ts +65 -0
- package/dist/project/types.d.ts.map +1 -0
- package/dist/project/types.js +27 -0
- package/dist/project/types.js.map +1 -0
- package/dist/session/detector.d.ts +113 -0
- package/dist/session/detector.d.ts.map +1 -0
- package/dist/session/detector.js +333 -0
- package/dist/session/detector.js.map +1 -0
- package/dist/session/filters.d.ts +32 -0
- package/dist/session/filters.d.ts.map +1 -0
- package/dist/session/filters.js +100 -0
- package/dist/session/filters.js.map +1 -0
- package/dist/session/format-title.d.ts +16 -0
- package/dist/session/format-title.d.ts.map +1 -0
- package/dist/session/format-title.js +54 -0
- package/dist/session/format-title.js.map +1 -0
- package/dist/session/index.d.ts +16 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +10 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/parser.d.ts +264 -0
- package/dist/session/parser.d.ts.map +1 -0
- package/dist/session/parser.js +588 -0
- package/dist/session/parser.js.map +1 -0
- package/dist/session/token-estimator.d.ts +32 -0
- package/dist/session/token-estimator.d.ts.map +1 -0
- package/dist/session/token-estimator.js +139 -0
- package/dist/session/token-estimator.js.map +1 -0
- package/dist/session/transformer.d.ts +126 -0
- package/dist/session/transformer.d.ts.map +1 -0
- package/dist/session/transformer.js +158 -0
- package/dist/session/transformer.js.map +1 -0
- package/dist/setup/hooks-config.d.ts +35 -0
- package/dist/setup/hooks-config.d.ts.map +1 -0
- package/dist/setup/hooks-config.js +107 -0
- package/dist/setup/hooks-config.js.map +1 -0
- package/dist/setup/hooks-symlink.d.ts +17 -0
- package/dist/setup/hooks-symlink.d.ts.map +1 -0
- package/dist/setup/hooks-symlink.js +89 -0
- package/dist/setup/hooks-symlink.js.map +1 -0
- package/dist/setup/index.d.ts +13 -0
- package/dist/setup/index.d.ts.map +1 -0
- package/dist/setup/index.js +12 -0
- package/dist/setup/index.js.map +1 -0
- package/dist/setup/prerequisites.d.ts +11 -0
- package/dist/setup/prerequisites.d.ts.map +1 -0
- package/dist/setup/prerequisites.js +72 -0
- package/dist/setup/prerequisites.js.map +1 -0
- package/dist/setup/settings-merge.d.ts +33 -0
- package/dist/setup/settings-merge.d.ts.map +1 -0
- package/dist/setup/settings-merge.js +131 -0
- package/dist/setup/settings-merge.js.map +1 -0
- package/dist/setup/skills-install.d.ts +17 -0
- package/dist/setup/skills-install.d.ts.map +1 -0
- package/dist/setup/skills-install.js +60 -0
- package/dist/setup/skills-install.js.map +1 -0
- package/dist/setup/types.d.ts +39 -0
- package/dist/setup/types.d.ts.map +1 -0
- package/dist/setup/types.js +7 -0
- package/dist/setup/types.js.map +1 -0
- package/dist/setup/verification.d.ts +9 -0
- package/dist/setup/verification.d.ts.map +1 -0
- package/dist/setup/verification.js +91 -0
- package/dist/setup/verification.js.map +1 -0
- package/dist/shortcuts/index.d.ts +8 -0
- package/dist/shortcuts/index.d.ts.map +1 -0
- package/dist/shortcuts/index.js +6 -0
- package/dist/shortcuts/index.js.map +1 -0
- package/dist/shortcuts/key-utils.d.ts +54 -0
- package/dist/shortcuts/key-utils.d.ts.map +1 -0
- package/dist/shortcuts/key-utils.js +129 -0
- package/dist/shortcuts/key-utils.js.map +1 -0
- package/dist/shortcuts/shortcut-registry.d.ts +37 -0
- package/dist/shortcuts/shortcut-registry.d.ts.map +1 -0
- package/dist/shortcuts/shortcut-registry.js +322 -0
- package/dist/shortcuts/shortcut-registry.js.map +1 -0
- package/dist/sources/config.d.ts +91 -0
- package/dist/sources/config.d.ts.map +1 -0
- package/dist/sources/config.js +229 -0
- package/dist/sources/config.js.map +1 -0
- package/dist/sources/googledocs.d.ts +43 -0
- package/dist/sources/googledocs.d.ts.map +1 -0
- package/dist/sources/googledocs.js +298 -0
- package/dist/sources/googledocs.js.map +1 -0
- package/dist/sources/index.d.ts +14 -0
- package/dist/sources/index.d.ts.map +1 -0
- package/dist/sources/index.js +19 -0
- package/dist/sources/index.js.map +1 -0
- package/dist/sources/notion.d.ts +35 -0
- package/dist/sources/notion.d.ts.map +1 -0
- package/dist/sources/notion.js +352 -0
- package/dist/sources/notion.js.map +1 -0
- package/dist/sources/obsidian.d.ts +38 -0
- package/dist/sources/obsidian.d.ts.map +1 -0
- package/dist/sources/obsidian.js +228 -0
- package/dist/sources/obsidian.js.map +1 -0
- package/dist/sources/types.d.ts +133 -0
- package/dist/sources/types.d.ts.map +1 -0
- package/dist/sources/types.js +19 -0
- package/dist/sources/types.js.map +1 -0
- package/dist/storage/index.d.ts +6 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +5 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/writer.d.ts +86 -0
- package/dist/storage/writer.d.ts.map +1 -0
- package/dist/storage/writer.js +137 -0
- package/dist/storage/writer.js.map +1 -0
- package/dist/types.d.ts +203 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/claude-token.d.ts +49 -0
- package/dist/utils/claude-token.d.ts.map +1 -0
- package/dist/utils/claude-token.js +169 -0
- package/dist/utils/claude-token.js.map +1 -0
- package/dist/utils/index.d.ts +7 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +13 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/settings.d.ts +100 -0
- package/dist/utils/settings.d.ts.map +1 -0
- package/dist/utils/settings.js +206 -0
- package/dist/utils/settings.js.map +1 -0
- package/package.json +54 -0
|
@@ -0,0 +1,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 @@
|
|
|
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
|