shieldcortex 2.0.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 (377) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +282 -0
  3. package/dashboard/components.json +22 -0
  4. package/dashboard/eslint.config.mjs +42 -0
  5. package/dashboard/next.config.ts +7 -0
  6. package/dashboard/package-lock.json +8053 -0
  7. package/dashboard/package.json +44 -0
  8. package/dashboard/postcss.config.mjs +7 -0
  9. package/dashboard/public/file.svg +1 -0
  10. package/dashboard/public/globe.svg +1 -0
  11. package/dashboard/public/next.svg +1 -0
  12. package/dashboard/public/vercel.svg +1 -0
  13. package/dashboard/public/window.svg +1 -0
  14. package/dashboard/scripts/ensure-api.mjs +76 -0
  15. package/dashboard/src/app/error.tsx +49 -0
  16. package/dashboard/src/app/favicon.ico +0 -0
  17. package/dashboard/src/app/globals.css +130 -0
  18. package/dashboard/src/app/layout.tsx +35 -0
  19. package/dashboard/src/app/page.tsx +364 -0
  20. package/dashboard/src/components/Providers.tsx +27 -0
  21. package/dashboard/src/components/brain/ActivityPulseSystem.tsx +229 -0
  22. package/dashboard/src/components/brain/BrainMesh.tsx +133 -0
  23. package/dashboard/src/components/brain/BrainRegions.tsx +254 -0
  24. package/dashboard/src/components/brain/BrainScene.tsx +255 -0
  25. package/dashboard/src/components/brain/CategoryLabels.tsx +103 -0
  26. package/dashboard/src/components/brain/CoreSphere.tsx +215 -0
  27. package/dashboard/src/components/brain/DataFlowParticles.tsx +123 -0
  28. package/dashboard/src/components/brain/DataStreamRings.tsx +161 -0
  29. package/dashboard/src/components/brain/ElectronFlow.tsx +323 -0
  30. package/dashboard/src/components/brain/HolographicGrid.tsx +235 -0
  31. package/dashboard/src/components/brain/MemoryLinks.tsx +271 -0
  32. package/dashboard/src/components/brain/MemoryNode.tsx +245 -0
  33. package/dashboard/src/components/brain/NeuralPathways.tsx +441 -0
  34. package/dashboard/src/components/brain/SynapseNodes.tsx +312 -0
  35. package/dashboard/src/components/brain/TimelineControls.tsx +205 -0
  36. package/dashboard/src/components/chip/ChipScene.tsx +497 -0
  37. package/dashboard/src/components/chip/ChipSubstrate.tsx +238 -0
  38. package/dashboard/src/components/chip/CortexCore.tsx +210 -0
  39. package/dashboard/src/components/chip/DataBus.tsx +416 -0
  40. package/dashboard/src/components/chip/MemoryCell.tsx +225 -0
  41. package/dashboard/src/components/chip/MemoryGrid.tsx +328 -0
  42. package/dashboard/src/components/chip/QuantumCell.tsx +316 -0
  43. package/dashboard/src/components/chip/SectionLabel.tsx +113 -0
  44. package/dashboard/src/components/chip/index.ts +14 -0
  45. package/dashboard/src/components/controls/ControlPanel.tsx +106 -0
  46. package/dashboard/src/components/controls/VersionPanel.tsx +185 -0
  47. package/dashboard/src/components/dashboard/StatsPanel.tsx +164 -0
  48. package/dashboard/src/components/debug/ActivityLog.tsx +250 -0
  49. package/dashboard/src/components/debug/DebugPanel.tsx +101 -0
  50. package/dashboard/src/components/debug/QueryTester.tsx +192 -0
  51. package/dashboard/src/components/debug/RelationshipGraph.tsx +403 -0
  52. package/dashboard/src/components/debug/SqlConsole.tsx +319 -0
  53. package/dashboard/src/components/graph/KnowledgeGraph.tsx +230 -0
  54. package/dashboard/src/components/graph/OntologyGraph.tsx +631 -0
  55. package/dashboard/src/components/insights/ActivityHeatmap.tsx +131 -0
  56. package/dashboard/src/components/insights/InsightsView.tsx +46 -0
  57. package/dashboard/src/components/insights/KnowledgeMapPanel.tsx +80 -0
  58. package/dashboard/src/components/insights/QualityPanel.tsx +116 -0
  59. package/dashboard/src/components/memories/MemoriesView.tsx +150 -0
  60. package/dashboard/src/components/memories/MemoryCard.tsx +103 -0
  61. package/dashboard/src/components/memory/MemoryDetail.tsx +325 -0
  62. package/dashboard/src/components/nav/NavRail.tsx +54 -0
  63. package/dashboard/src/components/ui/button.tsx +62 -0
  64. package/dashboard/src/components/ui/card.tsx +92 -0
  65. package/dashboard/src/components/ui/input.tsx +21 -0
  66. package/dashboard/src/hooks/useDebouncedValue.ts +24 -0
  67. package/dashboard/src/hooks/useMemories.ts +458 -0
  68. package/dashboard/src/hooks/useSuggestions.ts +46 -0
  69. package/dashboard/src/lib/category-colors.ts +84 -0
  70. package/dashboard/src/lib/position-algorithm.ts +177 -0
  71. package/dashboard/src/lib/simplex-noise.ts +217 -0
  72. package/dashboard/src/lib/store.ts +88 -0
  73. package/dashboard/src/lib/utils.ts +6 -0
  74. package/dashboard/src/lib/websocket.ts +249 -0
  75. package/dashboard/src/types/memory.ts +73 -0
  76. package/dashboard/tsconfig.json +34 -0
  77. package/dist/__tests__/consolidation-merge.test.d.ts +9 -0
  78. package/dist/__tests__/consolidation-merge.test.d.ts.map +1 -0
  79. package/dist/__tests__/consolidation-merge.test.js +137 -0
  80. package/dist/__tests__/consolidation-merge.test.js.map +1 -0
  81. package/dist/__tests__/contradictions.test.d.ts +8 -0
  82. package/dist/__tests__/contradictions.test.d.ts.map +1 -0
  83. package/dist/__tests__/contradictions.test.js +78 -0
  84. package/dist/__tests__/contradictions.test.js.map +1 -0
  85. package/dist/__tests__/salience-evolution.test.d.ts +7 -0
  86. package/dist/__tests__/salience-evolution.test.d.ts.map +1 -0
  87. package/dist/__tests__/salience-evolution.test.js +151 -0
  88. package/dist/__tests__/salience-evolution.test.js.map +1 -0
  89. package/dist/__tests__/store.test.d.ts +7 -0
  90. package/dist/__tests__/store.test.d.ts.map +1 -0
  91. package/dist/__tests__/store.test.js +582 -0
  92. package/dist/__tests__/store.test.js.map +1 -0
  93. package/dist/api/control.d.ts +27 -0
  94. package/dist/api/control.d.ts.map +1 -0
  95. package/dist/api/control.js +60 -0
  96. package/dist/api/control.js.map +1 -0
  97. package/dist/api/events.d.ts +159 -0
  98. package/dist/api/events.d.ts.map +1 -0
  99. package/dist/api/events.js +155 -0
  100. package/dist/api/events.js.map +1 -0
  101. package/dist/api/version.d.ts +36 -0
  102. package/dist/api/version.d.ts.map +1 -0
  103. package/dist/api/version.js +146 -0
  104. package/dist/api/version.js.map +1 -0
  105. package/dist/api/visualization-server.d.ts +11 -0
  106. package/dist/api/visualization-server.d.ts.map +1 -0
  107. package/dist/api/visualization-server.js +1186 -0
  108. package/dist/api/visualization-server.js.map +1 -0
  109. package/dist/context/project-context.d.ts +57 -0
  110. package/dist/context/project-context.d.ts.map +1 -0
  111. package/dist/context/project-context.js +135 -0
  112. package/dist/context/project-context.js.map +1 -0
  113. package/dist/database/init.d.ts +49 -0
  114. package/dist/database/init.d.ts.map +1 -0
  115. package/dist/database/init.js +567 -0
  116. package/dist/database/init.js.map +1 -0
  117. package/dist/defence/__tests__/firewall.test.d.ts +8 -0
  118. package/dist/defence/__tests__/firewall.test.d.ts.map +1 -0
  119. package/dist/defence/__tests__/firewall.test.js +123 -0
  120. package/dist/defence/__tests__/firewall.test.js.map +1 -0
  121. package/dist/defence/__tests__/fragmentation.test.d.ts +7 -0
  122. package/dist/defence/__tests__/fragmentation.test.d.ts.map +1 -0
  123. package/dist/defence/__tests__/fragmentation.test.js +51 -0
  124. package/dist/defence/__tests__/fragmentation.test.js.map +1 -0
  125. package/dist/defence/__tests__/pipeline.test.d.ts +8 -0
  126. package/dist/defence/__tests__/pipeline.test.d.ts.map +1 -0
  127. package/dist/defence/__tests__/pipeline.test.js +61 -0
  128. package/dist/defence/__tests__/pipeline.test.js.map +1 -0
  129. package/dist/defence/__tests__/sensitivity.test.d.ts +7 -0
  130. package/dist/defence/__tests__/sensitivity.test.d.ts.map +1 -0
  131. package/dist/defence/__tests__/sensitivity.test.js +61 -0
  132. package/dist/defence/__tests__/sensitivity.test.js.map +1 -0
  133. package/dist/defence/__tests__/trust.test.d.ts +7 -0
  134. package/dist/defence/__tests__/trust.test.d.ts.map +1 -0
  135. package/dist/defence/__tests__/trust.test.js +49 -0
  136. package/dist/defence/__tests__/trust.test.js.map +1 -0
  137. package/dist/defence/audit/index.d.ts +4 -0
  138. package/dist/defence/audit/index.d.ts.map +1 -0
  139. package/dist/defence/audit/index.js +3 -0
  140. package/dist/defence/audit/index.js.map +1 -0
  141. package/dist/defence/audit/logger.d.ts +14 -0
  142. package/dist/defence/audit/logger.d.ts.map +1 -0
  143. package/dist/defence/audit/logger.js +54 -0
  144. package/dist/defence/audit/logger.js.map +1 -0
  145. package/dist/defence/audit/queries.d.ts +33 -0
  146. package/dist/defence/audit/queries.d.ts.map +1 -0
  147. package/dist/defence/audit/queries.js +103 -0
  148. package/dist/defence/audit/queries.js.map +1 -0
  149. package/dist/defence/firewall/anomaly-scorer.d.ts +8 -0
  150. package/dist/defence/firewall/anomaly-scorer.d.ts.map +1 -0
  151. package/dist/defence/firewall/anomaly-scorer.js +58 -0
  152. package/dist/defence/firewall/anomaly-scorer.js.map +1 -0
  153. package/dist/defence/firewall/encoding-detector.d.ts +13 -0
  154. package/dist/defence/firewall/encoding-detector.d.ts.map +1 -0
  155. package/dist/defence/firewall/encoding-detector.js +120 -0
  156. package/dist/defence/firewall/encoding-detector.js.map +1 -0
  157. package/dist/defence/firewall/index.d.ts +21 -0
  158. package/dist/defence/firewall/index.d.ts.map +1 -0
  159. package/dist/defence/firewall/index.js +133 -0
  160. package/dist/defence/firewall/index.js.map +1 -0
  161. package/dist/defence/firewall/instruction-detector.d.ts +12 -0
  162. package/dist/defence/firewall/instruction-detector.d.ts.map +1 -0
  163. package/dist/defence/firewall/instruction-detector.js +99 -0
  164. package/dist/defence/firewall/instruction-detector.js.map +1 -0
  165. package/dist/defence/firewall/privilege-detector.d.ts +13 -0
  166. package/dist/defence/firewall/privilege-detector.d.ts.map +1 -0
  167. package/dist/defence/firewall/privilege-detector.js +89 -0
  168. package/dist/defence/firewall/privilege-detector.js.map +1 -0
  169. package/dist/defence/fragmentation/assembly-detector.d.ts +18 -0
  170. package/dist/defence/fragmentation/assembly-detector.d.ts.map +1 -0
  171. package/dist/defence/fragmentation/assembly-detector.js +72 -0
  172. package/dist/defence/fragmentation/assembly-detector.js.map +1 -0
  173. package/dist/defence/fragmentation/entity-extractor.d.ts +19 -0
  174. package/dist/defence/fragmentation/entity-extractor.d.ts.map +1 -0
  175. package/dist/defence/fragmentation/entity-extractor.js +86 -0
  176. package/dist/defence/fragmentation/entity-extractor.js.map +1 -0
  177. package/dist/defence/fragmentation/index.d.ts +23 -0
  178. package/dist/defence/fragmentation/index.d.ts.map +1 -0
  179. package/dist/defence/fragmentation/index.js +49 -0
  180. package/dist/defence/fragmentation/index.js.map +1 -0
  181. package/dist/defence/fragmentation/temporal-analyzer.d.ts +28 -0
  182. package/dist/defence/fragmentation/temporal-analyzer.d.ts.map +1 -0
  183. package/dist/defence/fragmentation/temporal-analyzer.js +41 -0
  184. package/dist/defence/fragmentation/temporal-analyzer.js.map +1 -0
  185. package/dist/defence/index.d.ts +12 -0
  186. package/dist/defence/index.d.ts.map +1 -0
  187. package/dist/defence/index.js +18 -0
  188. package/dist/defence/index.js.map +1 -0
  189. package/dist/defence/pipeline.d.ts +9 -0
  190. package/dist/defence/pipeline.d.ts.map +1 -0
  191. package/dist/defence/pipeline.js +115 -0
  192. package/dist/defence/pipeline.js.map +1 -0
  193. package/dist/defence/scanner/index.d.ts +5 -0
  194. package/dist/defence/scanner/index.d.ts.map +1 -0
  195. package/dist/defence/scanner/index.js +5 -0
  196. package/dist/defence/scanner/index.js.map +1 -0
  197. package/dist/defence/scanner/scan-existing.d.ts +34 -0
  198. package/dist/defence/scanner/scan-existing.d.ts.map +1 -0
  199. package/dist/defence/scanner/scan-existing.js +136 -0
  200. package/dist/defence/scanner/scan-existing.js.map +1 -0
  201. package/dist/defence/sensitivity/classifier.d.ts +6 -0
  202. package/dist/defence/sensitivity/classifier.d.ts.map +1 -0
  203. package/dist/defence/sensitivity/classifier.js +50 -0
  204. package/dist/defence/sensitivity/classifier.js.map +1 -0
  205. package/dist/defence/sensitivity/index.d.ts +11 -0
  206. package/dist/defence/sensitivity/index.d.ts.map +1 -0
  207. package/dist/defence/sensitivity/index.js +13 -0
  208. package/dist/defence/sensitivity/index.js.map +1 -0
  209. package/dist/defence/sensitivity/patterns.d.ts +14 -0
  210. package/dist/defence/sensitivity/patterns.d.ts.map +1 -0
  211. package/dist/defence/sensitivity/patterns.js +67 -0
  212. package/dist/defence/sensitivity/patterns.js.map +1 -0
  213. package/dist/defence/sensitivity/redaction.d.ts +17 -0
  214. package/dist/defence/sensitivity/redaction.d.ts.map +1 -0
  215. package/dist/defence/sensitivity/redaction.js +47 -0
  216. package/dist/defence/sensitivity/redaction.js.map +1 -0
  217. package/dist/defence/trust/index.d.ts +3 -0
  218. package/dist/defence/trust/index.d.ts.map +1 -0
  219. package/dist/defence/trust/index.js +3 -0
  220. package/dist/defence/trust/index.js.map +1 -0
  221. package/dist/defence/trust/recall-filter.d.ts +10 -0
  222. package/dist/defence/trust/recall-filter.d.ts.map +1 -0
  223. package/dist/defence/trust/recall-filter.js +38 -0
  224. package/dist/defence/trust/recall-filter.js.map +1 -0
  225. package/dist/defence/trust/source-scorer.d.ts +6 -0
  226. package/dist/defence/trust/source-scorer.d.ts.map +1 -0
  227. package/dist/defence/trust/source-scorer.js +34 -0
  228. package/dist/defence/trust/source-scorer.js.map +1 -0
  229. package/dist/defence/types.d.ts +88 -0
  230. package/dist/defence/types.d.ts.map +1 -0
  231. package/dist/defence/types.js +15 -0
  232. package/dist/defence/types.js.map +1 -0
  233. package/dist/embeddings/generator.d.ts +20 -0
  234. package/dist/embeddings/generator.d.ts.map +1 -0
  235. package/dist/embeddings/generator.js +83 -0
  236. package/dist/embeddings/generator.js.map +1 -0
  237. package/dist/embeddings/index.d.ts +2 -0
  238. package/dist/embeddings/index.d.ts.map +1 -0
  239. package/dist/embeddings/index.js +2 -0
  240. package/dist/embeddings/index.js.map +1 -0
  241. package/dist/errors.d.ts +74 -0
  242. package/dist/errors.d.ts.map +1 -0
  243. package/dist/errors.js +131 -0
  244. package/dist/errors.js.map +1 -0
  245. package/dist/graph/backfill.d.ts +6 -0
  246. package/dist/graph/backfill.d.ts.map +1 -0
  247. package/dist/graph/backfill.js +33 -0
  248. package/dist/graph/backfill.js.map +1 -0
  249. package/dist/graph/extract.d.ts +21 -0
  250. package/dist/graph/extract.d.ts.map +1 -0
  251. package/dist/graph/extract.js +231 -0
  252. package/dist/graph/extract.js.map +1 -0
  253. package/dist/graph/resolve.d.ts +6 -0
  254. package/dist/graph/resolve.d.ts.map +1 -0
  255. package/dist/graph/resolve.js +126 -0
  256. package/dist/graph/resolve.js.map +1 -0
  257. package/dist/index.d.ts +31 -0
  258. package/dist/index.d.ts.map +1 -0
  259. package/dist/index.js +248 -0
  260. package/dist/index.js.map +1 -0
  261. package/dist/memory/activation.d.ts +69 -0
  262. package/dist/memory/activation.d.ts.map +1 -0
  263. package/dist/memory/activation.js +168 -0
  264. package/dist/memory/activation.js.map +1 -0
  265. package/dist/memory/consolidate.d.ts +98 -0
  266. package/dist/memory/consolidate.d.ts.map +1 -0
  267. package/dist/memory/consolidate.js +511 -0
  268. package/dist/memory/consolidate.js.map +1 -0
  269. package/dist/memory/contradiction.d.ts +69 -0
  270. package/dist/memory/contradiction.d.ts.map +1 -0
  271. package/dist/memory/contradiction.js +286 -0
  272. package/dist/memory/contradiction.js.map +1 -0
  273. package/dist/memory/decay.d.ts +62 -0
  274. package/dist/memory/decay.d.ts.map +1 -0
  275. package/dist/memory/decay.js +184 -0
  276. package/dist/memory/decay.js.map +1 -0
  277. package/dist/memory/salience.d.ts +36 -0
  278. package/dist/memory/salience.d.ts.map +1 -0
  279. package/dist/memory/salience.js +216 -0
  280. package/dist/memory/salience.js.map +1 -0
  281. package/dist/memory/similarity.d.ts +57 -0
  282. package/dist/memory/similarity.d.ts.map +1 -0
  283. package/dist/memory/similarity.js +114 -0
  284. package/dist/memory/similarity.js.map +1 -0
  285. package/dist/memory/store.d.ts +179 -0
  286. package/dist/memory/store.d.ts.map +1 -0
  287. package/dist/memory/store.js +1184 -0
  288. package/dist/memory/store.js.map +1 -0
  289. package/dist/memory/types.d.ts +97 -0
  290. package/dist/memory/types.d.ts.map +1 -0
  291. package/dist/memory/types.js +30 -0
  292. package/dist/memory/types.js.map +1 -0
  293. package/dist/server.d.ts +12 -0
  294. package/dist/server.d.ts.map +1 -0
  295. package/dist/server.js +568 -0
  296. package/dist/server.js.map +1 -0
  297. package/dist/service/install.d.ts +15 -0
  298. package/dist/service/install.d.ts.map +1 -0
  299. package/dist/service/install.js +178 -0
  300. package/dist/service/install.js.map +1 -0
  301. package/dist/service/templates.d.ts +13 -0
  302. package/dist/service/templates.d.ts.map +1 -0
  303. package/dist/service/templates.js +58 -0
  304. package/dist/service/templates.js.map +1 -0
  305. package/dist/setup/claude-md.d.ts +12 -0
  306. package/dist/setup/claude-md.d.ts.map +1 -0
  307. package/dist/setup/claude-md.js +68 -0
  308. package/dist/setup/claude-md.js.map +1 -0
  309. package/dist/setup/clawdbot.d.ts +15 -0
  310. package/dist/setup/clawdbot.d.ts.map +1 -0
  311. package/dist/setup/clawdbot.js +118 -0
  312. package/dist/setup/clawdbot.js.map +1 -0
  313. package/dist/setup/doctor.d.ts +5 -0
  314. package/dist/setup/doctor.d.ts.map +1 -0
  315. package/dist/setup/doctor.js +141 -0
  316. package/dist/setup/doctor.js.map +1 -0
  317. package/dist/setup/hooks.d.ts +6 -0
  318. package/dist/setup/hooks.d.ts.map +1 -0
  319. package/dist/setup/hooks.js +36 -0
  320. package/dist/setup/hooks.js.map +1 -0
  321. package/dist/setup/migrate.d.ts +16 -0
  322. package/dist/setup/migrate.d.ts.map +1 -0
  323. package/dist/setup/migrate.js +164 -0
  324. package/dist/setup/migrate.js.map +1 -0
  325. package/dist/setup/settings-hooks.d.ts +7 -0
  326. package/dist/setup/settings-hooks.d.ts.map +1 -0
  327. package/dist/setup/settings-hooks.js +83 -0
  328. package/dist/setup/settings-hooks.js.map +1 -0
  329. package/dist/setup/uninstall.d.ts +12 -0
  330. package/dist/setup/uninstall.d.ts.map +1 -0
  331. package/dist/setup/uninstall.js +125 -0
  332. package/dist/setup/uninstall.js.map +1 -0
  333. package/dist/tools/context.d.ts +135 -0
  334. package/dist/tools/context.d.ts.map +1 -0
  335. package/dist/tools/context.js +273 -0
  336. package/dist/tools/context.js.map +1 -0
  337. package/dist/tools/forget.d.ts +53 -0
  338. package/dist/tools/forget.d.ts.map +1 -0
  339. package/dist/tools/forget.js +179 -0
  340. package/dist/tools/forget.js.map +1 -0
  341. package/dist/tools/graph.d.ts +46 -0
  342. package/dist/tools/graph.d.ts.map +1 -0
  343. package/dist/tools/graph.js +206 -0
  344. package/dist/tools/graph.js.map +1 -0
  345. package/dist/tools/recall.d.ts +79 -0
  346. package/dist/tools/recall.d.ts.map +1 -0
  347. package/dist/tools/recall.js +156 -0
  348. package/dist/tools/recall.js.map +1 -0
  349. package/dist/tools/remember.d.ts +83 -0
  350. package/dist/tools/remember.d.ts.map +1 -0
  351. package/dist/tools/remember.js +151 -0
  352. package/dist/tools/remember.js.map +1 -0
  353. package/dist/worker/brain-worker.d.ts +100 -0
  354. package/dist/worker/brain-worker.d.ts.map +1 -0
  355. package/dist/worker/brain-worker.js +283 -0
  356. package/dist/worker/brain-worker.js.map +1 -0
  357. package/dist/worker/link-discovery.d.ts +47 -0
  358. package/dist/worker/link-discovery.d.ts.map +1 -0
  359. package/dist/worker/link-discovery.js +103 -0
  360. package/dist/worker/link-discovery.js.map +1 -0
  361. package/dist/worker/predictive-consolidation.d.ts +46 -0
  362. package/dist/worker/predictive-consolidation.d.ts.map +1 -0
  363. package/dist/worker/predictive-consolidation.js +110 -0
  364. package/dist/worker/predictive-consolidation.js.map +1 -0
  365. package/dist/worker/types.d.ts +91 -0
  366. package/dist/worker/types.d.ts.map +1 -0
  367. package/dist/worker/types.js +22 -0
  368. package/dist/worker/types.js.map +1 -0
  369. package/hooks/clawdbot/cortex-memory/HOOK.md +71 -0
  370. package/hooks/clawdbot/cortex-memory/handler.js +279 -0
  371. package/package.json +73 -0
  372. package/scripts/pre-compact-hook.mjs +716 -0
  373. package/scripts/session-end-hook.mjs +548 -0
  374. package/scripts/session-start-hook.mjs +221 -0
  375. package/scripts/start-dashboard.sh +41 -0
  376. package/scripts/stop-dashboard.sh +21 -0
  377. package/scripts/stop-hook.mjs +163 -0
