causantic 0.7.2 → 0.8.0

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 (128) hide show
  1. package/README.md +5 -4
  2. package/config.schema.json +46 -0
  3. package/dist/cli/commands/init/api-key.d.ts +2 -0
  4. package/dist/cli/commands/init/api-key.d.ts.map +1 -0
  5. package/dist/cli/commands/init/api-key.js +26 -0
  6. package/dist/cli/commands/init/api-key.js.map +1 -0
  7. package/dist/cli/commands/init/encryption.d.ts +2 -0
  8. package/dist/cli/commands/init/encryption.d.ts.map +1 -0
  9. package/dist/cli/commands/init/encryption.js +104 -0
  10. package/dist/cli/commands/init/encryption.js.map +1 -0
  11. package/dist/cli/commands/init/health.d.ts +2 -0
  12. package/dist/cli/commands/init/health.d.ts.map +1 -0
  13. package/dist/cli/commands/init/health.js +15 -0
  14. package/dist/cli/commands/init/health.js.map +1 -0
  15. package/dist/cli/commands/init/hooks.d.ts +2 -0
  16. package/dist/cli/commands/init/hooks.d.ts.map +1 -0
  17. package/dist/cli/commands/init/hooks.js +92 -0
  18. package/dist/cli/commands/init/hooks.js.map +1 -0
  19. package/dist/cli/commands/init/index.d.ts +3 -0
  20. package/dist/cli/commands/init/index.d.ts.map +1 -0
  21. package/dist/cli/commands/init/index.js +95 -0
  22. package/dist/cli/commands/init/index.js.map +1 -0
  23. package/dist/cli/commands/init/ingest.d.ts +2 -0
  24. package/dist/cli/commands/init/ingest.d.ts.map +1 -0
  25. package/dist/cli/commands/init/ingest.js +171 -0
  26. package/dist/cli/commands/init/ingest.js.map +1 -0
  27. package/dist/cli/commands/init/mcp-config.d.ts +9 -0
  28. package/dist/cli/commands/init/mcp-config.d.ts.map +1 -0
  29. package/dist/cli/commands/init/mcp-config.js +191 -0
  30. package/dist/cli/commands/init/mcp-config.js.map +1 -0
  31. package/dist/cli/commands/init/shared.d.ts +9 -0
  32. package/dist/cli/commands/init/shared.d.ts.map +1 -0
  33. package/dist/cli/commands/init/shared.js +58 -0
  34. package/dist/cli/commands/init/shared.js.map +1 -0
  35. package/dist/cli/commands/init/skills.d.ts +2 -0
  36. package/dist/cli/commands/init/skills.d.ts.map +1 -0
  37. package/dist/cli/commands/init/skills.js +68 -0
  38. package/dist/cli/commands/init/skills.js.map +1 -0
  39. package/dist/cli/commands/reindex.d.ts +8 -0
  40. package/dist/cli/commands/reindex.d.ts.map +1 -0
  41. package/dist/cli/commands/reindex.js +143 -0
  42. package/dist/cli/commands/reindex.js.map +1 -0
  43. package/dist/cli/index.js +4 -7
  44. package/dist/cli/index.js.map +1 -1
  45. package/dist/clusters/cluster-manager.d.ts +23 -0
  46. package/dist/clusters/cluster-manager.d.ts.map +1 -1
  47. package/dist/clusters/cluster-manager.js +134 -0
  48. package/dist/clusters/cluster-manager.js.map +1 -1
  49. package/dist/clusters/hdbscan-model-store.d.ts +37 -0
  50. package/dist/clusters/hdbscan-model-store.d.ts.map +1 -0
  51. package/dist/clusters/hdbscan-model-store.js +73 -0
  52. package/dist/clusters/hdbscan-model-store.js.map +1 -0
  53. package/dist/config/loader.d.ts +8 -0
  54. package/dist/config/loader.d.ts.map +1 -1
  55. package/dist/config/loader.js +38 -0
  56. package/dist/config/loader.js.map +1 -1
  57. package/dist/config/memory-config.d.ts +6 -0
  58. package/dist/config/memory-config.d.ts.map +1 -1
  59. package/dist/config/memory-config.js +6 -0
  60. package/dist/config/memory-config.js.map +1 -1
  61. package/dist/dashboard/client/assets/index-Bv5lFW-1.js +17 -0
  62. package/dist/dashboard/client/assets/index-DTriNsi9.css +1 -0
  63. package/dist/dashboard/client/index.html +2 -2
  64. package/dist/ingest/ingest-session.d.ts.map +1 -1
  65. package/dist/ingest/ingest-session.js +165 -217
  66. package/dist/ingest/ingest-session.js.map +1 -1
  67. package/dist/maintenance/scheduler.d.ts.map +1 -1
  68. package/dist/maintenance/scheduler.js +17 -6
  69. package/dist/maintenance/scheduler.js.map +1 -1
  70. package/dist/maintenance/tasks/update-clusters.d.ts +9 -0
  71. package/dist/maintenance/tasks/update-clusters.d.ts.map +1 -1
  72. package/dist/maintenance/tasks/update-clusters.js +26 -7
  73. package/dist/maintenance/tasks/update-clusters.js.map +1 -1
  74. package/dist/mcp/server.d.ts.map +1 -1
  75. package/dist/mcp/server.js +1 -6
  76. package/dist/mcp/server.js.map +1 -1
  77. package/dist/mcp/services.d.ts +27 -0
  78. package/dist/mcp/services.d.ts.map +1 -0
  79. package/dist/mcp/services.js +99 -0
  80. package/dist/mcp/services.js.map +1 -0
  81. package/dist/mcp/tools.d.ts.map +1 -1
  82. package/dist/mcp/tools.js +39 -102
  83. package/dist/mcp/tools.js.map +1 -1
  84. package/dist/models/embedder.d.ts.map +1 -1
  85. package/dist/models/embedder.js +2 -0
  86. package/dist/models/embedder.js.map +1 -1
  87. package/dist/retrieval/chain-assembler.js +2 -6
  88. package/dist/retrieval/chain-assembler.js.map +1 -1
  89. package/dist/retrieval/chain-walker.d.ts +12 -6
  90. package/dist/retrieval/chain-walker.d.ts.map +1 -1
  91. package/dist/retrieval/chain-walker.js +121 -84
  92. package/dist/retrieval/chain-walker.js.map +1 -1
  93. package/dist/retrieval/cluster-expander.d.ts +1 -1
  94. package/dist/retrieval/cluster-expander.d.ts.map +1 -1
  95. package/dist/retrieval/cluster-expander.js +13 -1
  96. package/dist/retrieval/cluster-expander.js.map +1 -1
  97. package/dist/retrieval/formatting.d.ts +13 -0
  98. package/dist/retrieval/formatting.d.ts.map +1 -0
  99. package/dist/retrieval/formatting.js +27 -0
  100. package/dist/retrieval/formatting.js.map +1 -0
  101. package/dist/retrieval/search-assembler.d.ts.map +1 -1
  102. package/dist/retrieval/search-assembler.js +21 -15
  103. package/dist/retrieval/search-assembler.js.map +1 -1
  104. package/dist/storage/feedback-store.d.ts +34 -0
  105. package/dist/storage/feedback-store.d.ts.map +1 -0
  106. package/dist/storage/feedback-store.js +67 -0
  107. package/dist/storage/feedback-store.js.map +1 -0
  108. package/dist/storage/migrations.d.ts.map +1 -1
  109. package/dist/storage/migrations.js +68 -0
  110. package/dist/storage/migrations.js.map +1 -1
  111. package/dist/storage/schema.sql +24 -2
  112. package/dist/storage/vector-store.d.ts +20 -0
  113. package/dist/storage/vector-store.d.ts.map +1 -1
  114. package/dist/storage/vector-store.js +66 -26
  115. package/dist/storage/vector-store.js.map +1 -1
  116. package/dist/utils/version.d.ts +2 -0
  117. package/dist/utils/version.d.ts.map +1 -0
  118. package/dist/utils/version.js +7 -0
  119. package/dist/utils/version.js.map +1 -0
  120. package/package.json +8 -7
  121. package/src/dashboard/client/package-lock.json +179 -880
  122. package/src/dashboard/client/package.json +3 -3
  123. package/dist/cli/commands/init.d.ts +0 -3
  124. package/dist/cli/commands/init.d.ts.map +0 -1
  125. package/dist/cli/commands/init.js +0 -781
  126. package/dist/cli/commands/init.js.map +0 -1
  127. package/dist/dashboard/client/assets/index-BmZeW-Jd.css +0 -1
  128. package/dist/dashboard/client/assets/index-Br0W1mEc.js +0 -166