@@ -0,0 +1,178 @@
1
+ /**
2
+ * Cross-platform service installer for ShieldCortex dashboard auto-start.
3
+ *
4
+ * Supports:
5
+ * - macOS: LaunchAgent plist
6
+ * - Linux: systemd user service
7
+ * - Windows: VBS script in Startup folder
8
+ */
9
+ import fs from 'fs';
10
+ import path from 'path';
11
+ import os from 'os';
12
+ import { execSync } from 'child_process';
13
+ import { fileURLToPath } from 'url';
14
+ import { launchdPlist, systemdUnit, windowsVbs } from './templates.js';
15
+ const __filename = fileURLToPath(import.meta.url);
16
+ const __dirname = path.dirname(__filename);
17
+ function detectPlatform() {
18
+ switch (process.platform) {
19
+ case 'darwin': return 'macos';
20
+ case 'win32': return 'windows';
21
+ default: return 'linux';
22
+ }
23
+ }
24
+ function getServiceConfig() {
25
+ const logsDir = path.join(os.homedir(), '.shieldcortex', 'logs');
26
+ fs.mkdirSync(logsDir, { recursive: true });
27
+ return {
28
+ nodePath: process.execPath,
29
+ nodeBinDir: path.dirname(process.execPath),
30
+ entryPoint: path.resolve(__dirname, '..', 'index.js'),
31
+ logsDir,
32
+ };
33
+ }
34
+ function getServicePath(platform) {
35
+ switch (platform) {
36
+ case 'macos':
37
+ return path.join(os.homedir(), 'Library', 'LaunchAgents', 'com.shieldcortex.dashboard.plist');
38
+ case 'linux':
39
+ return path.join(os.homedir(), '.config', 'systemd', 'user', 'shieldcortex-dashboard.service');
40
+ case 'windows': {
41
+ const appData = process.env.APPDATA || path.join(os.homedir(), 'AppData', 'Roaming');
42
+ return path.join(appData, 'Microsoft', 'Windows', 'Start Menu', 'Programs', 'Startup', 'shieldcortex-dashboard.vbs');
43
+ }
44
+ }
45
+ }
46
+ export async function installService() {
47
+ const platform = detectPlatform();
48
+ const config = getServiceConfig();
49
+ const servicePath = getServicePath(platform);
50
+ // Ensure parent directory exists
51
+ fs.mkdirSync(path.dirname(servicePath), { recursive: true });
52
+ // Generate and write service file
53
+ let content;
54
+ switch (platform) {
55
+ case 'macos':
56
+ content = launchdPlist(config);
57
+ break;
58
+ case 'linux':
59
+ content = systemdUnit(config);
60
+ break;
61
+ case 'windows':
62
+ content = windowsVbs(config);
63
+ break;
64
+ }
65
+ fs.writeFileSync(servicePath, content, 'utf-8');
66
+ console.log(`Service file written to: ${servicePath}`);
67
+ // Enable and start the service
68
+ try {
69
+ switch (platform) {
70
+ case 'macos':
71
+ execSync(`launchctl load -w "${servicePath}"`, { stdio: 'inherit' });
72
+ console.log('Service loaded via launchctl.');
73
+ break;
74
+ case 'linux':
75
+ execSync('systemctl --user daemon-reload', { stdio: 'inherit' });
76
+ execSync('systemctl --user enable --now shieldcortex-dashboard.service', { stdio: 'inherit' });
77
+ console.log('Service enabled via systemd.');
78
+ break;
79
+ case 'windows':
80
+ console.log('Service installed. It will start on next login.');
81
+ console.log('To start now, run the VBS script or reboot.');
82
+ break;
83
+ }
84
+ }
85
+ catch (err) {
86
+ console.error(`Failed to enable service: ${err.message}`);
87
+ console.log(`The service file was written to ${servicePath} — you can enable it manually.`);
88
+ return;
89
+ }
90
+ console.log('\nShieldCortex dashboard will now auto-start on login.');
91
+ console.log(` API: http://localhost:3001`);
92
+ console.log(` Dashboard: http://localhost:3030`);
93
+ }
94
+ function cleanLogsDirectory() {
95
+ const logsDir = path.join(os.homedir(), '.shieldcortex', 'logs');
96
+ if (fs.existsSync(logsDir)) {
97
+ fs.rmSync(logsDir, { recursive: true, force: true });
98
+ console.log(`Logs cleaned: ${logsDir}`);
99
+ }
100
+ }
101
+ export async function uninstallService(options) {
102
+ const platform = detectPlatform();
103
+ const servicePath = getServicePath(platform);
104
+ if (!fs.existsSync(servicePath)) {
105
+ console.log('No service installed.');
106
+ return;
107
+ }
108
+ try {
109
+ switch (platform) {
110
+ case 'macos':
111
+ execSync(`launchctl unload -w "${servicePath}"`, { stdio: 'inherit' });
112
+ break;
113
+ case 'linux':
114
+ execSync('systemctl --user disable --now shieldcortex-dashboard.service', { stdio: 'inherit' });
115
+ break;
116
+ case 'windows':
117
+ // Just delete the file — no daemon to stop
118
+ break;
119
+ }
120
+ }
121
+ catch {
122
+ // Service may not be loaded, continue to delete file
123
+ }
124
+ fs.unlinkSync(servicePath);
125
+ console.log(`Service removed: ${servicePath}`);
126
+ if (options?.cleanLogs) {
127
+ cleanLogsDirectory();
128
+ }
129
+ }
130
+ export async function serviceStatus() {
131
+ const platform = detectPlatform();
132
+ const servicePath = getServicePath(platform);
133
+ const installed = fs.existsSync(servicePath);
134
+ console.log(`Platform: ${platform}`);
135
+ console.log(`Installed: ${installed ? 'yes' : 'no'}`);
136
+ console.log(`Path: ${servicePath}`);
137
+ if (!installed)
138
+ return;
139
+ // Check if running
140
+ try {
141
+ switch (platform) {
142
+ case 'macos': {
143
+ const out = execSync('launchctl list com.shieldcortex.dashboard 2>&1', { encoding: 'utf-8' });
144
+ const pidMatch = out.match(/"PID"\s*=\s*(\d+)/);
145
+ console.log(`Running: ${pidMatch ? `yes (PID ${pidMatch[1]})` : 'no'}`);
146
+ break;
147
+ }
148
+ case 'linux': {
149
+ const out = execSync('systemctl --user is-active shieldcortex-dashboard.service 2>&1', { encoding: 'utf-8' }).trim();
150
+ console.log(`Running: ${out === 'active' ? 'yes' : 'no'}`);
151
+ break;
152
+ }
153
+ case 'windows':
154
+ console.log('Running: (check Task Manager for node.exe)');
155
+ break;
156
+ }
157
+ }
158
+ catch {
159
+ console.log('Running: no');
160
+ }
161
+ }
162
+ export async function handleServiceCommand(subcommand) {
163
+ switch (subcommand) {
164
+ case 'install':
165
+ await installService();
166
+ break;
167
+ case 'uninstall':
168
+ await uninstallService({ cleanLogs: process.argv.includes('--clean-logs') });
169
+ break;
170
+ case 'status':
171
+ await serviceStatus();
172
+ break;
173
+ default:
174
+ console.log('Usage: shieldcortex service <install|uninstall|status>');
175
+ process.exit(1);
176
+ }
177
+ }
178
+ //# sourceMappingURL=install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"install.js","sourceRoot":"","sources":["../../src/service/install.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Platform-specific service file templates for auto-starting ShieldCortex dashboard.
3
+ */
4
+ export interface ServiceConfig {
5
+ nodePath: string;
6
+ nodeBinDir: string;
7
+ entryPoint: string;
8
+ logsDir: string;
9
+ }
10
+ export declare function launchdPlist(config: ServiceConfig): string;
11
+ export declare function systemdUnit(config: ServiceConfig): string;
12
+ export declare function windowsVbs(config: ServiceConfig): string;
13
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../../src/service/templates.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CA6B1D;AAED,wBAAgB,WAAW,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAgBzD;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAMxD"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Platform-specific service file templates for auto-starting ShieldCortex dashboard.
3
+ */
4
+ export function launchdPlist(config) {
5
+ return `<?xml version="1.0" encoding="UTF-8"?>
6
+ <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
7
+ <plist version="1.0">
8
+ <dict>
9
+ <key>Label</key>
10
+ <string>com.shieldcortex.dashboard</string>
11
+ <key>ProgramArguments</key>
12
+ <array>
13
+ <string>${config.nodePath}</string>
14
+ <string>${config.entryPoint}</string>
15
+ <string>--mode</string>
16
+ <string>dashboard</string>
17
+ </array>
18
+ <key>RunAtLoad</key>
19
+ <true/>
20
+ <key>KeepAlive</key>
21
+ <true/>
22
+ <key>StandardOutPath</key>
23
+ <string>${config.logsDir}/dashboard-stdout.log</string>
24
+ <key>StandardErrorPath</key>
25
+ <string>${config.logsDir}/dashboard-stderr.log</string>
26
+ <key>EnvironmentVariables</key>
27
+ <dict>
28
+ <key>PATH</key>
29
+ <string>${config.nodeBinDir}:/usr/local/bin:/usr/bin:/bin</string>
30
+ </dict>
31
+ </dict>
32
+ </plist>`;
33
+ }
34
+ export function systemdUnit(config) {
35
+ return `[Unit]
36
+ Description=ShieldCortex Dashboard
37
+ After=network.target
38
+
39
+ [Service]
40
+ Type=simple
41
+ ExecStart=${config.nodePath} ${config.entryPoint} --mode dashboard
42
+ Restart=on-failure
43
+ RestartSec=5
44
+ StandardOutput=append:${config.logsDir}/dashboard-stdout.log
45
+ StandardError=append:${config.logsDir}/dashboard-stderr.log
46
+ Environment=PATH=${config.nodeBinDir}:/usr/local/bin:/usr/bin:/bin
47
+
48
+ [Install]
49
+ WantedBy=default.target`;
50
+ }
51
+ export function windowsVbs(config) {
52
+ // VBS script runs node hidden (no console window)
53
+ const nodePath = config.nodePath.replace(/\//g, '\\');
54
+ const entryPoint = config.entryPoint.replace(/\//g, '\\');
55
+ return `Set WshShell = CreateObject("WScript.Shell")
56
+ WshShell.Run """${nodePath}"" ""${entryPoint}"" --mode dashboard", 0, False`;
57
+ }
58
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../../src/service/templates.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,OAAO;;;;;;;;cAQK,MAAM,CAAC,QAAQ;cACf,MAAM,CAAC,UAAU;;;;;;;;;YASnB,MAAM,CAAC,OAAO;;YAEd,MAAM,CAAC,OAAO;;;;cAIZ,MAAM,CAAC,UAAU;;;SAGtB,CAAC;AACV,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAqB;IAC/C,OAAO;;;;;;YAMG,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,UAAU;;;wBAGxB,MAAM,CAAC,OAAO;uBACf,MAAM,CAAC,OAAO;mBAClB,MAAM,CAAC,UAAU;;;wBAGZ,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,MAAqB;IAC9C,kDAAkD;IAClD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IACtD,MAAM,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1D,OAAO;kBACS,QAAQ,QAAQ,UAAU,gCAAgC,CAAC;AAC7E,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Full setup for ShieldCortex.
3
+ *
4
+ * 1. Injects proactive memory instructions into ~/.claude/CLAUDE.md (Claude Code)
5
+ * 2. Installs cortex-memory hook into OpenClaw/Clawdbot if detected
6
+ *
7
+ * Both steps are idempotent.
8
+ */
9
+ export declare function setupClaudeMd(options?: {
10
+ stopHook?: boolean;
11
+ }): Promise<void>;
12
+ //# sourceMappingURL=claude-md.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/setup/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA6CH,wBAAsB,aAAa,CAAC,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBnF"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * Full setup for ShieldCortex.
3
+ *
4
+ * 1. Injects proactive memory instructions into ~/.claude/CLAUDE.md (Claude Code)
5
+ * 2. Installs cortex-memory hook into OpenClaw/Clawdbot if detected
6
+ *
7
+ * Both steps are idempotent.
8
+ */
9
+ import fs from 'fs';
10
+ import path from 'path';
11
+ import os from 'os';
12
+ import { installClawdbotHook, findClawdbotHooksDir } from './clawdbot.js';
13
+ import { setupHooks } from './settings-hooks.js';
14
+ const MARKER = '# ShieldCortex — Memory System';
15
+ const INSTRUCTIONS = `
16
+ ${MARKER}
17
+
18
+ You have access to a persistent memory system via MCP tools (\`remember\`, \`recall\`, \`get_context\`, \`forget\`).
19
+
20
+ **MUST use \`remember\` immediately when any of these occur:**
21
+ - A decision is made (architecture, library choice, approach)
22
+ - A bug is fixed (capture root cause + solution)
23
+ - Something new is learned about the codebase
24
+ - User states a preference
25
+ - A significant feature is completed
26
+
27
+ Do not wait until the end of the session. Call \`remember\` right after the event happens.
28
+ `;
29
+ function setupClaudeCode() {
30
+ const claudeDir = path.join(os.homedir(), '.claude');
31
+ const claudeMdPath = path.join(claudeDir, 'CLAUDE.md');
32
+ fs.mkdirSync(claudeDir, { recursive: true });
33
+ let existing = '';
34
+ if (fs.existsSync(claudeMdPath)) {
35
+ existing = fs.readFileSync(claudeMdPath, 'utf-8');
36
+ }
37
+ if (existing.includes(MARKER)) {
38
+ console.log('✓ Claude Code: instructions already present in ~/.claude/CLAUDE.md');
39
+ }
40
+ else {
41
+ const newContent = existing.trimEnd() + '\n' + INSTRUCTIONS;
42
+ fs.writeFileSync(claudeMdPath, newContent, 'utf-8');
43
+ console.log('✓ Claude Code: added memory instructions to ~/.claude/CLAUDE.md');
44
+ }
45
+ }
46
+ export async function setupClaudeMd(options) {
47
+ console.log('Setting up ShieldCortex...\n');
48
+ // 1. Claude Code CLAUDE.md — always
49
+ setupClaudeCode();
50
+ // 2. Hooks in settings.json
51
+ setupHooks(options);
52
+ // 3. OpenClaw/Clawdbot — if detected
53
+ const hooksDir = findClawdbotHooksDir();
54
+ if (hooksDir) {
55
+ const hookExists = fs.existsSync(path.join(hooksDir, 'cortex-memory'));
56
+ if (hookExists) {
57
+ console.log('✓ OpenClaw: cortex-memory hook already installed');
58
+ }
59
+ else {
60
+ await installClawdbotHook();
61
+ }
62
+ }
63
+ else {
64
+ console.log('- OpenClaw/Clawdbot: not detected (skipped)');
65
+ }
66
+ console.log('\nSetup complete.');
67
+ }
68
+ //# sourceMappingURL=claude-md.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/setup/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAC1E,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,MAAM,MAAM,GAAG,gCAAgC,CAAC;AAEhD,MAAM,YAAY,GAAG;EACnB,MAAM;;;;;;;;;;;;CAYP,CAAC;AAEF,SAAS,eAAe;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAEvD,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE7C,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,IAAI,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QAChC,QAAQ,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;IACpD,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;IACpF,CAAC;SAAM,CAAC;QACN,MAAM,UAAU,GAAG,QAAQ,CAAC,OAAO,EAAE,GAAG,IAAI,GAAG,YAAY,CAAC;QAC5D,EAAE,CAAC,aAAa,CAAC,YAAY,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;IACjF,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAgC;IAClE,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAE5C,oCAAoC;IACpC,eAAe,EAAE,CAAC;IAElB,4BAA4B;IAC5B,UAAU,CAAC,OAAO,CAAC,CAAC;IAEpB,qCAAqC;IACrC,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;IACxC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC;QACvE,IAAI,UAAU,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,MAAM,mBAAmB,EAAE,CAAC;QAC9B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,6CAA6C,CAAC,CAAC;IAC7D,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;AACnC,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * OpenClaw/Clawdbot hook installer.
3
+ *
4
+ * Copies the cortex-memory hook into Clawdbot's bundled hooks directory.
5
+ * Only works if OpenClaw is installed on the system.
6
+ */
7
+ /**
8
+ * Find Clawdbot's bundled hooks directory by locating the binary
9
+ */
10
+ export declare function findClawdbotHooksDir(): string | null;
11
+ export declare function installClawdbotHook(): Promise<void>;
12
+ export declare function uninstallClawdbotHook(): Promise<void>;
13
+ export declare function clawdbotHookStatus(): Promise<void>;
14
+ export declare function handleClawdbotCommand(subcommand: string): Promise<void>;
15
+ //# sourceMappingURL=clawdbot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clawdbot.d.ts","sourceRoot":"","sources":["../../src/setup/clawdbot.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAgBH;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,GAAG,IAAI,CA8BpD;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CAgCzD;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,CAiB3D;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAcxD;AAED,wBAAsB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAe7E"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * OpenClaw/Clawdbot hook installer.
3
+ *
4
+ * Copies the cortex-memory hook into Clawdbot's bundled hooks directory.
5
+ * Only works if OpenClaw is installed on the system.
6
+ */
7
+ import fs from 'fs';
8
+ import path from 'path';
9
+ import { execSync } from 'child_process';
10
+ import { fileURLToPath } from 'url';
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = path.dirname(__filename);
13
+ const HOOK_NAME = 'cortex-memory';
14
+ // Hook source is in hooks/clawdbot/cortex-memory/ relative to project root
15
+ // From dist/setup/, go up two levels to project root
16
+ const HOOK_SOURCE = path.resolve(__dirname, '..', '..', 'hooks', 'clawdbot', HOOK_NAME);
17
+ /**
18
+ * Find Clawdbot's bundled hooks directory by locating the binary
19
+ */
20
+ export function findClawdbotHooksDir() {
21
+ try {
22
+ const binPath = execSync('which openclaw 2>/dev/null || which clawdbot 2>/dev/null || which moltbot 2>/dev/null', {
23
+ encoding: 'utf-8',
24
+ }).trim();
25
+ if (!binPath)
26
+ return null;
27
+ // Resolve symlink — lands in e.g. <prefix>/lib/node_modules/clawdbot/dist/entry.js
28
+ const realBin = fs.realpathSync(binPath);
29
+ // Walk up from resolved path to find dist/hooks/bundled/
30
+ let dir = path.dirname(realBin);
31
+ for (let i = 0; i < 5; i++) {
32
+ const candidate = path.join(dir, 'hooks', 'bundled');
33
+ if (fs.existsSync(candidate)) {
34
+ return candidate;
35
+ }
36
+ // Also check dist/hooks/bundled from current dir
37
+ const distCandidate = path.join(dir, 'dist', 'hooks', 'bundled');
38
+ if (fs.existsSync(distCandidate)) {
39
+ return distCandidate;
40
+ }
41
+ dir = path.dirname(dir);
42
+ }
43
+ return null;
44
+ }
45
+ catch {
46
+ return null;
47
+ }
48
+ }
49
+ export async function installClawdbotHook() {
50
+ const hooksDir = findClawdbotHooksDir();
51
+ if (!hooksDir) {
52
+ console.error('OpenClaw/Clawdbot is not installed on this system.');
53
+ console.log('Install it first: npm install -g openclaw');
54
+ process.exit(1);
55
+ }
56
+ if (!fs.existsSync(HOOK_SOURCE)) {
57
+ console.error('Hook source files not found. Package may be corrupted.');
58
+ process.exit(1);
59
+ }
60
+ const destDir = path.join(hooksDir, HOOK_NAME);
61
+ // Copy hook files
62
+ fs.mkdirSync(destDir, { recursive: true });
63
+ for (const file of ['HOOK.md', 'handler.js']) {
64
+ const src = path.join(HOOK_SOURCE, file);
65
+ const dest = path.join(destDir, file);
66
+ fs.copyFileSync(src, dest);
67
+ }
68
+ console.log(`✓ Installed cortex-memory hook to ${destDir}`);
69
+ console.log(' The hook will activate on next OpenClaw restart.');
70
+ console.log('');
71
+ console.log(' What it does:');
72
+ console.log(' • Auto-saves important session context on /new');
73
+ console.log(' • Injects past memories on session start');
74
+ console.log(' • "remember this: ..." keyword trigger');
75
+ }
76
+ export async function uninstallClawdbotHook() {
77
+ const hooksDir = findClawdbotHooksDir();
78
+ if (!hooksDir) {
79
+ console.log('OpenClaw/Clawdbot is not installed on this system.');
80
+ return;
81
+ }
82
+ const destDir = path.join(hooksDir, HOOK_NAME);
83
+ if (!fs.existsSync(destDir)) {
84
+ console.log('cortex-memory hook is not installed.');
85
+ return;
86
+ }
87
+ fs.rmSync(destDir, { recursive: true });
88
+ console.log(`✓ Removed cortex-memory hook from ${destDir}`);
89
+ }
90
+ export async function clawdbotHookStatus() {
91
+ const hooksDir = findClawdbotHooksDir();
92
+ if (!hooksDir) {
93
+ console.log('OpenClaw/Clawdbot: not installed');
94
+ return;
95
+ }
96
+ const destDir = path.join(hooksDir, HOOK_NAME);
97
+ const installed = fs.existsSync(destDir);
98
+ console.log(`OpenClaw/Clawdbot: installed`);
99
+ console.log(`Hooks directory: ${hooksDir}`);
100
+ console.log(`cortex-memory: ${installed ? 'installed' : 'not installed'}`);
101
+ }
102
+ export async function handleClawdbotCommand(subcommand) {
103
+ switch (subcommand) {
104
+ case 'install':
105
+ await installClawdbotHook();
106
+ break;
107
+ case 'uninstall':
108
+ await uninstallClawdbotHook();
109
+ break;
110
+ case 'status':
111
+ await clawdbotHookStatus();
112
+ break;
113
+ default:
114
+ console.log('Usage: shieldcortex clawdbot <install|uninstall|status>');
115
+ process.exit(1);
116
+ }
117
+ }
118
+ //# sourceMappingURL=clawdbot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clawdbot.js","sourceRoot":"","sources":["../../src/setup/clawdbot.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * `npx shieldcortex doctor` — diagnostic checks for Cortex installation health.
3
+ */
4
+ export declare function handleDoctorCommand(): Promise<void>;
5
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../../src/setup/doctor.ts"],"names":[],"mappings":"AAAA;;GAEG;AAuIH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,IAAI,CAAC,CA2BzD"}
@@ -0,0 +1,141 @@
1
+ /**
2
+ * `npx shieldcortex doctor` — diagnostic checks for Cortex installation health.
3
+ */
4
+ import fs from 'fs';
5
+ import path from 'path';
6
+ import os from 'os';
7
+ import { createRequire } from 'module';
8
+ import { fileURLToPath } from 'url';
9
+ const require = createRequire(import.meta.url);
10
+ const results = [];
11
+ function add(status, message) {
12
+ results.push({ status, message });
13
+ }
14
+ function getDbPath() {
15
+ const newPath = path.join(os.homedir(), '.shieldcortex', 'memories.db');
16
+ const legacyPath = path.join(os.homedir(), '.claude-memory', 'memories.db');
17
+ if (fs.existsSync(newPath))
18
+ return { path: newPath, isLegacy: false };
19
+ if (fs.existsSync(legacyPath))
20
+ return { path: legacyPath, isLegacy: true };
21
+ return null;
22
+ }
23
+ function formatBytes(bytes) {
24
+ if (bytes < 1024)
25
+ return `${bytes} B`;
26
+ if (bytes < 1024 * 1024)
27
+ return `${(bytes / 1024).toFixed(1)} KB`;
28
+ return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;
29
+ }
30
+ function checkNode() {
31
+ const major = parseInt(process.version.slice(1), 10);
32
+ if (major >= 18) {
33
+ add('PASS', `Node.js ${process.version} (>= 18 required)`);
34
+ }
35
+ else {
36
+ add('WARN', `Node.js ${process.version} — version 18+ recommended`);
37
+ }
38
+ }
39
+ function checkDatabase() {
40
+ const db = getDbPath();
41
+ if (!db) {
42
+ add('FAIL', 'Database not found at ~/.shieldcortex/memories.db');
43
+ return;
44
+ }
45
+ const label = db.isLegacy ? '~/.claude-memory/memories.db (legacy)' : '~/.shieldcortex/memories.db';
46
+ try {
47
+ const stat = fs.statSync(db.path);
48
+ const Database = require('better-sqlite3');
49
+ const conn = new Database(db.path, { readonly: true });
50
+ const row = conn.prepare('SELECT COUNT(*) as count FROM memories').get();
51
+ conn.close();
52
+ add('PASS', `Database: ${label} (${row.count} memories, ${formatBytes(stat.size)})`);
53
+ }
54
+ catch (err) {
55
+ add('FAIL', `Database: ${label} — ${err.message}`);
56
+ }
57
+ }
58
+ function checkClaudeMd() {
59
+ const claudeMdPath = path.join(os.homedir(), '.claude', 'CLAUDE.md');
60
+ if (!fs.existsSync(claudeMdPath)) {
61
+ add('WARN', 'CLAUDE.md not found — run `npx shieldcortex setup`');
62
+ return;
63
+ }
64
+ const content = fs.readFileSync(claudeMdPath, 'utf-8');
65
+ if (content.includes('# ShieldCortex')) {
66
+ add('PASS', 'CLAUDE.md: Cortex instructions present');
67
+ }
68
+ else {
69
+ add('WARN', 'CLAUDE.md: Cortex instructions not found — run `npx shieldcortex setup`');
70
+ }
71
+ }
72
+ function checkHooks() {
73
+ const settingsPath = path.join(os.homedir(), '.claude', 'settings.json');
74
+ if (!fs.existsSync(settingsPath)) {
75
+ add('WARN', 'settings.json not found — hooks not configured');
76
+ return;
77
+ }
78
+ let settings;
79
+ try {
80
+ settings = JSON.parse(fs.readFileSync(settingsPath, 'utf-8'));
81
+ }
82
+ catch {
83
+ add('FAIL', 'settings.json: failed to parse');
84
+ return;
85
+ }
86
+ const hooks = settings?.hooks || {};
87
+ const expected = ['PreCompact', 'SessionStart', 'SessionEnd'];
88
+ for (const name of expected) {
89
+ const entries = hooks[name];
90
+ const hasCortex = Array.isArray(entries) && entries.some((e) => Array.isArray(e?.hooks) && e.hooks.some((h) => typeof h?.command === 'string' && h.command.includes('shieldcortex')));
91
+ if (hasCortex) {
92
+ add('PASS', `Hook: ${name} configured`);
93
+ }
94
+ else {
95
+ add('WARN', `Hook: ${name} not configured`);
96
+ }
97
+ }
98
+ }
99
+ function checkMcp() {
100
+ // Check project-level .mcp.json
101
+ const projectMcp = path.join(process.cwd(), '.mcp.json');
102
+ // Check user-level config
103
+ const userMcp = path.join(os.homedir(), '.claude.json');
104
+ for (const p of [projectMcp, userMcp]) {
105
+ if (fs.existsSync(p)) {
106
+ try {
107
+ const content = fs.readFileSync(p, 'utf-8');
108
+ if (content.includes('shieldcortex')) {
109
+ add('PASS', `MCP: cortex configured in ${path.basename(p)}`);
110
+ return;
111
+ }
112
+ }
113
+ catch { /* ignore parse errors */ }
114
+ }
115
+ }
116
+ add('WARN', 'MCP: no cortex entry found in .mcp.json or ~/.claude.json');
117
+ }
118
+ export async function handleDoctorCommand() {
119
+ const __filename = fileURLToPath(import.meta.url);
120
+ const __dirname = path.dirname(__filename);
121
+ const pkg = require(path.resolve(__dirname, '..', '..', 'package.json'));
122
+ console.log(`\nShieldCortex Doctor v${pkg.version}\n`);
123
+ checkNode();
124
+ checkDatabase();
125
+ checkClaudeMd();
126
+ checkHooks();
127
+ checkMcp();
128
+ // Print results
129
+ for (const r of results) {
130
+ const tag = r.status === 'PASS' ? '\x1b[32m PASS\x1b[0m'
131
+ : r.status === 'WARN' ? '\x1b[33m WARN\x1b[0m'
132
+ : '\x1b[31m FAIL\x1b[0m';
133
+ console.log(`${tag} ${r.message}`);
134
+ }
135
+ const passed = results.filter(r => r.status === 'PASS').length;
136
+ const warns = results.filter(r => r.status === 'WARN').length;
137
+ const fails = results.filter(r => r.status === 'FAIL').length;
138
+ console.log(`\n${passed} passed, ${warns} warnings, ${fails} failed\n`);
139
+ process.exit(fails > 0 ? 1 : 0);
140
+ }
141
+ //# sourceMappingURL=doctor.js.map