package/README.md CHANGED
@@ -72,8 +72,8 @@ All data stays on your machine. Optional per-chunk encryption (ChaCha20-Poly1305
72
72
  **2. Hybrid BM25 + Vector Search**
73
73
  Vector search finds chunks that _look similar_. BM25 keyword search finds chunks with _exact lexical matches_ — function names, error codes, CLI flags. Both run in parallel and fuse via Reciprocal Rank Fusion (RRF).
74
74
 
75
- **3. Sequential Causal Graph with Episodic Chain Walking**
76
- Chunks are connected in a sequential linked list — intra-turn chunks chained sequentially, inter-turn edges linking last→first, cross-session edges bridging sessions. The `recall` tool walks this graph backward to reconstruct episodic narratives; `predict` walks forward. Chains are scored by cosine similarity per token, producing ordered narratives where each chunk adds new information.
75
+ **3. Causal Graph with Multi-Path Chain Walking**
76
+ Chunks are connected in a sequential linked list — intra-turn chunks chained sequentially, inter-turn edges linking last→first, cross-session edges bridging sessions. The `recall` tool walks this graph backward to reconstruct episodic narratives; `predict` walks forward. At branching points (agent transitions, cross-session links), multi-path DFS explores all alternatives and selects the best chain by median cosine similarity, producing ordered narratives where each chunk adds new information.
77
77
 
78
78
  **4. HDBSCAN Cluster-Guided Expansion**
79
79
  Topic clusters group semantically related chunks. During retrieval, results expand through cluster siblings — surfacing context that neither vector nor keyword search found independently. Native TypeScript implementation (130× faster than hdbscan-ts).
@@ -189,7 +189,7 @@ Or run `npx causantic init` to configure automatically.
189
189
 
190
190
  ## Skills
191
191
 
192
- Causantic installs 14 Claude Code slash commands (via `npx causantic init`) for natural-language interaction with memory:
192
+ Causantic installs 15 Claude Code slash commands (via `npx causantic init`) for natural-language interaction with memory:
193
193
 
194
194
  | Skill | Description |
195
195
  | ------------------------------- | -------------------------------------------------------------------------------------------------------------------- |
@@ -206,6 +206,7 @@ Causantic installs 14 Claude Code slash commands (via `npx causantic init`) for
206
206
  | `/causantic-crossref [pattern]` | Search across all projects for reusable patterns |
207
207
  | `/causantic-retro [scope]` | Surface recurring patterns, problems, and decisions across sessions |
208
208
  | `/causantic-cleanup` | Memory-informed codebase review and cleanup plan |
209
+ | `/causantic-roadmap [goal]` | Gather deferred work and goals into a phased roadmap |
209
210
  | `/causantic-forget [query]` | Delete memory by topic, time range, or session (always previews first) |
210
211
 
211
212
  Skills are installed to `~/.claude/skills/causantic-*/` and work as slash commands in Claude Code. They orchestrate the MCP tools above with structured prompts tailored to each use case.
@@ -274,7 +275,7 @@ See [Security Guide](docs/guides/security.md).
274
275
  - [User Guides](docs/guides/) — Dashboard, benchmarking, integration, security, maintenance
275
276
  - [CLI Reference](docs/reference/cli-commands.md) — All commands and options
276
277
  - [MCP Tools Reference](docs/reference/mcp-tools.md) — Tool schemas and usage
277
- - [Skills Reference](docs/reference/skills.md) — All 14 slash commands
278
+ - [Skills Reference](docs/reference/skills.md) — All 15 slash commands
278
279
  - [Configuration Reference](docs/reference/configuration.md) — All configuration options
279
280
  - [Research Documentation](docs/research/) — Experiment results and design decisions
280
281
  - [Design Decision Log](docs/research/decisions.md) — Why things are the way they are
@@ -22,6 +22,13 @@
22
22
  "maximum": 100,
23
23
  "default": 4,
24
24
  "description": "Minimum points required to form a cluster"
25
+ },
26
+ "incrementalThreshold": {
27
+ "type": "number",
28
+ "minimum": 0.01,
29
+ "maximum": 1,
30
+ "default": 0.3,
31
+ "description": "Ratio of new chunks (vs total at last full recluster) that triggers a full recluster. 0.3 = 30%."
25
32
  }
26
33
  },
27
34
  "additionalProperties": false
@@ -93,6 +100,11 @@
93
100
  "maximum": 1000,
94
101
  "default": 30,
95
102
  "description": "Rate limit for LLM refresh calls per minute"
103
+ },
104
+ "enableLabelling": {
105
+ "type": "boolean",
106
+ "default": true,
107
+ "description": "Enable LLM-based cluster labelling. Requires Anthropic API key. Set to false for fully local usage without an API key."
96
108
  }
97
109
  },
98
110
  "additionalProperties": false
@@ -156,6 +168,12 @@
156
168
  "enum": ["auto", "coreml", "cuda", "cpu", "wasm"],
157
169
  "default": "auto",
158
170
  "description": "Device for embedding inference. 'auto' detects hardware capabilities."
171
+ },
172
+ "model": {
173
+ "type": "string",
174
+ "enum": ["jina-small", "nomic-v1.5", "jina-code", "bge-small"],
175
+ "default": "jina-small",
176
+ "description": "Embedding model. Changing model requires running 'npx causantic reindex' to re-embed all chunks."
159
177
  }
160
178
  },
161
179
  "additionalProperties": false
@@ -184,6 +202,34 @@
184
202
  "maximum": 1,
185
203
  "default": 0.7,
186
204
  "description": "MMR lambda: 0 = pure diversity, 1 = pure relevance"
205
+ },
206
+ "feedbackWeight": {
207
+ "type": "number",
208
+ "minimum": 0,
209
+ "maximum": 1,
210
+ "default": 0.1,
211
+ "description": "How much retrieval feedback influences cluster expansion scoring. 0 = disabled, 1 = maximum influence."
212
+ }
213
+ },
214
+ "additionalProperties": false
215
+ },
216
+ "recency": {
217
+ "type": "object",
218
+ "description": "Recency boost settings for time-decay scoring",
219
+ "properties": {
220
+ "decayFactor": {
221
+ "type": "number",
222
+ "minimum": 0,
223
+ "maximum": 1,
224
+ "default": 0.3,
225
+ "description": "Amplitude of the time-decay boost (multiplied by exp decay)"
226
+ },
227
+ "halfLifeHours": {
228
+ "type": "number",
229
+ "minimum": 1,
230
+ "maximum": 8760,
231
+ "default": 48,
232
+ "description": "Half-life in hours for the decay function"
187
233
  }
188
234
  },
189
235
  "additionalProperties": false
@@ -0,0 +1,2 @@
1
+ export declare function offerApiKeySetup(): Promise<void>;
2
+ //# sourceMappingURL=api-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/api-key.ts"],"names":[],"mappings":"AAGA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuBtD"}
@@ -0,0 +1,26 @@
1
+ import { createSecretStore } from '../../../utils/secret-store.js';
2
+ import { promptPassword, promptYesNo } from '../../utils.js';
3
+ export async function offerApiKeySetup() {
4
+ console.log('');
5
+ console.log('Cluster labeling uses Claude Haiku to generate human-readable');
6
+ console.log('descriptions for topic clusters.');
7
+ if (!(await promptYesNo('Add Anthropic API key for cluster labeling?')))
8
+ return;
9
+ const apiKey = await promptPassword('Enter Anthropic API key: ');
10
+ if (apiKey && apiKey.startsWith('sk-ant-')) {
11
+ const store = createSecretStore();
12
+ await store.set('anthropic-api-key', apiKey);
13
+ console.log('\u2713 API key stored in system keychain');
14
+ // Set in env so update-clusters can use it for labeling
15
+ process.env.ANTHROPIC_API_KEY = apiKey;
16
+ }
17
+ else if (apiKey) {
18
+ console.log('\u26a0 Invalid API key format (should start with sk-ant-)');
19
+ console.log(' You can add it later with: causantic config set-key anthropic-api-key');
20
+ }
21
+ else {
22
+ console.log(' Skipping — clusters will be unlabeled.');
23
+ console.log(' Add a key later with: causantic config set-key anthropic-api-key');
24
+ }
25
+ }
26
+ //# sourceMappingURL=api-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-key.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/api-key.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gCAAgC,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7D,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;IAC7E,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAEhD,IAAI,CAAC,CAAC,MAAM,WAAW,CAAC,6CAA6C,CAAC,CAAC;QAAE,OAAO;IAEhF,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC,2BAA2B,CAAC,CAAC;IAEjE,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;QAClC,MAAM,KAAK,CAAC,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QAExD,wDAAwD;QACxD,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,MAAM,CAAC;IACzC,CAAC;SAAM,IAAI,MAAM,EAAE,CAAC;QAClB,OAAO,CAAC,GAAG,CAAC,2DAA2D,CAAC,CAAC;QACzE,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;IACzF,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,0CAA0C,CAAC,CAAC;QACxD,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;IACpF,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function setupEncryption(causanticDir: string): Promise<boolean>;
2
+ //# sourceMappingURL=encryption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/encryption.ts"],"names":[],"mappings":"AAKA,wBAAsB,eAAe,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA2E5E"}
@@ -0,0 +1,104 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import { getDb, storeDbKey } from '../../../storage/db.js';
4
+ import { promptYesNo } from '../../utils.js';
5
+ export async function setupEncryption(causanticDir) {
6
+ const dbPath = path.join(causanticDir, 'memory.db');
7
+ const existingDbExists = fs.existsSync(dbPath) && fs.statSync(dbPath).size > 0;
8
+ let existingDbIsUnencrypted = false;
9
+ if (existingDbExists) {
10
+ try {
11
+ const Database = (await import('better-sqlite3-multiple-ciphers')).default;
12
+ const testDb = new Database(dbPath);
13
+ testDb.prepare('SELECT 1').get();
14
+ testDb.close();
15
+ existingDbIsUnencrypted = true;
16
+ }
17
+ catch {
18
+ // DB exists but can't be opened without key — may already be encrypted
19
+ }
20
+ }
21
+ console.log('');
22
+ console.log('Enable database encryption?');
23
+ console.log('Protects conversation data, embeddings, and work patterns.');
24
+ if (existingDbIsUnencrypted) {
25
+ console.log('');
26
+ console.log('\u26a0 Existing unencrypted database detected.');
27
+ console.log(' Enabling encryption will back up the existing database and create a new encrypted one.');
28
+ console.log(' Your data will be migrated automatically.');
29
+ }
30
+ if (!(await promptYesNo('Enable encryption?')))
31
+ return false;
32
+ const { generatePassword } = await import('../../../storage/encryption.js');
33
+ if (existingDbIsUnencrypted) {
34
+ const backupPath = dbPath + '.unencrypted.bak';
35
+ fs.copyFileSync(dbPath, backupPath);
36
+ console.log(`\u2713 Backed up existing database to ${path.basename(backupPath)}`);
37
+ fs.unlinkSync(dbPath);
38
+ for (const suffix of ['-wal', '-shm']) {
39
+ const walPath = dbPath + suffix;
40
+ if (fs.existsSync(walPath))
41
+ fs.unlinkSync(walPath);
42
+ }
43
+ }
44
+ console.log('');
45
+ console.log('Generating encryption key...');
46
+ const key = generatePassword(32);
47
+ await storeDbKey(key);
48
+ const configPath = path.join(causanticDir, 'config.json');
49
+ const existingConfig = fs.existsSync(configPath)
50
+ ? JSON.parse(fs.readFileSync(configPath, 'utf-8'))
51
+ : {};
52
+ fs.writeFileSync(configPath, JSON.stringify({
53
+ ...existingConfig,
54
+ encryption: { enabled: true, cipher: 'chacha20', keySource: 'keychain' },
55
+ }, null, 2));
56
+ console.log('\u2713 Key stored in system keychain');
57
+ console.log('\u2713 Encryption enabled with ChaCha20-Poly1305');
58
+ if (existingDbIsUnencrypted) {
59
+ await migrateToEncryptedDb(dbPath);
60
+ }
61
+ return true;
62
+ }
63
+ async function migrateToEncryptedDb(dbPath) {
64
+ const backupPath = dbPath + '.unencrypted.bak';
65
+ try {
66
+ const newDb = getDb();
67
+ const Database = (await import('better-sqlite3-multiple-ciphers')).default;
68
+ const oldDb = new Database(backupPath);
69
+ // Skip schema_version (handled by migrations) and FTS5 shadow tables
70
+ // (populated automatically via triggers when chunks are inserted)
71
+ const tables = oldDb
72
+ .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name != 'schema_version' AND name NOT LIKE 'chunks_fts%'")
73
+ .all();
74
+ let migratedRows = 0;
75
+ for (const { name } of tables) {
76
+ const exists = newDb
77
+ .prepare("SELECT 1 FROM sqlite_master WHERE type='table' AND name=?")
78
+ .get(name);
79
+ if (!exists)
80
+ continue;
81
+ const rows = oldDb.prepare(`SELECT * FROM "${name}"`).all();
82
+ if (rows.length === 0)
83
+ continue;
84
+ const columns = Object.keys(rows[0]);
85
+ const placeholders = columns.map(() => '?').join(', ');
86
+ const insert = newDb.prepare(`INSERT OR IGNORE INTO "${name}" (${columns.map((c) => `"${c}"`).join(', ')}) VALUES (${placeholders})`);
87
+ const batchInsert = newDb.transaction((rowBatch) => {
88
+ for (const row of rowBatch) {
89
+ insert.run(...columns.map((c) => row[c]));
90
+ }
91
+ });
92
+ batchInsert(rows);
93
+ migratedRows += rows.length;
94
+ }
95
+ oldDb.close();
96
+ console.log(`\u2713 Migrated ${migratedRows} rows to encrypted database`);
97
+ }
98
+ catch (err) {
99
+ console.log(`\u26a0 Migration error: ${err.message}`);
100
+ console.log(` Backup preserved at: ${backupPath}`);
101
+ console.log(' You can manually re-import with: causantic import');
102
+ }
103
+ }
104
+ //# sourceMappingURL=encryption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/encryption.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function runHealthCheck(): Promise<void>;
2
+ //# sourceMappingURL=health.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/health.ts"],"names":[],"mappings":"AAAA,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAapD"}
@@ -0,0 +1,15 @@
1
+ export async function runHealthCheck() {
2
+ console.log('');
3
+ console.log('Running health check...');
4
+ try {
5
+ const { vectorStore } = await import('../../../storage/vector-store.js');
6
+ if (vectorStore && typeof vectorStore.count === 'function') {
7
+ await vectorStore.count();
8
+ }
9
+ console.log('\u2713 Vector store OK');
10
+ }
11
+ catch (error) {
12
+ console.log(`\u26a0 Vector store: ${error.message}`);
13
+ }
14
+ }
15
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/health.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAEvC,IAAI,CAAC;QACH,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;QACzE,IAAI,WAAW,IAAI,OAAO,WAAW,CAAC,KAAK,KAAK,UAAU,EAAE,CAAC;YAC3D,MAAM,WAAW,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;IACxC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,wBAAyB,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function configureHooks(claudeConfigPath: string): Promise<void>;
2
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/hooks.ts"],"names":[],"mappings":"AAGA,wBAAsB,cAAc,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwG5E"}
@@ -0,0 +1,92 @@
1
+ import * as fs from 'node:fs';
2
+ import { getCliEntryPath } from './shared.js';
3
+ export async function configureHooks(claudeConfigPath) {
4
+ try {
5
+ const settingsContent = fs.readFileSync(claudeConfigPath, 'utf-8');
6
+ const config = JSON.parse(settingsContent);
7
+ const cliEntry = getCliEntryPath();
8
+ const nodeBin = process.execPath;
9
+ const causanticHooks = [
10
+ {
11
+ event: 'PreCompact',
12
+ matcher: '',
13
+ hook: {
14
+ type: 'command',
15
+ command: `${nodeBin} ${cliEntry} hook pre-compact`,
16
+ timeout: 300,
17
+ async: true,
18
+ },
19
+ },
20
+ {
21
+ event: 'SessionStart',
22
+ matcher: '',
23
+ hook: {
24
+ type: 'command',
25
+ command: `${nodeBin} ${cliEntry} hook session-start`,
26
+ timeout: 60,
27
+ },
28
+ },
29
+ {
30
+ event: 'SessionEnd',
31
+ matcher: '',
32
+ hook: {
33
+ type: 'command',
34
+ command: `${nodeBin} ${cliEntry} hook session-end`,
35
+ timeout: 300,
36
+ async: true,
37
+ },
38
+ },
39
+ {
40
+ event: 'SessionEnd',
41
+ matcher: '',
42
+ hook: {
43
+ type: 'command',
44
+ command: `${nodeBin} ${cliEntry} hook claudemd-generator`,
45
+ timeout: 60,
46
+ async: true,
47
+ },
48
+ },
49
+ ];
50
+ if (!config.hooks) {
51
+ config.hooks = {};
52
+ }
53
+ // Extract the hook subcommand (e.g. "hook pre-compact") used to detect
54
+ // existing entries regardless of the install path that preceded it.
55
+ const hookSubcommand = (cmd) => {
56
+ const match = cmd.match(/hook\s+\S+/);
57
+ return match ? match[0] : cmd;
58
+ };
59
+ let hooksChanged = 0;
60
+ for (const { event, matcher, hook } of causanticHooks) {
61
+ if (!config.hooks[event]) {
62
+ config.hooks[event] = [];
63
+ }
64
+ const subCmd = hookSubcommand(hook.command);
65
+ // Check if an identical entry already exists (same hook object).
66
+ const hookStr = JSON.stringify(hook);
67
+ const exactMatch = config.hooks[event].some((entry) => entry.hooks?.some((h) => JSON.stringify(h) === hookStr));
68
+ if (exactMatch)
69
+ continue;
70
+ // Remove any stale entries for the same hook subcommand (e.g. from a
71
+ // different install path) so we don't accumulate duplicates.
72
+ config.hooks[event] = config.hooks[event].filter((entry) => !entry.hooks?.some((h) => h.command && hookSubcommand(h.command) === subCmd));
73
+ config.hooks[event].push({
74
+ matcher,
75
+ hooks: [hook],
76
+ });
77
+ hooksChanged++;
78
+ }
79
+ if (hooksChanged > 0) {
80
+ fs.writeFileSync(claudeConfigPath, JSON.stringify(config, null, 2));
81
+ const hookNames = causanticHooks.map((h) => h.event).join(', ');
82
+ console.log(`\u2713 Configured ${hooksChanged} Claude Code hooks (${hookNames})`);
83
+ }
84
+ else {
85
+ console.log('\u2713 Claude Code hooks already configured');
86
+ }
87
+ }
88
+ catch {
89
+ console.log('\u26a0 Could not configure Claude Code hooks');
90
+ }
91
+ }
92
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from '../../types.js';
2
+ export declare const initCommand: Command;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AA4C9C,eAAO,MAAM,WAAW,EAAE,OA0DzB,CAAC"}
@@ -0,0 +1,95 @@
1
+ import * as fs from 'node:fs';
2
+ import * as path from 'node:path';
3
+ import * as os from 'node:os';
4
+ import { getDb } from '../../../storage/db.js';
5
+ import { setupEncryption } from './encryption.js';
6
+ import { migrateMcpFromSettings, configureMcp, patchProjectMcpFiles } from './mcp-config.js';
7
+ import { configureHooks } from './hooks.js';
8
+ import { installSkillsAndClaudeMd } from './skills.js';
9
+ import { runHealthCheck } from './health.js';
10
+ import { offerBatchIngest } from './ingest.js';
11
+ function checkNodeVersion() {
12
+ const nodeVersion = process.versions.node;
13
+ const majorVersion = parseInt(nodeVersion.split('.')[0], 10);
14
+ if (majorVersion >= 20) {
15
+ console.log(`\u2713 Node.js ${nodeVersion}`);
16
+ }
17
+ else {
18
+ console.log(`\u2717 Node.js ${nodeVersion} (requires 20+)`);
19
+ process.exit(1);
20
+ }
21
+ }
22
+ function createDirectoryStructure(causanticDir) {
23
+ const vectorsDir = path.join(causanticDir, 'vectors');
24
+ for (const dir of [causanticDir, vectorsDir]) {
25
+ if (!fs.existsSync(dir)) {
26
+ fs.mkdirSync(dir, { recursive: true });
27
+ console.log(`\u2713 Created ${dir}`);
28
+ }
29
+ else {
30
+ console.log(`\u2713 Directory exists: ${dir}`);
31
+ }
32
+ }
33
+ }
34
+ function initializeDatabase(encryptionEnabled) {
35
+ try {
36
+ const db = getDb();
37
+ db.prepare('SELECT 1').get();
38
+ console.log('\u2713 Database initialized' + (encryptionEnabled ? ' (encrypted)' : ''));
39
+ }
40
+ catch (error) {
41
+ console.log(`\u2717 Database error: ${error.message}`);
42
+ process.exit(1);
43
+ }
44
+ }
45
+ export const initCommand = {
46
+ name: 'init',
47
+ description: 'Initialize Causantic (setup wizard)',
48
+ usage: 'causantic init [--skip-mcp] [--skip-encryption] [--skip-ingest]',
49
+ handler: async (args) => {
50
+ const skipMcp = args.includes('--skip-mcp');
51
+ const skipEncryption = args.includes('--skip-encryption');
52
+ const skipIngest = args.includes('--skip-ingest');
53
+ console.log('Causantic - Setup');
54
+ console.log('=================');
55
+ console.log('');
56
+ checkNodeVersion();
57
+ const causanticDir = path.join(os.homedir(), '.causantic');
58
+ createDirectoryStructure(causanticDir);
59
+ let encryptionEnabled = false;
60
+ if (!skipEncryption && process.stdin.isTTY) {
61
+ encryptionEnabled = await setupEncryption(causanticDir);
62
+ }
63
+ initializeDatabase(encryptionEnabled);
64
+ const claudeConfigPath = path.join(os.homedir(), '.claude', 'settings.json');
65
+ const mcpConfigPath = path.join(os.homedir(), '.claude.json');
66
+ console.log('');
67
+ if (!skipMcp) {
68
+ migrateMcpFromSettings(claudeConfigPath, mcpConfigPath);
69
+ await configureMcp(mcpConfigPath);
70
+ if (process.stdin.isTTY) {
71
+ await patchProjectMcpFiles();
72
+ }
73
+ await installSkillsAndClaudeMd();
74
+ await configureHooks(claudeConfigPath);
75
+ }
76
+ await runHealthCheck();
77
+ if (!skipIngest && process.stdin.isTTY) {
78
+ await offerBatchIngest();
79
+ }
80
+ console.log('');
81
+ console.log('Setup complete!');
82
+ console.log('');
83
+ console.log('Next steps:');
84
+ if (!skipIngest && process.stdin.isTTY) {
85
+ console.log(' 1. Restart Claude Code');
86
+ console.log(' 2. Ask Claude: "What did we work on recently?"');
87
+ }
88
+ else {
89
+ console.log(' 1. npx causantic batch-ingest ~/.claude/projects');
90
+ console.log(' 2. Restart Claude Code');
91
+ console.log(' 3. Ask Claude: "What did we work on recently?"');
92
+ }
93
+ },
94
+ };
95
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/cli/commands/init/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function offerBatchIngest(): Promise<void>;
2
+ //# sourceMappingURL=ingest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ingest.d.ts","sourceRoot":"","sources":["../../../../src/cli/commands/init/ingest.ts"],"names":[],"mappings":"AASA,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiMtD"}