specmem-hardwicksoftware 3.5.99
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/CHANGELOG.md +299 -0
- package/LICENSE.md +6406 -0
- package/README.md +539 -0
- package/bin/AegisTheme.cjs +1022 -0
- package/bin/AnsiRenderer.cjs +1055 -0
- package/bin/BoxRenderer.cjs +605 -0
- package/bin/ClaudeLiveScreen.cjs +1299 -0
- package/bin/DashboardModules.cjs +733 -0
- package/bin/LiveScreenCapture.cjs +1012 -0
- package/bin/MemoryBrowserScreen.cjs +1595 -0
- package/bin/TabManager.cjs +1414 -0
- package/bin/checkAgentStatus-fix.patch +30 -0
- package/bin/mcp-socket-client.cjs +462 -0
- package/bin/screen-utils.cjs +106 -0
- package/bin/specmem-autoclaude.cjs +663 -0
- package/bin/specmem-cleanup.cjs +421 -0
- package/bin/specmem-cli.cjs +794 -0
- package/bin/specmem-console-teamcomms-class.cjs +428 -0
- package/bin/specmem-console.cjs +8104 -0
- package/bin/specmem-statusbar.cjs +530 -0
- package/bootstrap.cjs +5065 -0
- package/claude-hooks/agent-chooser-hook.js +179 -0
- package/claude-hooks/agent-chooser-inject.js +121 -0
- package/claude-hooks/agent-loading-hook.js +990 -0
- package/claude-hooks/agent-output-fader.cjs +542 -0
- package/claude-hooks/agent-output-interceptor.js +193 -0
- package/claude-hooks/agent-type-matcher.js +419 -0
- package/claude-hooks/auto-bypass.py +74 -0
- package/claude-hooks/background-completion-silencer.js +134 -0
- package/claude-hooks/bash-auto-background.js +182 -0
- package/claude-hooks/build-cedict-dictionary.mjs +167 -0
- package/claude-hooks/bullshit-radar.cjs +323 -0
- package/claude-hooks/cedict-codes.json +270 -0
- package/claude-hooks/cedict-extracted.json +22632 -0
- package/claude-hooks/claude-watchdog.sh +401 -0
- package/claude-hooks/context-dedup.cjs +144 -0
- package/claude-hooks/context-yeeter.cjs +244 -0
- package/claude-hooks/debug-suffix.cjs +15 -0
- package/claude-hooks/debug2.cjs +7 -0
- package/claude-hooks/drilldown-enforcer.js +242 -0
- package/claude-hooks/english-morphology-standalone.cjs +149 -0
- package/claude-hooks/english-morphology.cjs +152 -0
- package/claude-hooks/extract-translations.mjs +193 -0
- package/claude-hooks/file-claim-enforcer.cjs +293 -0
- package/claude-hooks/file-claim-enforcer.js +293 -0
- package/claude-hooks/find-collisions.cjs +39 -0
- package/claude-hooks/fix-abbreviations.cjs +60 -0
- package/claude-hooks/fix-collisions.cjs +60 -0
- package/claude-hooks/fix-decompressor.cjs +79 -0
- package/claude-hooks/fix-suffixes.cjs +66 -0
- package/claude-hooks/grammar-engine.cjs +159 -0
- package/claude-hooks/input-aware-improver.js +231 -0
- package/claude-hooks/is-agent.cjs +64 -0
- package/claude-hooks/mega-test.cjs +213 -0
- package/claude-hooks/merge-dictionaries.mjs +207 -0
- package/claude-hooks/merged-codes.cjs +22675 -0
- package/claude-hooks/merged-codes.json +22676 -0
- package/claude-hooks/output-cleaner.cjs +388 -0
- package/claude-hooks/post-write-memory-hook.cjs +430 -0
- package/claude-hooks/quick-test.cjs +24 -0
- package/claude-hooks/quick-test2.cjs +24 -0
- package/claude-hooks/remove-bad-codes.cjs +23 -0
- package/claude-hooks/search-reminder-hook.js +90 -0
- package/claude-hooks/semantic-test.cjs +93 -0
- package/claude-hooks/settings.json +445 -0
- package/claude-hooks/smart-context-hook.cjs +547 -0
- package/claude-hooks/smart-context-hook.js +539 -0
- package/claude-hooks/smart-search-interceptor.js +364 -0
- package/claude-hooks/socket-connect-helper.cjs +235 -0
- package/claude-hooks/specmem/sockets/session-start.lock +1 -0
- package/claude-hooks/specmem-context-hook.cjs +357 -0
- package/claude-hooks/specmem-context-hook.js +357 -0
- package/claude-hooks/specmem-drilldown-hook.cjs +480 -0
- package/claude-hooks/specmem-drilldown-hook.js +480 -0
- package/claude-hooks/specmem-drilldown-setter.js +210 -0
- package/claude-hooks/specmem-paths.cjs +213 -0
- package/claude-hooks/specmem-precompact.js +183 -0
- package/claude-hooks/specmem-session-init.sh +33 -0
- package/claude-hooks/specmem-session-start.cjs +498 -0
- package/claude-hooks/specmem-stop-hook.cjs +73 -0
- package/claude-hooks/specmem-stop-hook.js +5 -0
- package/claude-hooks/specmem-team-comms.cjs +434 -0
- package/claude-hooks/specmem-team-member-inject.js +271 -0
- package/claude-hooks/specmem-unified-hook.py +670 -0
- package/claude-hooks/subagent-loading-hook.js +194 -0
- package/claude-hooks/sysprompt-squisher.cjs +167 -0
- package/claude-hooks/task-progress-hook.js +204 -0
- package/claude-hooks/team-comms-enforcer.cjs +585 -0
- package/claude-hooks/test-accuracy.cjs +27 -0
- package/claude-hooks/test-big.cjs +28 -0
- package/claude-hooks/test-inflectors.cjs +39 -0
- package/claude-hooks/test-pluralize.cjs +37 -0
- package/claude-hooks/test-quick.cjs +8 -0
- package/claude-hooks/test-wink.cjs +20 -0
- package/claude-hooks/token-compressor.cjs +940 -0
- package/claude-hooks/use-code-pointers.cjs +279 -0
- package/commands/COMMAND_TOOL_MAP.md +299 -0
- package/commands/specmem-agents.md +412 -0
- package/commands/specmem-autoclaude.md +295 -0
- package/commands/specmem-changes.md +247 -0
- package/commands/specmem-code.md +103 -0
- package/commands/specmem-configteammembercomms.md +322 -0
- package/commands/specmem-drilldown.md +208 -0
- package/commands/specmem-find.md +195 -0
- package/commands/specmem-getdashboard.md +243 -0
- package/commands/specmem-hooks.md +219 -0
- package/commands/specmem-pointers.md +149 -0
- package/commands/specmem-progress.md +287 -0
- package/commands/specmem-remember.md +123 -0
- package/commands/specmem-service.md +349 -0
- package/commands/specmem-stats.md +189 -0
- package/commands/specmem-team-member.md +409 -0
- package/commands/specmem-webdev.md +583 -0
- package/commands/specmem.md +363 -0
- package/dist/autoStart/index.d.ts +214 -0
- package/dist/autoStart/index.d.ts.map +1 -0
- package/dist/autoStart/index.js +883 -0
- package/dist/autoStart/index.js.map +1 -0
- package/dist/claude-sessions/contextRestorationParser.d.ts +74 -0
- package/dist/claude-sessions/contextRestorationParser.d.ts.map +1 -0
- package/dist/claude-sessions/contextRestorationParser.js +570 -0
- package/dist/claude-sessions/contextRestorationParser.js.map +1 -0
- package/dist/claude-sessions/index.d.ts +13 -0
- package/dist/claude-sessions/index.d.ts.map +1 -0
- package/dist/claude-sessions/index.js +11 -0
- package/dist/claude-sessions/index.js.map +1 -0
- package/dist/claude-sessions/sessionIntegration.d.ts +48 -0
- package/dist/claude-sessions/sessionIntegration.d.ts.map +1 -0
- package/dist/claude-sessions/sessionIntegration.js +146 -0
- package/dist/claude-sessions/sessionIntegration.js.map +1 -0
- package/dist/claude-sessions/sessionParser.d.ts +293 -0
- package/dist/claude-sessions/sessionParser.d.ts.map +1 -0
- package/dist/claude-sessions/sessionParser.js +1028 -0
- package/dist/claude-sessions/sessionParser.js.map +1 -0
- package/dist/claude-sessions/sessionWatcher.d.ts +139 -0
- package/dist/claude-sessions/sessionWatcher.d.ts.map +1 -0
- package/dist/claude-sessions/sessionWatcher.js +722 -0
- package/dist/claude-sessions/sessionWatcher.js.map +1 -0
- package/dist/cli/deploy-to-claude.d.ts +56 -0
- package/dist/cli/deploy-to-claude.d.ts.map +1 -0
- package/dist/cli/deploy-to-claude.js +576 -0
- package/dist/cli/deploy-to-claude.js.map +1 -0
- package/dist/code-explanations/explainCode.d.ts +86 -0
- package/dist/code-explanations/explainCode.d.ts.map +1 -0
- package/dist/code-explanations/explainCode.js +286 -0
- package/dist/code-explanations/explainCode.js.map +1 -0
- package/dist/code-explanations/feedback.d.ts +87 -0
- package/dist/code-explanations/feedback.d.ts.map +1 -0
- package/dist/code-explanations/feedback.js +212 -0
- package/dist/code-explanations/feedback.js.map +1 -0
- package/dist/code-explanations/getRelatedCode.d.ts +80 -0
- package/dist/code-explanations/getRelatedCode.d.ts.map +1 -0
- package/dist/code-explanations/getRelatedCode.js +262 -0
- package/dist/code-explanations/getRelatedCode.js.map +1 -0
- package/dist/code-explanations/index.d.ts +284 -0
- package/dist/code-explanations/index.d.ts.map +1 -0
- package/dist/code-explanations/index.js +249 -0
- package/dist/code-explanations/index.js.map +1 -0
- package/dist/code-explanations/linkCodeToPrompt.d.ts +79 -0
- package/dist/code-explanations/linkCodeToPrompt.d.ts.map +1 -0
- package/dist/code-explanations/linkCodeToPrompt.js +213 -0
- package/dist/code-explanations/linkCodeToPrompt.js.map +1 -0
- package/dist/code-explanations/recallExplanation.d.ts +88 -0
- package/dist/code-explanations/recallExplanation.d.ts.map +1 -0
- package/dist/code-explanations/recallExplanation.js +218 -0
- package/dist/code-explanations/recallExplanation.js.map +1 -0
- package/dist/code-explanations/schema.d.ts +32 -0
- package/dist/code-explanations/schema.d.ts.map +1 -0
- package/dist/code-explanations/schema.js +221 -0
- package/dist/code-explanations/schema.js.map +1 -0
- package/dist/code-explanations/semanticSearch.d.ts +75 -0
- package/dist/code-explanations/semanticSearch.d.ts.map +1 -0
- package/dist/code-explanations/semanticSearch.js +203 -0
- package/dist/code-explanations/semanticSearch.js.map +1 -0
- package/dist/code-explanations/types.d.ts +328 -0
- package/dist/code-explanations/types.d.ts.map +1 -0
- package/dist/code-explanations/types.js +122 -0
- package/dist/code-explanations/types.js.map +1 -0
- package/dist/codebase/codeAnalyzer.d.ts +272 -0
- package/dist/codebase/codeAnalyzer.d.ts.map +1 -0
- package/dist/codebase/codeAnalyzer.js +1353 -0
- package/dist/codebase/codeAnalyzer.js.map +1 -0
- package/dist/codebase/codebaseIndexer.d.ts +360 -0
- package/dist/codebase/codebaseIndexer.d.ts.map +1 -0
- package/dist/codebase/codebaseIndexer.js +1735 -0
- package/dist/codebase/codebaseIndexer.js.map +1 -0
- package/dist/codebase/codebaseTools.d.ts +853 -0
- package/dist/codebase/codebaseTools.d.ts.map +1 -0
- package/dist/codebase/codebaseTools.js +1279 -0
- package/dist/codebase/codebaseTools.js.map +1 -0
- package/dist/codebase/exclusions.d.ts +111 -0
- package/dist/codebase/exclusions.d.ts.map +1 -0
- package/dist/codebase/exclusions.js +771 -0
- package/dist/codebase/exclusions.js.map +1 -0
- package/dist/codebase/fileWatcher.d.ts +135 -0
- package/dist/codebase/fileWatcher.d.ts.map +1 -0
- package/dist/codebase/fileWatcher.js +309 -0
- package/dist/codebase/fileWatcher.js.map +1 -0
- package/dist/codebase/index.d.ts +33 -0
- package/dist/codebase/index.d.ts.map +1 -0
- package/dist/codebase/index.js +77 -0
- package/dist/codebase/index.js.map +1 -0
- package/dist/codebase/ingestion.d.ts +177 -0
- package/dist/codebase/ingestion.d.ts.map +1 -0
- package/dist/codebase/ingestion.js +690 -0
- package/dist/codebase/ingestion.js.map +1 -0
- package/dist/codebase/languageDetection.d.ts +75 -0
- package/dist/codebase/languageDetection.d.ts.map +1 -0
- package/dist/codebase/languageDetection.js +768 -0
- package/dist/codebase/languageDetection.js.map +1 -0
- package/dist/commands/codebaseCommands.d.ts +101 -0
- package/dist/commands/codebaseCommands.d.ts.map +1 -0
- package/dist/commands/codebaseCommands.js +911 -0
- package/dist/commands/codebaseCommands.js.map +1 -0
- package/dist/commands/commandHandler.d.ts +126 -0
- package/dist/commands/commandHandler.d.ts.map +1 -0
- package/dist/commands/commandHandler.js +296 -0
- package/dist/commands/commandHandler.js.map +1 -0
- package/dist/commands/commandLoader.d.ts +103 -0
- package/dist/commands/commandLoader.d.ts.map +1 -0
- package/dist/commands/commandLoader.js +223 -0
- package/dist/commands/commandLoader.js.map +1 -0
- package/dist/commands/contextCommands.d.ts +83 -0
- package/dist/commands/contextCommands.d.ts.map +1 -0
- package/dist/commands/contextCommands.js +512 -0
- package/dist/commands/contextCommands.js.map +1 -0
- package/dist/commands/index.d.ts +24 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +28 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/mcpResources.d.ts +50 -0
- package/dist/commands/mcpResources.d.ts.map +1 -0
- package/dist/commands/mcpResources.js +372 -0
- package/dist/commands/mcpResources.js.map +1 -0
- package/dist/commands/memoryCommands.d.ts +74 -0
- package/dist/commands/memoryCommands.d.ts.map +1 -0
- package/dist/commands/memoryCommands.js +609 -0
- package/dist/commands/memoryCommands.js.map +1 -0
- package/dist/commands/promptCommands.d.ts +91 -0
- package/dist/commands/promptCommands.d.ts.map +1 -0
- package/dist/commands/promptCommands.js +801 -0
- package/dist/commands/promptCommands.js.map +1 -0
- package/dist/commands/teamMemberCommands.d.ts +21 -0
- package/dist/commands/teamMemberCommands.d.ts.map +1 -0
- package/dist/commands/teamMemberCommands.js +137 -0
- package/dist/commands/teamMemberCommands.js.map +1 -0
- package/dist/comms/fileCommsTransport.d.ts +91 -0
- package/dist/comms/fileCommsTransport.d.ts.map +1 -0
- package/dist/comms/fileCommsTransport.js +244 -0
- package/dist/comms/fileCommsTransport.js.map +1 -0
- package/dist/comms/index.d.ts +7 -0
- package/dist/comms/index.d.ts.map +1 -0
- package/dist/comms/index.js +7 -0
- package/dist/comms/index.js.map +1 -0
- package/dist/config/apiKeyDetection.d.ts +41 -0
- package/dist/config/apiKeyDetection.d.ts.map +1 -0
- package/dist/config/apiKeyDetection.js +211 -0
- package/dist/config/apiKeyDetection.js.map +1 -0
- package/dist/config/autoConfig.d.ts +188 -0
- package/dist/config/autoConfig.d.ts.map +1 -0
- package/dist/config/autoConfig.js +850 -0
- package/dist/config/autoConfig.js.map +1 -0
- package/dist/config/configSync.d.ts +119 -0
- package/dist/config/configSync.d.ts.map +1 -0
- package/dist/config/configSync.js +878 -0
- package/dist/config/configSync.js.map +1 -0
- package/dist/config/embeddingTimeouts.d.ts +145 -0
- package/dist/config/embeddingTimeouts.d.ts.map +1 -0
- package/dist/config/embeddingTimeouts.js +255 -0
- package/dist/config/embeddingTimeouts.js.map +1 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +7 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/languageConfig.d.ts +68 -0
- package/dist/config/languageConfig.d.ts.map +1 -0
- package/dist/config/languageConfig.js +473 -0
- package/dist/config/languageConfig.js.map +1 -0
- package/dist/config/password.d.ts +145 -0
- package/dist/config/password.d.ts.map +1 -0
- package/dist/config/password.js +428 -0
- package/dist/config/password.js.map +1 -0
- package/dist/config.d.ts +338 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +1177 -0
- package/dist/config.js.map +1 -0
- package/dist/consolidation.d.ts +44 -0
- package/dist/consolidation.d.ts.map +1 -0
- package/dist/consolidation.js +447 -0
- package/dist/consolidation.js.map +1 -0
- package/dist/constants.d.ts +371 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +552 -0
- package/dist/constants.js.map +1 -0
- package/dist/coordination/TeamMemberRegistry.d.ts +192 -0
- package/dist/coordination/TeamMemberRegistry.d.ts.map +1 -0
- package/dist/coordination/TeamMemberRegistry.js +415 -0
- package/dist/coordination/TeamMemberRegistry.js.map +1 -0
- package/dist/coordination/events.d.ts +369 -0
- package/dist/coordination/events.d.ts.map +1 -0
- package/dist/coordination/events.js +232 -0
- package/dist/coordination/events.js.map +1 -0
- package/dist/coordination/handlers.d.ts +116 -0
- package/dist/coordination/handlers.d.ts.map +1 -0
- package/dist/coordination/handlers.js +400 -0
- package/dist/coordination/handlers.js.map +1 -0
- package/dist/coordination/index.d.ts +14 -0
- package/dist/coordination/index.d.ts.map +1 -0
- package/dist/coordination/index.js +31 -0
- package/dist/coordination/index.js.map +1 -0
- package/dist/coordination/integration.d.ts +260 -0
- package/dist/coordination/integration.d.ts.map +1 -0
- package/dist/coordination/integration.js +472 -0
- package/dist/coordination/integration.js.map +1 -0
- package/dist/coordination/server.d.ts +266 -0
- package/dist/coordination/server.d.ts.map +1 -0
- package/dist/coordination/server.js +995 -0
- package/dist/coordination/server.js.map +1 -0
- package/dist/coordination/serviceProvider.d.ts +70 -0
- package/dist/coordination/serviceProvider.d.ts.map +1 -0
- package/dist/coordination/serviceProvider.js +273 -0
- package/dist/coordination/serviceProvider.js.map +1 -0
- package/dist/dashboard/api/claudeControl.d.ts +44 -0
- package/dist/dashboard/api/claudeControl.d.ts.map +1 -0
- package/dist/dashboard/api/claudeControl.js +650 -0
- package/dist/dashboard/api/claudeControl.js.map +1 -0
- package/dist/dashboard/api/claudeHistory.d.ts +4 -0
- package/dist/dashboard/api/claudeHistory.d.ts.map +1 -0
- package/dist/dashboard/api/claudeHistory.js +319 -0
- package/dist/dashboard/api/claudeHistory.js.map +1 -0
- package/dist/dashboard/api/dataExport.d.ts +23 -0
- package/dist/dashboard/api/dataExport.d.ts.map +1 -0
- package/dist/dashboard/api/dataExport.js +509 -0
- package/dist/dashboard/api/dataExport.js.map +1 -0
- package/dist/dashboard/api/fileManager.d.ts +39 -0
- package/dist/dashboard/api/fileManager.d.ts.map +1 -0
- package/dist/dashboard/api/fileManager.js +814 -0
- package/dist/dashboard/api/fileManager.js.map +1 -0
- package/dist/dashboard/api/hooks.d.ts +16 -0
- package/dist/dashboard/api/hooks.d.ts.map +1 -0
- package/dist/dashboard/api/hooks.js +342 -0
- package/dist/dashboard/api/hooks.js.map +1 -0
- package/dist/dashboard/api/hotReload.d.ts +14 -0
- package/dist/dashboard/api/hotReload.d.ts.map +1 -0
- package/dist/dashboard/api/hotReload.js +219 -0
- package/dist/dashboard/api/hotReload.js.map +1 -0
- package/dist/dashboard/api/liveSessionStream.d.ts +19 -0
- package/dist/dashboard/api/liveSessionStream.d.ts.map +1 -0
- package/dist/dashboard/api/liveSessionStream.js +430 -0
- package/dist/dashboard/api/liveSessionStream.js.map +1 -0
- package/dist/dashboard/api/memoryRecall.d.ts +20 -0
- package/dist/dashboard/api/memoryRecall.d.ts.map +1 -0
- package/dist/dashboard/api/memoryRecall.js +524 -0
- package/dist/dashboard/api/memoryRecall.js.map +1 -0
- package/dist/dashboard/api/promptSend.d.ts +33 -0
- package/dist/dashboard/api/promptSend.d.ts.map +1 -0
- package/dist/dashboard/api/promptSend.js +544 -0
- package/dist/dashboard/api/promptSend.js.map +1 -0
- package/dist/dashboard/api/settings.d.ts +10 -0
- package/dist/dashboard/api/settings.d.ts.map +1 -0
- package/dist/dashboard/api/settings.js +656 -0
- package/dist/dashboard/api/settings.js.map +1 -0
- package/dist/dashboard/api/setup.d.ts +21 -0
- package/dist/dashboard/api/setup.d.ts.map +1 -0
- package/dist/dashboard/api/setup.js +663 -0
- package/dist/dashboard/api/setup.js.map +1 -0
- package/dist/dashboard/api/specmemTools.d.ts +14 -0
- package/dist/dashboard/api/specmemTools.d.ts.map +1 -0
- package/dist/dashboard/api/specmemTools.js +1059 -0
- package/dist/dashboard/api/specmemTools.js.map +1 -0
- package/dist/dashboard/api/taskTeamMembers.d.ts +8 -0
- package/dist/dashboard/api/taskTeamMembers.d.ts.map +1 -0
- package/dist/dashboard/api/taskTeamMembers.js +136 -0
- package/dist/dashboard/api/taskTeamMembers.js.map +1 -0
- package/dist/dashboard/api/teamMemberDeploy.d.ts +15 -0
- package/dist/dashboard/api/teamMemberDeploy.d.ts.map +1 -0
- package/dist/dashboard/api/teamMemberDeploy.js +421 -0
- package/dist/dashboard/api/teamMemberDeploy.js.map +1 -0
- package/dist/dashboard/api/teamMemberHistory.d.ts +38 -0
- package/dist/dashboard/api/teamMemberHistory.d.ts.map +1 -0
- package/dist/dashboard/api/teamMemberHistory.js +583 -0
- package/dist/dashboard/api/teamMemberHistory.js.map +1 -0
- package/dist/dashboard/api/terminal.d.ts +12 -0
- package/dist/dashboard/api/terminal.d.ts.map +1 -0
- package/dist/dashboard/api/terminal.js +344 -0
- package/dist/dashboard/api/terminal.js.map +1 -0
- package/dist/dashboard/api/terminalInject.d.ts +17 -0
- package/dist/dashboard/api/terminalInject.d.ts.map +1 -0
- package/dist/dashboard/api/terminalInject.js +322 -0
- package/dist/dashboard/api/terminalInject.js.map +1 -0
- package/dist/dashboard/api/terminalStream.d.ts +12 -0
- package/dist/dashboard/api/terminalStream.d.ts.map +1 -0
- package/dist/dashboard/api/terminalStream.js +482 -0
- package/dist/dashboard/api/terminalStream.js.map +1 -0
- package/dist/dashboard/index.d.ts +7 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +7 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/ptyStreamer.d.ts +173 -0
- package/dist/dashboard/ptyStreamer.d.ts.map +1 -0
- package/dist/dashboard/ptyStreamer.js +661 -0
- package/dist/dashboard/ptyStreamer.js.map +1 -0
- package/dist/dashboard/public/DASHBOARD-README.md +378 -0
- package/dist/dashboard/public/INTEGRATION-GUIDE.md +395 -0
- package/dist/dashboard/public/codebase-config.html +1247 -0
- package/dist/dashboard/public/dashboard-v2.html +1942 -0
- package/dist/dashboard/public/data-export.html +819 -0
- package/dist/dashboard/public/example-page.html +164 -0
- package/dist/dashboard/public/file-explorer.html +1023 -0
- package/dist/dashboard/public/hooks.html +1103 -0
- package/dist/dashboard/public/index-improvements.css +499 -0
- package/dist/dashboard/public/index.html +5534 -0
- package/dist/dashboard/public/memory-controls.html +1959 -0
- package/dist/dashboard/public/memory-recall.html +1495 -0
- package/dist/dashboard/public/previews/skeleton-memory-graph.html +361 -0
- package/dist/dashboard/public/previews/skeleton-memory-list.html +366 -0
- package/dist/dashboard/public/previews/skeleton-search-results.html +609 -0
- package/dist/dashboard/public/previews/skeleton-stats-dashboard.html +556 -0
- package/dist/dashboard/public/prompt-console.html +2763 -0
- package/dist/dashboard/public/react-dist/assets/index-CkjobT5B.js +871 -0
- package/dist/dashboard/public/react-dist/assets/index-iRclxMst.css +1 -0
- package/dist/dashboard/public/react-dist/index.html +16 -0
- package/dist/dashboard/public/shared-header.js +325 -0
- package/dist/dashboard/public/shared-language-selector.js +626 -0
- package/dist/dashboard/public/shared-logger.js +66 -0
- package/dist/dashboard/public/shared-nav.js +325 -0
- package/dist/dashboard/public/shared-theme-blue.css +331 -0
- package/dist/dashboard/public/shared-theme.css +813 -0
- package/dist/dashboard/public/shared-toast.js +415 -0
- package/dist/dashboard/public/team-member-history.html +1291 -0
- package/dist/dashboard/public/team-member-spy.html +1199 -0
- package/dist/dashboard/public/team-members.html +3756 -0
- package/dist/dashboard/public/terminal-output.html +1013 -0
- package/dist/dashboard/public/terminal.html +372 -0
- package/dist/dashboard/sessionStore.d.ts +86 -0
- package/dist/dashboard/sessionStore.d.ts.map +1 -0
- package/dist/dashboard/sessionStore.js +262 -0
- package/dist/dashboard/sessionStore.js.map +1 -0
- package/dist/dashboard/standalone.d.ts +27 -0
- package/dist/dashboard/standalone.d.ts.map +1 -0
- package/dist/dashboard/standalone.js +380 -0
- package/dist/dashboard/standalone.js.map +1 -0
- package/dist/dashboard/webServer.d.ts +390 -0
- package/dist/dashboard/webServer.d.ts.map +1 -0
- package/dist/dashboard/webServer.js +4297 -0
- package/dist/dashboard/webServer.js.map +1 -0
- package/dist/dashboard/websocket/teamMemberStream.d.ts +87 -0
- package/dist/dashboard/websocket/teamMemberStream.d.ts.map +1 -0
- package/dist/dashboard/websocket/teamMemberStream.js +366 -0
- package/dist/dashboard/websocket/teamMemberStream.js.map +1 -0
- package/dist/dashboard/websocket/terminalStream.d.ts +130 -0
- package/dist/dashboard/websocket/terminalStream.d.ts.map +1 -0
- package/dist/dashboard/websocket/terminalStream.js +456 -0
- package/dist/dashboard/websocket/terminalStream.js.map +1 -0
- package/dist/database/embeddedPostgres.d.ts +187 -0
- package/dist/database/embeddedPostgres.d.ts.map +1 -0
- package/dist/database/embeddedPostgres.js +763 -0
- package/dist/database/embeddedPostgres.js.map +1 -0
- package/dist/database/index.d.ts +12 -0
- package/dist/database/index.d.ts.map +1 -0
- package/dist/database/index.js +20 -0
- package/dist/database/index.js.map +1 -0
- package/dist/database/initEmbeddedPostgres.d.ts +124 -0
- package/dist/database/initEmbeddedPostgres.d.ts.map +1 -0
- package/dist/database/initEmbeddedPostgres.js +855 -0
- package/dist/database/initEmbeddedPostgres.js.map +1 -0
- package/dist/database.d.ts +256 -0
- package/dist/database.d.ts.map +1 -0
- package/dist/database.js +1209 -0
- package/dist/database.js.map +1 -0
- package/dist/db/apiDataManager.d.ts +334 -0
- package/dist/db/apiDataManager.d.ts.map +1 -0
- package/dist/db/apiDataManager.js +631 -0
- package/dist/db/apiDataManager.js.map +1 -0
- package/dist/db/batchOperations.d.ts +154 -0
- package/dist/db/batchOperations.d.ts.map +1 -0
- package/dist/db/batchOperations.js +564 -0
- package/dist/db/batchOperations.js.map +1 -0
- package/dist/db/bigBrainMigrations.d.ts +48 -0
- package/dist/db/bigBrainMigrations.d.ts.map +1 -0
- package/dist/db/bigBrainMigrations.js +4266 -0
- package/dist/db/bigBrainMigrations.js.map +1 -0
- package/dist/db/connectionPoolGoBrrr.d.ts +94 -0
- package/dist/db/connectionPoolGoBrrr.d.ts.map +1 -0
- package/dist/db/connectionPoolGoBrrr.js +548 -0
- package/dist/db/connectionPoolGoBrrr.js.map +1 -0
- package/dist/db/dashboardQueries.d.ts +182 -0
- package/dist/db/dashboardQueries.d.ts.map +1 -0
- package/dist/db/dashboardQueries.js +821 -0
- package/dist/db/dashboardQueries.js.map +1 -0
- package/dist/db/deploymentBootstrap.d.ts +43 -0
- package/dist/db/deploymentBootstrap.d.ts.map +1 -0
- package/dist/db/deploymentBootstrap.js +329 -0
- package/dist/db/deploymentBootstrap.js.map +1 -0
- package/dist/db/dimensionService.d.ts +140 -0
- package/dist/db/dimensionService.d.ts.map +1 -0
- package/dist/db/dimensionService.js +261 -0
- package/dist/db/dimensionService.js.map +1 -0
- package/dist/db/embeddingOverflow.d.ts +69 -0
- package/dist/db/embeddingOverflow.d.ts.map +1 -0
- package/dist/db/embeddingOverflow.js +332 -0
- package/dist/db/embeddingOverflow.js.map +1 -0
- package/dist/db/embeddingOverflow.sql +221 -0
- package/dist/db/findThatShit.d.ts +145 -0
- package/dist/db/findThatShit.d.ts.map +1 -0
- package/dist/db/findThatShit.js +782 -0
- package/dist/db/findThatShit.js.map +1 -0
- package/dist/db/hotPathManager.d.ts +187 -0
- package/dist/db/hotPathManager.d.ts.map +1 -0
- package/dist/db/hotPathManager.js +504 -0
- package/dist/db/hotPathManager.js.map +1 -0
- package/dist/db/index.d.ts +85 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +219 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/memoryDrilldown.sql +99 -0
- package/dist/db/migrate.d.ts +3 -0
- package/dist/db/migrate.d.ts.map +1 -0
- package/dist/db/migrate.js +97 -0
- package/dist/db/migrate.js.map +1 -0
- package/dist/db/migrateJsonToPostgres.d.ts +43 -0
- package/dist/db/migrateJsonToPostgres.d.ts.map +1 -0
- package/dist/db/migrateJsonToPostgres.js +465 -0
- package/dist/db/migrateJsonToPostgres.js.map +1 -0
- package/dist/db/nukeFromOrbit.d.ts +63 -0
- package/dist/db/nukeFromOrbit.d.ts.map +1 -0
- package/dist/db/nukeFromOrbit.js +499 -0
- package/dist/db/nukeFromOrbit.js.map +1 -0
- package/dist/db/processedTraining.sql +60 -0
- package/dist/db/projectNamespacing.d.ts +258 -0
- package/dist/db/projectNamespacing.d.ts.map +1 -0
- package/dist/db/projectNamespacing.js +920 -0
- package/dist/db/projectNamespacing.js.map +1 -0
- package/dist/db/projectNamespacing.sql +374 -0
- package/dist/db/projectSchemaInit.sql +271 -0
- package/dist/db/spatialMemory.d.ts +296 -0
- package/dist/db/spatialMemory.d.ts.map +1 -0
- package/dist/db/spatialMemory.js +818 -0
- package/dist/db/spatialMemory.js.map +1 -0
- package/dist/db/streamingQuery.d.ts +143 -0
- package/dist/db/streamingQuery.d.ts.map +1 -0
- package/dist/db/streamingQuery.js +350 -0
- package/dist/db/streamingQuery.js.map +1 -0
- package/dist/db/teamComms.sql +224 -0
- package/dist/db/yeetStuffInDb.d.ts +72 -0
- package/dist/db/yeetStuffInDb.d.ts.map +1 -0
- package/dist/db/yeetStuffInDb.js +473 -0
- package/dist/db/yeetStuffInDb.js.map +1 -0
- package/dist/embedding-providers/index.d.ts +10 -0
- package/dist/embedding-providers/index.d.ts.map +1 -0
- package/dist/embedding-providers/index.js +12 -0
- package/dist/embedding-providers/index.js.map +1 -0
- package/dist/embeddings/projectionLayer.d.ts +114 -0
- package/dist/embeddings/projectionLayer.d.ts.map +1 -0
- package/dist/embeddings/projectionLayer.js +345 -0
- package/dist/embeddings/projectionLayer.js.map +1 -0
- package/dist/events/Publisher.d.ts +193 -0
- package/dist/events/Publisher.d.ts.map +1 -0
- package/dist/events/Publisher.js +439 -0
- package/dist/events/Publisher.js.map +1 -0
- package/dist/events/config.d.ts +139 -0
- package/dist/events/config.d.ts.map +1 -0
- package/dist/events/config.js +266 -0
- package/dist/events/config.js.map +1 -0
- package/dist/events/index.d.ts +19 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +31 -0
- package/dist/events/index.js.map +1 -0
- package/dist/events/integration.d.ts +206 -0
- package/dist/events/integration.d.ts.map +1 -0
- package/dist/events/integration.js +348 -0
- package/dist/events/integration.js.map +1 -0
- package/dist/events/metrics.d.ts +147 -0
- package/dist/events/metrics.d.ts.map +1 -0
- package/dist/events/metrics.js +343 -0
- package/dist/events/metrics.js.map +1 -0
- package/dist/hooks/cli.d.ts +28 -0
- package/dist/hooks/cli.d.ts.map +1 -0
- package/dist/hooks/cli.js +118 -0
- package/dist/hooks/cli.js.map +1 -0
- package/dist/hooks/contextInjectionHook.d.ts +60 -0
- package/dist/hooks/contextInjectionHook.d.ts.map +1 -0
- package/dist/hooks/contextInjectionHook.js +294 -0
- package/dist/hooks/contextInjectionHook.js.map +1 -0
- package/dist/hooks/drilldownHook.d.ts +125 -0
- package/dist/hooks/drilldownHook.d.ts.map +1 -0
- package/dist/hooks/drilldownHook.js +181 -0
- package/dist/hooks/drilldownHook.js.map +1 -0
- package/dist/hooks/hookManager.d.ts +180 -0
- package/dist/hooks/hookManager.d.ts.map +1 -0
- package/dist/hooks/hookManager.js +782 -0
- package/dist/hooks/hookManager.js.map +1 -0
- package/dist/hooks/index.d.ts +62 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +66 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/lowContextHook.d.ts +71 -0
- package/dist/hooks/lowContextHook.d.ts.map +1 -0
- package/dist/hooks/lowContextHook.js +258 -0
- package/dist/hooks/lowContextHook.js.map +1 -0
- package/dist/hooks/simpleContextHook.d.ts +65 -0
- package/dist/hooks/simpleContextHook.d.ts.map +1 -0
- package/dist/hooks/simpleContextHook.js +194 -0
- package/dist/hooks/simpleContextHook.js.map +1 -0
- package/dist/hooks/teamFramingCli.d.ts +56 -0
- package/dist/hooks/teamFramingCli.d.ts.map +1 -0
- package/dist/hooks/teamFramingCli.js +264 -0
- package/dist/hooks/teamFramingCli.js.map +1 -0
- package/dist/hooks/teamMemberPrepromptHook.d.ts +150 -0
- package/dist/hooks/teamMemberPrepromptHook.d.ts.map +1 -0
- package/dist/hooks/teamMemberPrepromptHook.js +308 -0
- package/dist/hooks/teamMemberPrepromptHook.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4433 -0
- package/dist/index.js.map +1 -0
- package/dist/init/claudeConfigInjector.d.ts +116 -0
- package/dist/init/claudeConfigInjector.d.ts.map +1 -0
- package/dist/init/claudeConfigInjector.js +1154 -0
- package/dist/init/claudeConfigInjector.js.map +1 -0
- package/dist/installer/autoInstall.d.ts +72 -0
- package/dist/installer/autoInstall.d.ts.map +1 -0
- package/dist/installer/autoInstall.js +617 -0
- package/dist/installer/autoInstall.js.map +1 -0
- package/dist/installer/dbSetup.d.ts +84 -0
- package/dist/installer/dbSetup.d.ts.map +1 -0
- package/dist/installer/dbSetup.js +350 -0
- package/dist/installer/dbSetup.js.map +1 -0
- package/dist/installer/firstRun.d.ts +49 -0
- package/dist/installer/firstRun.d.ts.map +1 -0
- package/dist/installer/firstRun.js +207 -0
- package/dist/installer/firstRun.js.map +1 -0
- package/dist/installer/index.d.ts +10 -0
- package/dist/installer/index.d.ts.map +1 -0
- package/dist/installer/index.js +10 -0
- package/dist/installer/index.js.map +1 -0
- package/dist/installer/silentAutoInstall.d.ts +99 -0
- package/dist/installer/silentAutoInstall.d.ts.map +1 -0
- package/dist/installer/silentAutoInstall.js +491 -0
- package/dist/installer/silentAutoInstall.js.map +1 -0
- package/dist/installer/systemDeps.d.ts +54 -0
- package/dist/installer/systemDeps.d.ts.map +1 -0
- package/dist/installer/systemDeps.js +322 -0
- package/dist/installer/systemDeps.js.map +1 -0
- package/dist/mcp/cliNotifications.d.ts +133 -0
- package/dist/mcp/cliNotifications.d.ts.map +1 -0
- package/dist/mcp/cliNotifications.js +289 -0
- package/dist/mcp/cliNotifications.js.map +1 -0
- package/dist/mcp/embeddingServerManager.d.ts +307 -0
- package/dist/mcp/embeddingServerManager.d.ts.map +1 -0
- package/dist/mcp/embeddingServerManager.js +2081 -0
- package/dist/mcp/embeddingServerManager.js.map +1 -0
- package/dist/mcp/healthMonitor.d.ts +196 -0
- package/dist/mcp/healthMonitor.d.ts.map +1 -0
- package/dist/mcp/healthMonitor.js +685 -0
- package/dist/mcp/healthMonitor.js.map +1 -0
- package/dist/mcp/hotReloadManager.d.ts +101 -0
- package/dist/mcp/hotReloadManager.d.ts.map +1 -0
- package/dist/mcp/hotReloadManager.js +251 -0
- package/dist/mcp/hotReloadManager.js.map +1 -0
- package/dist/mcp/index.d.ts +16 -0
- package/dist/mcp/index.d.ts.map +1 -0
- package/dist/mcp/index.js +22 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/mcpProtocolHandler.d.ts +64 -0
- package/dist/mcp/mcpProtocolHandler.d.ts.map +1 -0
- package/dist/mcp/mcpProtocolHandler.js +253 -0
- package/dist/mcp/mcpProtocolHandler.js.map +1 -0
- package/dist/mcp/miniCOTServerManager.d.ts +336 -0
- package/dist/mcp/miniCOTServerManager.d.ts.map +1 -0
- package/dist/mcp/miniCOTServerManager.js +1384 -0
- package/dist/mcp/miniCOTServerManager.js.map +1 -0
- package/dist/mcp/promptExecutor.d.ts +188 -0
- package/dist/mcp/promptExecutor.d.ts.map +1 -0
- package/dist/mcp/promptExecutor.js +469 -0
- package/dist/mcp/promptExecutor.js.map +1 -0
- package/dist/mcp/reloadBroadcast.d.ts +127 -0
- package/dist/mcp/reloadBroadcast.d.ts.map +1 -0
- package/dist/mcp/reloadBroadcast.js +275 -0
- package/dist/mcp/reloadBroadcast.js.map +1 -0
- package/dist/mcp/resilientTransport.d.ts +249 -0
- package/dist/mcp/resilientTransport.d.ts.map +1 -0
- package/dist/mcp/resilientTransport.js +931 -0
- package/dist/mcp/resilientTransport.js.map +1 -0
- package/dist/mcp/samplingHandler.d.ts +129 -0
- package/dist/mcp/samplingHandler.d.ts.map +1 -0
- package/dist/mcp/samplingHandler.js +276 -0
- package/dist/mcp/samplingHandler.js.map +1 -0
- package/dist/mcp/specMemServer.d.ts +305 -0
- package/dist/mcp/specMemServer.d.ts.map +1 -0
- package/dist/mcp/specMemServer.js +2048 -0
- package/dist/mcp/specMemServer.js.map +1 -0
- package/dist/mcp/toolRegistry.d.ts +122 -0
- package/dist/mcp/toolRegistry.d.ts.map +1 -0
- package/dist/mcp/toolRegistry.js +609 -0
- package/dist/mcp/toolRegistry.js.map +1 -0
- package/dist/mcp/tools/embeddingControl.d.ts +114 -0
- package/dist/mcp/tools/embeddingControl.d.ts.map +1 -0
- package/dist/mcp/tools/embeddingControl.js +222 -0
- package/dist/mcp/tools/embeddingControl.js.map +1 -0
- package/dist/mcp/tools/index.d.ts +10 -0
- package/dist/mcp/tools/index.d.ts.map +1 -0
- package/dist/mcp/tools/index.js +17 -0
- package/dist/mcp/tools/index.js.map +1 -0
- package/dist/mcp/tools/teamComms.d.ts +444 -0
- package/dist/mcp/tools/teamComms.d.ts.map +1 -0
- package/dist/mcp/tools/teamComms.js +1953 -0
- package/dist/mcp/tools/teamComms.js.map +1 -0
- package/dist/mcp/triggerSystem.d.ts +129 -0
- package/dist/mcp/triggerSystem.d.ts.map +1 -0
- package/dist/mcp/triggerSystem.js +363 -0
- package/dist/mcp/triggerSystem.js.map +1 -0
- package/dist/mcp/watcherIntegration.d.ts +77 -0
- package/dist/mcp/watcherIntegration.d.ts.map +1 -0
- package/dist/mcp/watcherIntegration.js +428 -0
- package/dist/mcp/watcherIntegration.js.map +1 -0
- package/dist/mcp/watcherToolWrappers.d.ts +89 -0
- package/dist/mcp/watcherToolWrappers.d.ts.map +1 -0
- package/dist/mcp/watcherToolWrappers.js +91 -0
- package/dist/mcp/watcherToolWrappers.js.map +1 -0
- package/dist/memorization/claudeCodeMigration.d.ts +34 -0
- package/dist/memorization/claudeCodeMigration.d.ts.map +1 -0
- package/dist/memorization/claudeCodeMigration.js +210 -0
- package/dist/memorization/claudeCodeMigration.js.map +1 -0
- package/dist/memorization/claudeCodeTracker.d.ts +147 -0
- package/dist/memorization/claudeCodeTracker.d.ts.map +1 -0
- package/dist/memorization/claudeCodeTracker.js +424 -0
- package/dist/memorization/claudeCodeTracker.js.map +1 -0
- package/dist/memorization/codeMemorizer.d.ts +158 -0
- package/dist/memorization/codeMemorizer.d.ts.map +1 -0
- package/dist/memorization/codeMemorizer.js +357 -0
- package/dist/memorization/codeMemorizer.js.map +1 -0
- package/dist/memorization/codeRecall.d.ts +156 -0
- package/dist/memorization/codeRecall.d.ts.map +1 -0
- package/dist/memorization/codeRecall.js +499 -0
- package/dist/memorization/codeRecall.js.map +1 -0
- package/dist/memorization/index.d.ts +55 -0
- package/dist/memorization/index.d.ts.map +1 -0
- package/dist/memorization/index.js +64 -0
- package/dist/memorization/index.js.map +1 -0
- package/dist/memorization/memorizationTools.d.ts +413 -0
- package/dist/memorization/memorizationTools.d.ts.map +1 -0
- package/dist/memorization/memorizationTools.js +513 -0
- package/dist/memorization/memorizationTools.js.map +1 -0
- package/dist/memorization/watcherIntegration.d.ts +100 -0
- package/dist/memorization/watcherIntegration.d.ts.map +1 -0
- package/dist/memorization/watcherIntegration.js +196 -0
- package/dist/memorization/watcherIntegration.js.map +1 -0
- package/dist/memory/humanLikeMemory.d.ts +206 -0
- package/dist/memory/humanLikeMemory.d.ts.map +1 -0
- package/dist/memory/humanLikeMemory.js +603 -0
- package/dist/memory/humanLikeMemory.js.map +1 -0
- package/dist/memory/index.d.ts +22 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +24 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/memory/memoryEvolutionMigration.d.ts +36 -0
- package/dist/memory/memoryEvolutionMigration.d.ts.map +1 -0
- package/dist/memory/memoryEvolutionMigration.js +371 -0
- package/dist/memory/memoryEvolutionMigration.js.map +1 -0
- package/dist/memory/quadrantSearch.d.ts +221 -0
- package/dist/memory/quadrantSearch.d.ts.map +1 -0
- package/dist/memory/quadrantSearch.js +897 -0
- package/dist/memory/quadrantSearch.js.map +1 -0
- package/dist/middleware/apiVersioning.d.ts +83 -0
- package/dist/middleware/apiVersioning.d.ts.map +1 -0
- package/dist/middleware/apiVersioning.js +152 -0
- package/dist/middleware/apiVersioning.js.map +1 -0
- package/dist/middleware/compression.d.ts +48 -0
- package/dist/middleware/compression.d.ts.map +1 -0
- package/dist/middleware/compression.js +240 -0
- package/dist/middleware/compression.js.map +1 -0
- package/dist/middleware/csrf.d.ts +118 -0
- package/dist/middleware/csrf.d.ts.map +1 -0
- package/dist/middleware/csrf.js +300 -0
- package/dist/middleware/csrf.js.map +1 -0
- package/dist/middleware/index.d.ts +13 -0
- package/dist/middleware/index.d.ts.map +1 -0
- package/dist/middleware/index.js +17 -0
- package/dist/middleware/index.js.map +1 -0
- package/dist/middleware/wsRateLimiter.d.ts +129 -0
- package/dist/middleware/wsRateLimiter.d.ts.map +1 -0
- package/dist/middleware/wsRateLimiter.js +279 -0
- package/dist/middleware/wsRateLimiter.js.map +1 -0
- package/dist/migrations/run.d.ts +2 -0
- package/dist/migrations/run.d.ts.map +1 -0
- package/dist/migrations/run.js +25 -0
- package/dist/migrations/run.js.map +1 -0
- package/dist/migrations/syncDimensions.d.ts +24 -0
- package/dist/migrations/syncDimensions.d.ts.map +1 -0
- package/dist/migrations/syncDimensions.js +140 -0
- package/dist/migrations/syncDimensions.js.map +1 -0
- package/dist/migrations/teamComms.d.ts +16 -0
- package/dist/migrations/teamComms.d.ts.map +1 -0
- package/dist/migrations/teamComms.js +210 -0
- package/dist/migrations/teamComms.js.map +1 -0
- package/dist/openapi/index.d.ts +10 -0
- package/dist/openapi/index.d.ts.map +1 -0
- package/dist/openapi/index.js +10 -0
- package/dist/openapi/index.js.map +1 -0
- package/dist/openapi/spec.d.ts +902 -0
- package/dist/openapi/spec.d.ts.map +1 -0
- package/dist/openapi/spec.js +733 -0
- package/dist/openapi/spec.js.map +1 -0
- package/dist/packages/dependencyHistory.d.ts +113 -0
- package/dist/packages/dependencyHistory.d.ts.map +1 -0
- package/dist/packages/dependencyHistory.js +360 -0
- package/dist/packages/dependencyHistory.js.map +1 -0
- package/dist/packages/index.d.ts +30 -0
- package/dist/packages/index.d.ts.map +1 -0
- package/dist/packages/index.js +65 -0
- package/dist/packages/index.js.map +1 -0
- package/dist/packages/packageTools.d.ts +255 -0
- package/dist/packages/packageTools.d.ts.map +1 -0
- package/dist/packages/packageTools.js +242 -0
- package/dist/packages/packageTools.js.map +1 -0
- package/dist/packages/packageTracker.d.ts +98 -0
- package/dist/packages/packageTracker.d.ts.map +1 -0
- package/dist/packages/packageTracker.js +268 -0
- package/dist/packages/packageTracker.js.map +1 -0
- package/dist/packages/packageWatcher.d.ts +62 -0
- package/dist/packages/packageWatcher.d.ts.map +1 -0
- package/dist/packages/packageWatcher.js +146 -0
- package/dist/packages/packageWatcher.js.map +1 -0
- package/dist/providers/MiniCOTProvider.d.ts +48 -0
- package/dist/providers/MiniCOTProvider.d.ts.map +1 -0
- package/dist/providers/MiniCOTProvider.js +98 -0
- package/dist/providers/MiniCOTProvider.js.map +1 -0
- package/dist/reminders/index.d.ts +5 -0
- package/dist/reminders/index.d.ts.map +1 -0
- package/dist/reminders/index.js +5 -0
- package/dist/reminders/index.js.map +1 -0
- package/dist/reminders/skillReminder.d.ts +131 -0
- package/dist/reminders/skillReminder.d.ts.map +1 -0
- package/dist/reminders/skillReminder.js +386 -0
- package/dist/reminders/skillReminder.js.map +1 -0
- package/dist/search.d.ts +35 -0
- package/dist/search.d.ts.map +1 -0
- package/dist/search.js +574 -0
- package/dist/search.js.map +1 -0
- package/dist/security/localhostOnly.d.ts +36 -0
- package/dist/security/localhostOnly.d.ts.map +1 -0
- package/dist/security/localhostOnly.js +101 -0
- package/dist/security/localhostOnly.js.map +1 -0
- package/dist/services/CameraZoomSearch.d.ts +206 -0
- package/dist/services/CameraZoomSearch.d.ts.map +1 -0
- package/dist/services/CameraZoomSearch.js +669 -0
- package/dist/services/CameraZoomSearch.js.map +1 -0
- package/dist/services/DataFlowPipeline.d.ts +111 -0
- package/dist/services/DataFlowPipeline.d.ts.map +1 -0
- package/dist/services/DataFlowPipeline.js +379 -0
- package/dist/services/DataFlowPipeline.js.map +1 -0
- package/dist/services/DimensionAdapter.d.ts +194 -0
- package/dist/services/DimensionAdapter.d.ts.map +1 -0
- package/dist/services/DimensionAdapter.js +566 -0
- package/dist/services/DimensionAdapter.js.map +1 -0
- package/dist/services/DimensionService.d.ts +252 -0
- package/dist/services/DimensionService.d.ts.map +1 -0
- package/dist/services/DimensionService.js +564 -0
- package/dist/services/DimensionService.js.map +1 -0
- package/dist/services/EmbeddingQueue.d.ts +71 -0
- package/dist/services/EmbeddingQueue.d.ts.map +1 -0
- package/dist/services/EmbeddingQueue.js +258 -0
- package/dist/services/EmbeddingQueue.js.map +1 -0
- package/dist/services/MemoryDrilldown.d.ts +226 -0
- package/dist/services/MemoryDrilldown.d.ts.map +1 -0
- package/dist/services/MemoryDrilldown.js +479 -0
- package/dist/services/MemoryDrilldown.js.map +1 -0
- package/dist/services/MiniCOTScorer.d.ts +140 -0
- package/dist/services/MiniCOTScorer.d.ts.map +1 -0
- package/dist/services/MiniCOTScorer.js +292 -0
- package/dist/services/MiniCOTScorer.js.map +1 -0
- package/dist/services/ProjectContext.d.ts +342 -0
- package/dist/services/ProjectContext.d.ts.map +1 -0
- package/dist/services/ProjectContext.js +667 -0
- package/dist/services/ProjectContext.js.map +1 -0
- package/dist/services/ResponseCompactor.d.ts +135 -0
- package/dist/services/ResponseCompactor.d.ts.map +1 -0
- package/dist/services/ResponseCompactor.js +501 -0
- package/dist/services/ResponseCompactor.js.map +1 -0
- package/dist/services/TeamCommsDbService.d.ts +202 -0
- package/dist/services/TeamCommsDbService.d.ts.map +1 -0
- package/dist/services/TeamCommsDbService.js +526 -0
- package/dist/services/TeamCommsDbService.js.map +1 -0
- package/dist/services/UnifiedPasswordService.d.ts +166 -0
- package/dist/services/UnifiedPasswordService.d.ts.map +1 -0
- package/dist/services/UnifiedPasswordService.js +587 -0
- package/dist/services/UnifiedPasswordService.js.map +1 -0
- package/dist/services/adaptiveSearchConfig.d.ts +64 -0
- package/dist/services/adaptiveSearchConfig.d.ts.map +1 -0
- package/dist/services/adaptiveSearchConfig.js +187 -0
- package/dist/services/adaptiveSearchConfig.js.map +1 -0
- package/dist/skills/index.d.ts +8 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +8 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/skills/skillScanner.d.ts +203 -0
- package/dist/skills/skillScanner.d.ts.map +1 -0
- package/dist/skills/skillScanner.js +559 -0
- package/dist/skills/skillScanner.js.map +1 -0
- package/dist/skills/skillsResource.d.ts +69 -0
- package/dist/skills/skillsResource.d.ts.map +1 -0
- package/dist/skills/skillsResource.js +257 -0
- package/dist/skills/skillsResource.js.map +1 -0
- package/dist/startup/index.d.ts +9 -0
- package/dist/startup/index.d.ts.map +1 -0
- package/dist/startup/index.js +12 -0
- package/dist/startup/index.js.map +1 -0
- package/dist/startup/startupIndexing.d.ts +80 -0
- package/dist/startup/startupIndexing.d.ts.map +1 -0
- package/dist/startup/startupIndexing.js +463 -0
- package/dist/startup/startupIndexing.js.map +1 -0
- package/dist/startup/validation.d.ts +89 -0
- package/dist/startup/validation.d.ts.map +1 -0
- package/dist/startup/validation.js +590 -0
- package/dist/startup/validation.js.map +1 -0
- package/dist/storage/index.d.ts +4 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +4 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/overflowManager.d.ts +80 -0
- package/dist/storage/overflowManager.d.ts.map +1 -0
- package/dist/storage/overflowManager.js +317 -0
- package/dist/storage/overflowManager.js.map +1 -0
- package/dist/storage/overflowStorage.d.ts +69 -0
- package/dist/storage/overflowStorage.d.ts.map +1 -0
- package/dist/storage/overflowStorage.js +379 -0
- package/dist/storage/overflowStorage.js.map +1 -0
- package/dist/storage/toonFormat.d.ts +50 -0
- package/dist/storage/toonFormat.d.ts.map +1 -0
- package/dist/storage/toonFormat.js +224 -0
- package/dist/storage/toonFormat.js.map +1 -0
- package/dist/team-members/communication.d.ts +237 -0
- package/dist/team-members/communication.d.ts.map +1 -0
- package/dist/team-members/communication.js +650 -0
- package/dist/team-members/communication.js.map +1 -0
- package/dist/team-members/index.d.ts +14 -0
- package/dist/team-members/index.d.ts.map +1 -0
- package/dist/team-members/index.js +22 -0
- package/dist/team-members/index.js.map +1 -0
- package/dist/team-members/taskOrchestrator.d.ts +224 -0
- package/dist/team-members/taskOrchestrator.d.ts.map +1 -0
- package/dist/team-members/taskOrchestrator.js +574 -0
- package/dist/team-members/taskOrchestrator.js.map +1 -0
- package/dist/team-members/taskTeamMemberLogger.d.ts +157 -0
- package/dist/team-members/taskTeamMemberLogger.d.ts.map +1 -0
- package/dist/team-members/taskTeamMemberLogger.js +478 -0
- package/dist/team-members/taskTeamMemberLogger.js.map +1 -0
- package/dist/team-members/teamCommsService.d.ts +221 -0
- package/dist/team-members/teamCommsService.d.ts.map +1 -0
- package/dist/team-members/teamCommsService.js +628 -0
- package/dist/team-members/teamCommsService.js.map +1 -0
- package/dist/team-members/teamMemberChannels.d.ts +217 -0
- package/dist/team-members/teamMemberChannels.d.ts.map +1 -0
- package/dist/team-members/teamMemberChannels.js +687 -0
- package/dist/team-members/teamMemberChannels.js.map +1 -0
- package/dist/team-members/teamMemberDashboard.d.ts +222 -0
- package/dist/team-members/teamMemberDashboard.d.ts.map +1 -0
- package/dist/team-members/teamMemberDashboard.js +610 -0
- package/dist/team-members/teamMemberDashboard.js.map +1 -0
- package/dist/team-members/teamMemberDeployment.d.ts +60 -0
- package/dist/team-members/teamMemberDeployment.d.ts.map +1 -0
- package/dist/team-members/teamMemberDeployment.js +429 -0
- package/dist/team-members/teamMemberDeployment.js.map +1 -0
- package/dist/team-members/teamMemberDiscovery.d.ts +178 -0
- package/dist/team-members/teamMemberDiscovery.d.ts.map +1 -0
- package/dist/team-members/teamMemberDiscovery.js +446 -0
- package/dist/team-members/teamMemberDiscovery.js.map +1 -0
- package/dist/team-members/teamMemberHistory.d.ts +80 -0
- package/dist/team-members/teamMemberHistory.d.ts.map +1 -0
- package/dist/team-members/teamMemberHistory.js +426 -0
- package/dist/team-members/teamMemberHistory.js.map +1 -0
- package/dist/team-members/teamMemberLimits.d.ts +66 -0
- package/dist/team-members/teamMemberLimits.d.ts.map +1 -0
- package/dist/team-members/teamMemberLimits.js +259 -0
- package/dist/team-members/teamMemberLimits.js.map +1 -0
- package/dist/team-members/teamMemberRegistry.d.ts +199 -0
- package/dist/team-members/teamMemberRegistry.d.ts.map +1 -0
- package/dist/team-members/teamMemberRegistry.js +572 -0
- package/dist/team-members/teamMemberRegistry.js.map +1 -0
- package/dist/team-members/teamMemberTracker.d.ts +148 -0
- package/dist/team-members/teamMemberTracker.d.ts.map +1 -0
- package/dist/team-members/teamMemberTracker.js +828 -0
- package/dist/team-members/teamMemberTracker.js.map +1 -0
- package/dist/team-members/workers/aiWorker.d.ts +53 -0
- package/dist/team-members/workers/aiWorker.d.ts.map +1 -0
- package/dist/team-members/workers/aiWorker.js +322 -0
- package/dist/team-members/workers/aiWorker.js.map +1 -0
- package/dist/team-members/workers/baseWorker.d.ts +101 -0
- package/dist/team-members/workers/baseWorker.d.ts.map +1 -0
- package/dist/team-members/workers/baseWorker.js +179 -0
- package/dist/team-members/workers/baseWorker.js.map +1 -0
- package/dist/team-members/workers/codeReviewWorker.d.ts +3 -0
- package/dist/team-members/workers/codeReviewWorker.d.ts.map +1 -0
- package/dist/team-members/workers/codeReviewWorker.js +144 -0
- package/dist/team-members/workers/codeReviewWorker.js.map +1 -0
- package/dist/team-members/workers/index.d.ts +7 -0
- package/dist/team-members/workers/index.d.ts.map +1 -0
- package/dist/team-members/workers/index.js +7 -0
- package/dist/team-members/workers/index.js.map +1 -0
- package/dist/team-members/workers/repairWorker.d.ts +9 -0
- package/dist/team-members/workers/repairWorker.d.ts.map +1 -0
- package/dist/team-members/workers/repairWorker.js +102 -0
- package/dist/team-members/workers/repairWorker.js.map +1 -0
- package/dist/team-members/workers/sendToTeamMemberB.d.ts +9 -0
- package/dist/team-members/workers/sendToTeamMemberB.d.ts.map +1 -0
- package/dist/team-members/workers/sendToTeamMemberB.js +105 -0
- package/dist/team-members/workers/sendToTeamMemberB.js.map +1 -0
- package/dist/team-members/workers/specmemClient.d.ts +179 -0
- package/dist/team-members/workers/specmemClient.d.ts.map +1 -0
- package/dist/team-members/workers/specmemClient.js +421 -0
- package/dist/team-members/workers/specmemClient.js.map +1 -0
- package/dist/team-members/workers/testCommunication.d.ts +8 -0
- package/dist/team-members/workers/testCommunication.d.ts.map +1 -0
- package/dist/team-members/workers/testCommunication.js +136 -0
- package/dist/team-members/workers/testCommunication.js.map +1 -0
- package/dist/team-members/workers/testCommunicationSuite.d.ts +26 -0
- package/dist/team-members/workers/testCommunicationSuite.d.ts.map +1 -0
- package/dist/team-members/workers/testCommunicationSuite.js +415 -0
- package/dist/team-members/workers/testCommunicationSuite.js.map +1 -0
- package/dist/team-members/workers/testWorker.d.ts +9 -0
- package/dist/team-members/workers/testWorker.d.ts.map +1 -0
- package/dist/team-members/workers/testWorker.js +107 -0
- package/dist/team-members/workers/testWorker.js.map +1 -0
- package/dist/tools/agentDefinitions.d.ts +30 -0
- package/dist/tools/agentDefinitions.d.ts.map +1 -0
- package/dist/tools/agentDefinitions.js +166 -0
- package/dist/tools/agentDefinitions.js.map +1 -0
- package/dist/tools/goofy/checkSyncStatus.d.ts +68 -0
- package/dist/tools/goofy/checkSyncStatus.d.ts.map +1 -0
- package/dist/tools/goofy/checkSyncStatus.js +112 -0
- package/dist/tools/goofy/checkSyncStatus.js.map +1 -0
- package/dist/tools/goofy/codeMemoryLink.d.ts +82 -0
- package/dist/tools/goofy/codeMemoryLink.d.ts.map +1 -0
- package/dist/tools/goofy/codeMemoryLink.js +212 -0
- package/dist/tools/goofy/codeMemoryLink.js.map +1 -0
- package/dist/tools/goofy/compareInstanceMemory.d.ts +97 -0
- package/dist/tools/goofy/compareInstanceMemory.d.ts.map +1 -0
- package/dist/tools/goofy/compareInstanceMemory.js +218 -0
- package/dist/tools/goofy/compareInstanceMemory.js.map +1 -0
- package/dist/tools/goofy/createReasoningChain.d.ts +135 -0
- package/dist/tools/goofy/createReasoningChain.d.ts.map +1 -0
- package/dist/tools/goofy/createReasoningChain.js +257 -0
- package/dist/tools/goofy/createReasoningChain.js.map +1 -0
- package/dist/tools/goofy/deployTeamMember.d.ts +63 -0
- package/dist/tools/goofy/deployTeamMember.d.ts.map +1 -0
- package/dist/tools/goofy/deployTeamMember.js +103 -0
- package/dist/tools/goofy/deployTeamMember.js.map +1 -0
- package/dist/tools/goofy/drillDown.d.ts +143 -0
- package/dist/tools/goofy/drillDown.d.ts.map +1 -0
- package/dist/tools/goofy/drillDown.js +288 -0
- package/dist/tools/goofy/drillDown.js.map +1 -0
- package/dist/tools/goofy/extractClaudeSessions.d.ts +90 -0
- package/dist/tools/goofy/extractClaudeSessions.d.ts.map +1 -0
- package/dist/tools/goofy/extractClaudeSessions.js +277 -0
- package/dist/tools/goofy/extractClaudeSessions.js.map +1 -0
- package/dist/tools/goofy/extractContextRestorations.d.ts +70 -0
- package/dist/tools/goofy/extractContextRestorations.d.ts.map +1 -0
- package/dist/tools/goofy/extractContextRestorations.js +100 -0
- package/dist/tools/goofy/extractContextRestorations.js.map +1 -0
- package/dist/tools/goofy/findCodePointers.d.ts +364 -0
- package/dist/tools/goofy/findCodePointers.d.ts.map +1 -0
- package/dist/tools/goofy/findCodePointers.js +1764 -0
- package/dist/tools/goofy/findCodePointers.js.map +1 -0
- package/dist/tools/goofy/findMemoryGallery.d.ts +40 -0
- package/dist/tools/goofy/findMemoryGallery.d.ts.map +1 -0
- package/dist/tools/goofy/findMemoryGallery.js +66 -0
- package/dist/tools/goofy/findMemoryGallery.js.map +1 -0
- package/dist/tools/goofy/findWhatISaid.d.ts +300 -0
- package/dist/tools/goofy/findWhatISaid.d.ts.map +1 -0
- package/dist/tools/goofy/findWhatISaid.js +2547 -0
- package/dist/tools/goofy/findWhatISaid.js.map +1 -0
- package/dist/tools/goofy/forceResync.d.ts +57 -0
- package/dist/tools/goofy/forceResync.d.ts.map +1 -0
- package/dist/tools/goofy/forceResync.js +100 -0
- package/dist/tools/goofy/forceResync.js.map +1 -0
- package/dist/tools/goofy/getActiveTeamMembers.d.ts +48 -0
- package/dist/tools/goofy/getActiveTeamMembers.d.ts.map +1 -0
- package/dist/tools/goofy/getActiveTeamMembers.js +136 -0
- package/dist/tools/goofy/getActiveTeamMembers.js.map +1 -0
- package/dist/tools/goofy/getMemoryFull.d.ts +34 -0
- package/dist/tools/goofy/getMemoryFull.d.ts.map +1 -0
- package/dist/tools/goofy/getMemoryFull.js +58 -0
- package/dist/tools/goofy/getMemoryFull.js.map +1 -0
- package/dist/tools/goofy/getSessionWatcherStatus.d.ts +43 -0
- package/dist/tools/goofy/getSessionWatcherStatus.d.ts.map +1 -0
- package/dist/tools/goofy/getSessionWatcherStatus.js +92 -0
- package/dist/tools/goofy/getSessionWatcherStatus.js.map +1 -0
- package/dist/tools/goofy/getTeamMemberOutput.d.ts +35 -0
- package/dist/tools/goofy/getTeamMemberOutput.d.ts.map +1 -0
- package/dist/tools/goofy/getTeamMemberOutput.js +62 -0
- package/dist/tools/goofy/getTeamMemberOutput.js.map +1 -0
- package/dist/tools/goofy/getTeamMemberScreen.d.ts +28 -0
- package/dist/tools/goofy/getTeamMemberScreen.d.ts.map +1 -0
- package/dist/tools/goofy/getTeamMemberScreen.js +59 -0
- package/dist/tools/goofy/getTeamMemberScreen.js.map +1 -0
- package/dist/tools/goofy/getTeamMemberStatus.d.ts +33 -0
- package/dist/tools/goofy/getTeamMemberStatus.d.ts.map +1 -0
- package/dist/tools/goofy/getTeamMemberStatus.js +56 -0
- package/dist/tools/goofy/getTeamMemberStatus.js.map +1 -0
- package/dist/tools/goofy/index.d.ts +39 -0
- package/dist/tools/goofy/index.d.ts.map +1 -0
- package/dist/tools/goofy/index.js +51 -0
- package/dist/tools/goofy/index.js.map +1 -0
- package/dist/tools/goofy/interveneTeamMember.d.ts +33 -0
- package/dist/tools/goofy/interveneTeamMember.d.ts.map +1 -0
- package/dist/tools/goofy/interveneTeamMember.js +69 -0
- package/dist/tools/goofy/interveneTeamMember.js.map +1 -0
- package/dist/tools/goofy/killDeployedTeamMember.d.ts +29 -0
- package/dist/tools/goofy/killDeployedTeamMember.d.ts.map +1 -0
- package/dist/tools/goofy/killDeployedTeamMember.js +56 -0
- package/dist/tools/goofy/killDeployedTeamMember.js.map +1 -0
- package/dist/tools/goofy/linkTheVibes.d.ts +125 -0
- package/dist/tools/goofy/linkTheVibes.d.ts.map +1 -0
- package/dist/tools/goofy/linkTheVibes.js +354 -0
- package/dist/tools/goofy/linkTheVibes.js.map +1 -0
- package/dist/tools/goofy/listDeployedTeamMembers.d.ts +26 -0
- package/dist/tools/goofy/listDeployedTeamMembers.d.ts.map +1 -0
- package/dist/tools/goofy/listDeployedTeamMembers.js +52 -0
- package/dist/tools/goofy/listDeployedTeamMembers.js.map +1 -0
- package/dist/tools/goofy/listenForMessages.d.ts +56 -0
- package/dist/tools/goofy/listenForMessages.d.ts.map +1 -0
- package/dist/tools/goofy/listenForMessages.js +122 -0
- package/dist/tools/goofy/listenForMessages.js.map +1 -0
- package/dist/tools/goofy/memoryHealthCheck.d.ts +159 -0
- package/dist/tools/goofy/memoryHealthCheck.d.ts.map +1 -0
- package/dist/tools/goofy/memoryHealthCheck.js +443 -0
- package/dist/tools/goofy/memoryHealthCheck.js.map +1 -0
- package/dist/tools/goofy/rememberThisShit.d.ts +103 -0
- package/dist/tools/goofy/rememberThisShit.d.ts.map +1 -0
- package/dist/tools/goofy/rememberThisShit.js +291 -0
- package/dist/tools/goofy/rememberThisShit.js.map +1 -0
- package/dist/tools/goofy/sayToTeamMember.d.ts +55 -0
- package/dist/tools/goofy/sayToTeamMember.d.ts.map +1 -0
- package/dist/tools/goofy/sayToTeamMember.js +116 -0
- package/dist/tools/goofy/sayToTeamMember.js.map +1 -0
- package/dist/tools/goofy/selfMessage.d.ts +54 -0
- package/dist/tools/goofy/selfMessage.d.ts.map +1 -0
- package/dist/tools/goofy/selfMessage.js +111 -0
- package/dist/tools/goofy/selfMessage.js.map +1 -0
- package/dist/tools/goofy/sendHeartbeat.d.ts +53 -0
- package/dist/tools/goofy/sendHeartbeat.d.ts.map +1 -0
- package/dist/tools/goofy/sendHeartbeat.js +119 -0
- package/dist/tools/goofy/sendHeartbeat.js.map +1 -0
- package/dist/tools/goofy/showMeTheStats.d.ts +216 -0
- package/dist/tools/goofy/showMeTheStats.d.ts.map +1 -0
- package/dist/tools/goofy/showMeTheStats.js +535 -0
- package/dist/tools/goofy/showMeTheStats.js.map +1 -0
- package/dist/tools/goofy/smartRecall.d.ts +136 -0
- package/dist/tools/goofy/smartRecall.d.ts.map +1 -0
- package/dist/tools/goofy/smartRecall.js +286 -0
- package/dist/tools/goofy/smartRecall.js.map +1 -0
- package/dist/tools/goofy/smartSearch.d.ts +64 -0
- package/dist/tools/goofy/smartSearch.d.ts.map +1 -0
- package/dist/tools/goofy/smartSearch.js +89 -0
- package/dist/tools/goofy/smartSearch.js.map +1 -0
- package/dist/tools/goofy/smushMemoriesTogether.d.ts +128 -0
- package/dist/tools/goofy/smushMemoriesTogether.d.ts.map +1 -0
- package/dist/tools/goofy/smushMemoriesTogether.js +536 -0
- package/dist/tools/goofy/smushMemoriesTogether.js.map +1 -0
- package/dist/tools/goofy/spatialSearch.d.ts +198 -0
- package/dist/tools/goofy/spatialSearch.d.ts.map +1 -0
- package/dist/tools/goofy/spatialSearch.js +551 -0
- package/dist/tools/goofy/spatialSearch.js.map +1 -0
- package/dist/tools/goofy/spawnResearchTeamMember.d.ts +104 -0
- package/dist/tools/goofy/spawnResearchTeamMember.d.ts.map +1 -0
- package/dist/tools/goofy/spawnResearchTeamMember.js +290 -0
- package/dist/tools/goofy/spawnResearchTeamMember.js.map +1 -0
- package/dist/tools/goofy/spawnResearchTeamMemberTool.d.ts +121 -0
- package/dist/tools/goofy/spawnResearchTeamMemberTool.d.ts.map +1 -0
- package/dist/tools/goofy/spawnResearchTeamMemberTool.js +215 -0
- package/dist/tools/goofy/spawnResearchTeamMemberTool.js.map +1 -0
- package/dist/tools/goofy/startWatchingTheFiles.d.ts +81 -0
- package/dist/tools/goofy/startWatchingTheFiles.d.ts.map +1 -0
- package/dist/tools/goofy/startWatchingTheFiles.js +161 -0
- package/dist/tools/goofy/startWatchingTheFiles.js.map +1 -0
- package/dist/tools/goofy/stopWatchingTheFiles.d.ts +50 -0
- package/dist/tools/goofy/stopWatchingTheFiles.d.ts.map +1 -0
- package/dist/tools/goofy/stopWatchingTheFiles.js +81 -0
- package/dist/tools/goofy/stopWatchingTheFiles.js.map +1 -0
- package/dist/tools/goofy/whatDidIMean.d.ts +113 -0
- package/dist/tools/goofy/whatDidIMean.d.ts.map +1 -0
- package/dist/tools/goofy/whatDidIMean.js +401 -0
- package/dist/tools/goofy/whatDidIMean.js.map +1 -0
- package/dist/tools/goofy/yeahNahDeleteThat.d.ts +109 -0
- package/dist/tools/goofy/yeahNahDeleteThat.d.ts.map +1 -0
- package/dist/tools/goofy/yeahNahDeleteThat.js +319 -0
- package/dist/tools/goofy/yeahNahDeleteThat.js.map +1 -0
- package/dist/tools/index.d.ts +9 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +9 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/teamMemberDeployer.d.ts +117 -0
- package/dist/tools/teamMemberDeployer.d.ts.map +1 -0
- package/dist/tools/teamMemberDeployer.js +613 -0
- package/dist/tools/teamMemberDeployer.js.map +1 -0
- package/dist/trace/index.d.ts +14 -0
- package/dist/trace/index.d.ts.map +1 -0
- package/dist/trace/index.js +16 -0
- package/dist/trace/index.js.map +1 -0
- package/dist/trace/tools/analyzeImpact.d.ts +90 -0
- package/dist/trace/tools/analyzeImpact.d.ts.map +1 -0
- package/dist/trace/tools/analyzeImpact.js +240 -0
- package/dist/trace/tools/analyzeImpact.js.map +1 -0
- package/dist/trace/tools/exploreDependencies.d.ts +81 -0
- package/dist/trace/tools/exploreDependencies.d.ts.map +1 -0
- package/dist/trace/tools/exploreDependencies.js +161 -0
- package/dist/trace/tools/exploreDependencies.js.map +1 -0
- package/dist/trace/tools/findSimilarBugs.d.ts +112 -0
- package/dist/trace/tools/findSimilarBugs.d.ts.map +1 -0
- package/dist/trace/tools/findSimilarBugs.js +216 -0
- package/dist/trace/tools/findSimilarBugs.js.map +1 -0
- package/dist/trace/tools/index.d.ts +22 -0
- package/dist/trace/tools/index.d.ts.map +1 -0
- package/dist/trace/tools/index.js +39 -0
- package/dist/trace/tools/index.js.map +1 -0
- package/dist/trace/tools/smartExplore.d.ts +126 -0
- package/dist/trace/tools/smartExplore.d.ts.map +1 -0
- package/dist/trace/tools/smartExplore.js +303 -0
- package/dist/trace/tools/smartExplore.js.map +1 -0
- package/dist/trace/tools/traceError.d.ts +101 -0
- package/dist/trace/tools/traceError.d.ts.map +1 -0
- package/dist/trace/tools/traceError.js +175 -0
- package/dist/trace/tools/traceError.js.map +1 -0
- package/dist/trace/traceExploreSystem.d.ts +271 -0
- package/dist/trace/traceExploreSystem.d.ts.map +1 -0
- package/dist/trace/traceExploreSystem.js +789 -0
- package/dist/trace/traceExploreSystem.js.map +1 -0
- package/dist/types/index.d.ts +421 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +118 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/circuitBreaker.d.ts +195 -0
- package/dist/utils/circuitBreaker.d.ts.map +1 -0
- package/dist/utils/circuitBreaker.js +374 -0
- package/dist/utils/circuitBreaker.js.map +1 -0
- package/dist/utils/cleanupHandler.d.ts +108 -0
- package/dist/utils/cleanupHandler.d.ts.map +1 -0
- package/dist/utils/cleanupHandler.js +203 -0
- package/dist/utils/cleanupHandler.js.map +1 -0
- package/dist/utils/compactXmlResponse.d.ts +60 -0
- package/dist/utils/compactXmlResponse.d.ts.map +1 -0
- package/dist/utils/compactXmlResponse.js +209 -0
- package/dist/utils/compactXmlResponse.js.map +1 -0
- package/dist/utils/cotBroadcast.d.ts +56 -0
- package/dist/utils/cotBroadcast.d.ts.map +1 -0
- package/dist/utils/cotBroadcast.js +157 -0
- package/dist/utils/cotBroadcast.js.map +1 -0
- package/dist/utils/debugLogger.d.ts +95 -0
- package/dist/utils/debugLogger.d.ts.map +1 -0
- package/dist/utils/debugLogger.js +610 -0
- package/dist/utils/debugLogger.js.map +1 -0
- package/dist/utils/fileProcessingQueue.d.ts +259 -0
- package/dist/utils/fileProcessingQueue.d.ts.map +1 -0
- package/dist/utils/fileProcessingQueue.js +714 -0
- package/dist/utils/fileProcessingQueue.js.map +1 -0
- package/dist/utils/humanReadableOutput.d.ts +124 -0
- package/dist/utils/humanReadableOutput.d.ts.map +1 -0
- package/dist/utils/humanReadableOutput.js +340 -0
- package/dist/utils/humanReadableOutput.js.map +1 -0
- package/dist/utils/index.d.ts +32 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +71 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/instanceManager.d.ts +530 -0
- package/dist/utils/instanceManager.d.ts.map +1 -0
- package/dist/utils/instanceManager.js +1784 -0
- package/dist/utils/instanceManager.js.map +1 -0
- package/dist/utils/logger.d.ts +6 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +49 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mapCleanup.d.ts +58 -0
- package/dist/utils/mapCleanup.d.ts.map +1 -0
- package/dist/utils/mapCleanup.js +150 -0
- package/dist/utils/mapCleanup.js.map +1 -0
- package/dist/utils/memoryManager.d.ts +349 -0
- package/dist/utils/memoryManager.d.ts.map +1 -0
- package/dist/utils/memoryManager.js +799 -0
- package/dist/utils/memoryManager.js.map +1 -0
- package/dist/utils/metrics.d.ts +160 -0
- package/dist/utils/metrics.d.ts.map +1 -0
- package/dist/utils/metrics.js +558 -0
- package/dist/utils/metrics.js.map +1 -0
- package/dist/utils/pathValidator.d.ts +96 -0
- package/dist/utils/pathValidator.d.ts.map +1 -0
- package/dist/utils/pathValidator.js +320 -0
- package/dist/utils/pathValidator.js.map +1 -0
- package/dist/utils/portAllocator.d.ts +296 -0
- package/dist/utils/portAllocator.d.ts.map +1 -0
- package/dist/utils/portAllocator.js +768 -0
- package/dist/utils/portAllocator.js.map +1 -0
- package/dist/utils/portUtils.d.ts +97 -0
- package/dist/utils/portUtils.d.ts.map +1 -0
- package/dist/utils/portUtils.js +285 -0
- package/dist/utils/portUtils.js.map +1 -0
- package/dist/utils/postgresAutoSetup.d.ts +55 -0
- package/dist/utils/postgresAutoSetup.d.ts.map +1 -0
- package/dist/utils/postgresAutoSetup.js +406 -0
- package/dist/utils/postgresAutoSetup.js.map +1 -0
- package/dist/utils/processHealthCheck.d.ts +61 -0
- package/dist/utils/processHealthCheck.d.ts.map +1 -0
- package/dist/utils/processHealthCheck.js +313 -0
- package/dist/utils/processHealthCheck.js.map +1 -0
- package/dist/utils/progressReporter.d.ts +151 -0
- package/dist/utils/progressReporter.d.ts.map +1 -0
- package/dist/utils/progressReporter.js +345 -0
- package/dist/utils/progressReporter.js.map +1 -0
- package/dist/utils/projectEnv.d.ts +73 -0
- package/dist/utils/projectEnv.d.ts.map +1 -0
- package/dist/utils/projectEnv.js +137 -0
- package/dist/utils/projectEnv.js.map +1 -0
- package/dist/utils/qoms.d.ts +122 -0
- package/dist/utils/qoms.d.ts.map +1 -0
- package/dist/utils/qoms.js +650 -0
- package/dist/utils/qoms.js.map +1 -0
- package/dist/utils/retryHelper.d.ts +122 -0
- package/dist/utils/retryHelper.d.ts.map +1 -0
- package/dist/utils/retryHelper.js +272 -0
- package/dist/utils/retryHelper.js.map +1 -0
- package/dist/utils/safeProcessTermination.d.ts +206 -0
- package/dist/utils/safeProcessTermination.d.ts.map +1 -0
- package/dist/utils/safeProcessTermination.js +552 -0
- package/dist/utils/safeProcessTermination.js.map +1 -0
- package/dist/utils/sessionInjector.d.ts +68 -0
- package/dist/utils/sessionInjector.d.ts.map +1 -0
- package/dist/utils/sessionInjector.js +189 -0
- package/dist/utils/sessionInjector.js.map +1 -0
- package/dist/utils/statsCache.d.ts +134 -0
- package/dist/utils/statsCache.d.ts.map +1 -0
- package/dist/utils/statsCache.js +285 -0
- package/dist/utils/statsCache.js.map +1 -0
- package/dist/utils/timeoutMiddleware.d.ts +81 -0
- package/dist/utils/timeoutMiddleware.d.ts.map +1 -0
- package/dist/utils/timeoutMiddleware.js +155 -0
- package/dist/utils/timeoutMiddleware.js.map +1 -0
- package/dist/utils/timerRegistry.d.ts +91 -0
- package/dist/utils/timerRegistry.d.ts.map +1 -0
- package/dist/utils/timerRegistry.js +187 -0
- package/dist/utils/timerRegistry.js.map +1 -0
- package/dist/utils/tokenCompressor.d.ts +332 -0
- package/dist/utils/tokenCompressor.d.ts.map +1 -0
- package/dist/utils/tokenCompressor.js +1306 -0
- package/dist/utils/tokenCompressor.js.map +1 -0
- package/dist/utils/tracing.d.ts +236 -0
- package/dist/utils/tracing.d.ts.map +1 -0
- package/dist/utils/tracing.js +378 -0
- package/dist/utils/tracing.js.map +1 -0
- package/dist/watcher/changeHandler.d.ts +123 -0
- package/dist/watcher/changeHandler.d.ts.map +1 -0
- package/dist/watcher/changeHandler.js +623 -0
- package/dist/watcher/changeHandler.js.map +1 -0
- package/dist/watcher/changeQueue.d.ts +133 -0
- package/dist/watcher/changeQueue.d.ts.map +1 -0
- package/dist/watcher/changeQueue.js +355 -0
- package/dist/watcher/changeQueue.js.map +1 -0
- package/dist/watcher/fileWatcher.d.ts +121 -0
- package/dist/watcher/fileWatcher.d.ts.map +1 -0
- package/dist/watcher/fileWatcher.js +531 -0
- package/dist/watcher/fileWatcher.js.map +1 -0
- package/dist/watcher/index.d.ts +94 -0
- package/dist/watcher/index.d.ts.map +1 -0
- package/dist/watcher/index.js +235 -0
- package/dist/watcher/index.js.map +1 -0
- package/dist/watcher/syncChecker.d.ts +93 -0
- package/dist/watcher/syncChecker.d.ts.map +1 -0
- package/dist/watcher/syncChecker.js +401 -0
- package/dist/watcher/syncChecker.js.map +1 -0
- package/dist/watcher/tsCompiler.d.ts +88 -0
- package/dist/watcher/tsCompiler.d.ts.map +1 -0
- package/dist/watcher/tsCompiler.js +212 -0
- package/dist/watcher/tsCompiler.js.map +1 -0
- package/embedding-sandbox/Dockerfile +77 -0
- package/embedding-sandbox/Dockerfile.frankenstein +91 -0
- package/embedding-sandbox/README.md +193 -0
- package/embedding-sandbox/__pycache__/frankenstein-embeddings.cpython-312.pyc +0 -0
- package/embedding-sandbox/__pycache__/frankenstein-embeddings.cpython-313.pyc +0 -0
- package/embedding-sandbox/__pycache__/qqms_v2.cpython-312.pyc +0 -0
- package/embedding-sandbox/__pycache__/qqms_v2.cpython-313.pyc +0 -0
- package/embedding-sandbox/add_js_docs.py +684 -0
- package/embedding-sandbox/build_docs_db.py +239 -0
- package/embedding-sandbox/client.cjs +376 -0
- package/embedding-sandbox/client.ts +913 -0
- package/embedding-sandbox/deploy-frankenstein.sh +240 -0
- package/embedding-sandbox/docker-compose.yml +60 -0
- package/embedding-sandbox/docker-manager.py +325 -0
- package/embedding-sandbox/docs/python_docs.db +0 -0
- package/embedding-sandbox/download-model.mjs +79 -0
- package/embedding-sandbox/download-model.py +28 -0
- package/embedding-sandbox/embedding-supervisor.sh +164 -0
- package/embedding-sandbox/frankenstein-embeddings.py +3940 -0
- package/embedding-sandbox/manage-services.sh +354 -0
- package/embedding-sandbox/overflow_queue.py +345 -0
- package/embedding-sandbox/package.json +17 -0
- package/embedding-sandbox/project_isolation.py +292 -0
- package/embedding-sandbox/qqms_v2.py +967 -0
- package/embedding-sandbox/ram-manager.sh +311 -0
- package/embedding-sandbox/requirements-frankenstein.txt +7 -0
- package/embedding-sandbox/run_js_docs.py +59 -0
- package/embedding-sandbox/seed_docs.py +885 -0
- package/embedding-sandbox/server-batch.mjs +228 -0
- package/embedding-sandbox/server.mjs +389 -0
- package/embedding-sandbox/specmem/sockets/claude-input-state.json +1 -0
- package/embedding-sandbox/specmem/sockets/embedding-death-reason.txt +3 -0
- package/embedding-sandbox/specmem/sockets/seen-sessions.json +1 -0
- package/embedding-sandbox/specmem/sockets/session-start.lock +1 -0
- package/embedding-sandbox/specmem/sockets/session-stops.log +7 -0
- package/embedding-sandbox/start-frankenstein-throttled.sh +98 -0
- package/embedding-sandbox/start-on-demand.sh +116 -0
- package/embedding-sandbox/start-sandbox.sh +237 -0
- package/embedding-sandbox/start-supervised.sh +11 -0
- package/embedding-sandbox/stop-sandbox.sh +51 -0
- package/embedding-sandbox/test-socket.mjs +61 -0
- package/embedding-sandbox/warm-start.sh +353 -0
- package/embedding-sandbox/warm_start_feeder.py +660 -0
- package/legal/README.md +31 -0
- package/legal/anthropic-privacy-center-screenshot-2026-01-30.png +0 -0
- package/legal/anthropic-tos-screenshot-2026-01-30.png +0 -0
- package/lib/codebase-bridge.cjs +308 -0
- package/package.json +136 -0
- package/plugins/specmem-agents/agents/bug-hunter.md +79 -0
- package/plugins/specmem-agents/agents/memory-explorer.md +57 -0
- package/plugins/specmem-agents/agents/team-coordinator.md +82 -0
- package/scripts/auto-updater.cjs +399 -0
- package/scripts/backfill-code-definition-embeddings.ts +440 -0
- package/scripts/backfill-code-embeddings.ts +206 -0
- package/scripts/capture-tos-screenshots.cjs +94 -0
- package/scripts/check-global-install.cjs +67 -0
- package/scripts/cleanup-embedding-servers.sh +25 -0
- package/scripts/dashboard-standalone.sh +369 -0
- package/scripts/deploy-hooks.cjs +1451 -0
- package/scripts/deploy.sh +106 -0
- package/scripts/docker-project-down.sh +83 -0
- package/scripts/docker-project-list.sh +40 -0
- package/scripts/docker-project-up.sh +79 -0
- package/scripts/fast-backfill-embeddings.ts +173 -0
- package/scripts/fast-batch-embedder.cjs +334 -0
- package/scripts/first-run-model-setup.cjs +849 -0
- package/scripts/global-postinstall.cjs +1957 -0
- package/scripts/index-codebase.js +72 -0
- package/scripts/migrate-fix-embeddings.py +110 -0
- package/scripts/migrate-to-project-schemas.ts +525 -0
- package/scripts/optimize-embedding-model.py +324 -0
- package/scripts/optimize-instructions.cjs +530 -0
- package/scripts/pack-docker-images.sh +68 -0
- package/scripts/pack-for-testing.sh +130 -0
- package/scripts/postinstall.cjs +54 -0
- package/scripts/project-env.sh +51 -0
- package/scripts/reset-db.sh +30 -0
- package/scripts/run-indexer.ts +69 -0
- package/scripts/run-migrations.js +47 -0
- package/scripts/setup-db.sh +34 -0
- package/scripts/setup-minimal-schema.sql +143 -0
- package/scripts/skills/code-review.md +44 -0
- package/scripts/skills/debugging.md +56 -0
- package/scripts/skills/specmem-deployteam.md +239 -0
- package/scripts/skills/teammemberskills/EFFICIENT_GREP.md +171 -0
- package/scripts/skills/teammemberskills/task-planning.md +67 -0
- package/scripts/specmem/sockets/session-start.lock +1 -0
- package/scripts/specmem/sockets/session-stops.log +1 -0
- package/scripts/specmem-health.sh +382 -0
- package/scripts/specmem-init.cjs +6935 -0
- package/scripts/strip-debug-logs.cjs +43 -0
- package/scripts/test-mcp-standalone.sh +365 -0
- package/scripts/test-optimized-models.py +166 -0
- package/scripts/verify-embedding-fix.sh +148 -0
- package/skills/code-review.md +44 -0
- package/skills/debugging.md +56 -0
- package/skills/specmem-deployteam.md +239 -0
- package/skills/teammemberskills/EFFICIENT_GREP.md +171 -0
- package/skills/teammemberskills/task-planning.md +67 -0
- package/specmem-health.cjs +522 -0
- package/specmem.env +216 -0
|
@@ -0,0 +1,1957 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* SPECMEM GLOBAL POSTINSTALL - FULL AUTO-INSTALL
|
|
4
|
+
* ===============================================
|
|
5
|
+
*
|
|
6
|
+
* Runs after `npm install -g specmem-hardwicksoftware`
|
|
7
|
+
* Auto-installs and configures EVERYTHING:
|
|
8
|
+
* 1. PostgreSQL (if missing)
|
|
9
|
+
* 2. pgvector extension
|
|
10
|
+
* 3. SpecMem database and user
|
|
11
|
+
* 4. hooks
|
|
12
|
+
* 5. Docker (embedding service)
|
|
13
|
+
* 6. All directories and configs
|
|
14
|
+
*
|
|
15
|
+
* @author hardwicksoftwareservices
|
|
16
|
+
* @website https://justcalljon.pro
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
const fs = require('fs');
|
|
20
|
+
const path = require('path');
|
|
21
|
+
const os = require('os');
|
|
22
|
+
const { execSync, spawnSync } = require('child_process');
|
|
23
|
+
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// GLOBAL INSTALL CHECK - Must be installed globally!
|
|
26
|
+
// ============================================================================
|
|
27
|
+
const isGlobalInstall = process.env.npm_config_global === 'true' ||
|
|
28
|
+
__dirname.includes('/lib/node_modules/') ||
|
|
29
|
+
__dirname.includes('\\node_modules\\npm\\') ||
|
|
30
|
+
process.env.npm_lifecycle_event === 'postinstall' &&
|
|
31
|
+
!__dirname.includes(process.cwd());
|
|
32
|
+
|
|
33
|
+
// ============================================================================
|
|
34
|
+
// UNINSTALL OLD VERSIONS FIRST
|
|
35
|
+
// ============================================================================
|
|
36
|
+
try {
|
|
37
|
+
const oldVersionCheck = require('child_process').execSync('npm list -g specmem-hardwicksoftware --depth=0 2>/dev/null || true', { encoding: 'utf8' });
|
|
38
|
+
if (oldVersionCheck.includes('specmem-hardwicksoftware@') && !oldVersionCheck.includes(require('../package.json').version)) {
|
|
39
|
+
console.log('\x1b[33m⚠ Removing old version before installing new one...\x1b[0m');
|
|
40
|
+
require('child_process').execSync('npm uninstall -g specmem-hardwicksoftware 2>/dev/null || true', { stdio: 'pipe' });
|
|
41
|
+
}
|
|
42
|
+
} catch (e) { /* ignore */ }
|
|
43
|
+
|
|
44
|
+
// ============================================================================
|
|
45
|
+
// PLATFORM CHECK - Linux only for now
|
|
46
|
+
// ============================================================================
|
|
47
|
+
const currentPlatform = require('os').platform();
|
|
48
|
+
if (currentPlatform === 'win32') {
|
|
49
|
+
console.log('\n\x1b[31m╔════════════════════════════════════════════════════════════╗\x1b[0m');
|
|
50
|
+
console.log('\x1b[31m║\x1b[0m \x1b[1m\x1b[31m⚠ SPECMEM IS LINUX-ONLY (for now)\x1b[0m \x1b[31m║\x1b[0m');
|
|
51
|
+
console.log('\x1b[31m╠════════════════════════════════════════════════════════════╣\x1b[0m');
|
|
52
|
+
console.log('\x1b[31m║\x1b[0m \x1b[31m║\x1b[0m');
|
|
53
|
+
console.log('\x1b[31m║\x1b[0m Windows support coming soon! \x1b[31m║\x1b[0m');
|
|
54
|
+
console.log('\x1b[31m║\x1b[0m \x1b[31m║\x1b[0m');
|
|
55
|
+
console.log('\x1b[31m║\x1b[0m Options: \x1b[31m║\x1b[0m');
|
|
56
|
+
console.log('\x1b[31m║\x1b[0m • Use WSL2 (Windows Subsystem for Linux) \x1b[31m║\x1b[0m');
|
|
57
|
+
console.log('\x1b[31m║\x1b[0m • Use a Linux VM or Docker container \x1b[31m║\x1b[0m');
|
|
58
|
+
console.log('\x1b[31m║\x1b[0m • Use a Linux VPS \x1b[31m║\x1b[0m');
|
|
59
|
+
console.log('\x1b[31m║\x1b[0m \x1b[31m║\x1b[0m');
|
|
60
|
+
console.log('\x1b[31m╚════════════════════════════════════════════════════════════╝\x1b[0m\n');
|
|
61
|
+
process.exit(0);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (currentPlatform === 'darwin') {
|
|
65
|
+
console.log('\n\x1b[33m╔════════════════════════════════════════════════════════════╗\x1b[0m');
|
|
66
|
+
console.log('\x1b[33m║\x1b[0m \x1b[1m\x1b[33m⚠ MACOS SUPPORT IS EXPERIMENTAL\x1b[0m \x1b[33m║\x1b[0m');
|
|
67
|
+
console.log('\x1b[33m╠════════════════════════════════════════════════════════════╣\x1b[0m');
|
|
68
|
+
console.log('\x1b[33m║\x1b[0m \x1b[33m║\x1b[0m');
|
|
69
|
+
console.log('\x1b[33m║\x1b[0m SpecMem is primarily developed for Linux. \x1b[33m║\x1b[0m');
|
|
70
|
+
console.log('\x1b[33m║\x1b[0m Some features may not work correctly on macOS. \x1b[33m║\x1b[0m');
|
|
71
|
+
console.log('\x1b[33m║\x1b[0m \x1b[33m║\x1b[0m');
|
|
72
|
+
console.log('\x1b[33m║\x1b[0m Proceeding with installation... \x1b[33m║\x1b[0m');
|
|
73
|
+
console.log('\x1b[33m║\x1b[0m \x1b[33m║\x1b[0m');
|
|
74
|
+
console.log('\x1b[33m╚════════════════════════════════════════════════════════════╝\x1b[0m\n');
|
|
75
|
+
// Continue with install but warn
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (!isGlobalInstall) {
|
|
79
|
+
console.log('\n\x1b[33m╔════════════════════════════════════════════════════════════╗\x1b[0m');
|
|
80
|
+
console.log('\x1b[33m║\x1b[0m \x1b[1m\x1b[31m⚠ SPECMEM MUST BE INSTALLED GLOBALLY\x1b[0m \x1b[33m║\x1b[0m');
|
|
81
|
+
console.log('\x1b[33m╠════════════════════════════════════════════════════════════╣\x1b[0m');
|
|
82
|
+
console.log('\x1b[33m║\x1b[0m \x1b[33m║\x1b[0m');
|
|
83
|
+
console.log('\x1b[33m║\x1b[0m You ran: npm install specmem-hardwicksoftware \x1b[33m║\x1b[0m');
|
|
84
|
+
console.log('\x1b[33m║\x1b[0m \x1b[33m║\x1b[0m');
|
|
85
|
+
console.log('\x1b[33m║\x1b[0m \x1b[1m\x1b[32mCorrect command:\x1b[0m \x1b[33m║\x1b[0m');
|
|
86
|
+
console.log('\x1b[33m║\x1b[0m \x1b[1m\x1b[36m npm install -g specmem-hardwicksoftware\x1b[0m \x1b[33m║\x1b[0m');
|
|
87
|
+
console.log('\x1b[33m║\x1b[0m \x1b[33m║\x1b[0m');
|
|
88
|
+
console.log('\x1b[33m║\x1b[0m SpecMem is a CLI tool that integrates with Claude Code. \x1b[33m║\x1b[0m');
|
|
89
|
+
console.log('\x1b[33m║\x1b[0m It must be installed globally to work properly. \x1b[33m║\x1b[0m');
|
|
90
|
+
console.log('\x1b[33m║\x1b[0m \x1b[33m║\x1b[0m');
|
|
91
|
+
console.log('\x1b[33m╚════════════════════════════════════════════════════════════╝\x1b[0m\n');
|
|
92
|
+
process.exit(0); // Exit cleanly so npm doesn't show error
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Colors for terminal output
|
|
96
|
+
const c = {
|
|
97
|
+
reset: '\x1b[0m',
|
|
98
|
+
bright: '\x1b[1m',
|
|
99
|
+
dim: '\x1b[2m',
|
|
100
|
+
green: '\x1b[32m',
|
|
101
|
+
yellow: '\x1b[33m',
|
|
102
|
+
blue: '\x1b[34m',
|
|
103
|
+
red: '\x1b[31m',
|
|
104
|
+
cyan: '\x1b[36m',
|
|
105
|
+
magenta: '\x1b[35m'
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
const log = {
|
|
109
|
+
info: (msg) => console.log(`${c.blue}ℹ${c.reset} ${msg}`),
|
|
110
|
+
success: (msg) => console.log(`${c.green}✓${c.reset} ${msg}`),
|
|
111
|
+
warn: (msg) => console.log(`${c.yellow}⚠${c.reset} ${msg}`),
|
|
112
|
+
error: (msg) => console.log(`${c.red}✗${c.reset} ${msg}`),
|
|
113
|
+
header: (msg) => console.log(`\n${c.bright}${c.cyan}═══ ${msg} ═══${c.reset}\n`),
|
|
114
|
+
step: (num, msg) => console.log(`${c.cyan}[${num}]${c.reset} ${msg}`)
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
// Paths
|
|
118
|
+
const HOME = os.homedir();
|
|
119
|
+
const CLAUDE_DIR = path.join(HOME, '.claude');
|
|
120
|
+
const CLAUDE_HOOKS_DIR = path.join(CLAUDE_DIR, 'hooks');
|
|
121
|
+
const CLAUDE_SETTINGS = path.join(CLAUDE_DIR, 'settings.json');
|
|
122
|
+
const SPECMEM_GLOBAL_DIR = path.join(HOME, '.specmem');
|
|
123
|
+
const SPECMEM_PKG_DIR = path.dirname(__dirname);
|
|
124
|
+
|
|
125
|
+
// Database config
|
|
126
|
+
const DB_CONFIG = {
|
|
127
|
+
name: 'specmem_westayunprofessional',
|
|
128
|
+
user: 'specmem_westayunprofessional',
|
|
129
|
+
password: 'specmem_westayunprofessional',
|
|
130
|
+
host: 'localhost',
|
|
131
|
+
port: 5432
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
// Detect OS
|
|
135
|
+
const PLATFORM = os.platform();
|
|
136
|
+
const IS_MAC = PLATFORM === 'darwin';
|
|
137
|
+
const IS_LINUX = PLATFORM === 'linux';
|
|
138
|
+
const IS_WINDOWS = PLATFORM === 'win32';
|
|
139
|
+
|
|
140
|
+
// Detect if running inside Docker container
|
|
141
|
+
const IS_DOCKER = fs.existsSync('/.dockerenv') ||
|
|
142
|
+
(fs.existsSync('/proc/1/cgroup') &&
|
|
143
|
+
fs.readFileSync('/proc/1/cgroup', 'utf8').includes('docker'));
|
|
144
|
+
|
|
145
|
+
// Skip embeddings flag (for low-resource or containerized environments)
|
|
146
|
+
const SKIP_EMBEDDINGS = process.env.SPECMEM_SKIP_EMBEDDINGS === 'true' ||
|
|
147
|
+
process.env.SPECMEM_LITE === 'true';
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Run a command and return success/output
|
|
151
|
+
*/
|
|
152
|
+
function run(cmd, options = {}) {
|
|
153
|
+
try {
|
|
154
|
+
const result = execSync(cmd, {
|
|
155
|
+
encoding: 'utf8',
|
|
156
|
+
stdio: options.silent ? 'pipe' : 'inherit',
|
|
157
|
+
timeout: options.timeout || 120000,
|
|
158
|
+
...options
|
|
159
|
+
});
|
|
160
|
+
return { success: true, output: result };
|
|
161
|
+
} catch (e) {
|
|
162
|
+
return { success: false, output: e.message, error: e };
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Check if a command exists
|
|
168
|
+
*/
|
|
169
|
+
function commandExists(cmd) {
|
|
170
|
+
try {
|
|
171
|
+
execSync(`which ${cmd}`, { stdio: 'pipe' });
|
|
172
|
+
return true;
|
|
173
|
+
} catch {
|
|
174
|
+
return false;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Ensure a directory exists
|
|
180
|
+
*/
|
|
181
|
+
function ensureDir(dir) {
|
|
182
|
+
if (!fs.existsSync(dir)) {
|
|
183
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
184
|
+
log.success(`Created: ${dir}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// ============================================================================
|
|
189
|
+
// CLAUDE CODE INSTALLATION
|
|
190
|
+
// ============================================================================
|
|
191
|
+
|
|
192
|
+
// ============================================================================
|
|
193
|
+
// CORE SYSTEM DEPENDENCIES - Install EVERYTHING if missing
|
|
194
|
+
// ============================================================================
|
|
195
|
+
|
|
196
|
+
/**
|
|
197
|
+
* Install ALL core system dependencies before anything else
|
|
198
|
+
*/
|
|
199
|
+
function installCoreDeps() {
|
|
200
|
+
log.header('Installing Core System Dependencies');
|
|
201
|
+
|
|
202
|
+
const packages = [];
|
|
203
|
+
|
|
204
|
+
// Check what's missing
|
|
205
|
+
if (!commandExists('python3')) packages.push('python3');
|
|
206
|
+
if (!commandExists('pip3') && !commandExists('pip')) packages.push('python3-pip');
|
|
207
|
+
if (!commandExists('screen')) packages.push('screen');
|
|
208
|
+
if (!commandExists('curl')) packages.push('curl');
|
|
209
|
+
if (!commandExists('git')) packages.push('git');
|
|
210
|
+
if (!commandExists('sudo')) packages.push('sudo');
|
|
211
|
+
|
|
212
|
+
if (packages.length === 0) {
|
|
213
|
+
log.success('All core dependencies already installed');
|
|
214
|
+
return true;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
log.info(`Missing packages: ${packages.join(', ')}`);
|
|
218
|
+
log.info('Installing via package manager...');
|
|
219
|
+
|
|
220
|
+
if (IS_LINUX) {
|
|
221
|
+
if (commandExists('apt-get')) {
|
|
222
|
+
// Debian/Ubuntu/Mint
|
|
223
|
+
const result = run(`apt-get update -qq && apt-get install -y ${packages.join(' ')} python3-venv build-essential`, { timeout: 300000 });
|
|
224
|
+
if (!result.success) {
|
|
225
|
+
// Try with sudo
|
|
226
|
+
run(`sudo apt-get update -qq && sudo apt-get install -y ${packages.join(' ')} python3-venv build-essential`, { timeout: 300000 });
|
|
227
|
+
}
|
|
228
|
+
} else if (commandExists('dnf')) {
|
|
229
|
+
run(`sudo dnf install -y ${packages.join(' ').replace('python3-pip', 'python3-pip python3-devel')} gcc make`, { timeout: 300000 });
|
|
230
|
+
} else if (commandExists('yum')) {
|
|
231
|
+
run(`sudo yum install -y ${packages.join(' ').replace('python3-pip', 'python3-pip python3-devel')} gcc make`, { timeout: 300000 });
|
|
232
|
+
} else if (commandExists('pacman')) {
|
|
233
|
+
run(`sudo pacman -Sy --noconfirm ${packages.join(' ').replace('python3-pip', 'python-pip')}`, { timeout: 300000 });
|
|
234
|
+
}
|
|
235
|
+
} else if (IS_MAC) {
|
|
236
|
+
if (commandExists('brew')) {
|
|
237
|
+
run(`brew install ${packages.join(' ').replace('python3-pip', 'python3')}`, { timeout: 300000 });
|
|
238
|
+
} else {
|
|
239
|
+
log.warn('Homebrew not found - install from https://brew.sh');
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Verify critical ones
|
|
244
|
+
const missing = [];
|
|
245
|
+
if (!commandExists('python3')) missing.push('python3');
|
|
246
|
+
if (!commandExists('pip3') && !commandExists('pip')) missing.push('pip');
|
|
247
|
+
if (!commandExists('screen')) missing.push('screen');
|
|
248
|
+
|
|
249
|
+
if (missing.length > 0) {
|
|
250
|
+
log.warn(`Still missing: ${missing.join(', ')}`);
|
|
251
|
+
log.info('Some features may not work without these dependencies');
|
|
252
|
+
} else {
|
|
253
|
+
log.success('All core dependencies installed');
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* Check if Claude Code is installed, install if missing
|
|
261
|
+
*/
|
|
262
|
+
function ensureClaudeCode() {
|
|
263
|
+
log.header('Checking Claude Code');
|
|
264
|
+
|
|
265
|
+
// Check if claude command exists
|
|
266
|
+
if (commandExists('claude')) {
|
|
267
|
+
const version = run('claude --version', { silent: true });
|
|
268
|
+
log.success(`Claude Code found: ${version.output?.trim() || 'installed'}`);
|
|
269
|
+
return true;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
log.warn('Claude Code not found - installing...');
|
|
273
|
+
log.info('Installing @anthropic-ai/claude-code globally...');
|
|
274
|
+
|
|
275
|
+
const result = run('npm install -g @anthropic-ai/claude-code', { timeout: 300000 });
|
|
276
|
+
|
|
277
|
+
if (result.success) {
|
|
278
|
+
log.success('Claude Code installed successfully');
|
|
279
|
+
log.info('You will need to run "claude" and authenticate with Anthropic');
|
|
280
|
+
return true;
|
|
281
|
+
} else {
|
|
282
|
+
log.error('Failed to install Claude Code');
|
|
283
|
+
log.info('Install manually: npm install -g @anthropic-ai/claude-code');
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
/**
|
|
289
|
+
* Check if screen is installed, install if missing (needed for team members)
|
|
290
|
+
*/
|
|
291
|
+
function ensureScreen() {
|
|
292
|
+
log.header('Checking screen');
|
|
293
|
+
|
|
294
|
+
if (commandExists('screen')) {
|
|
295
|
+
log.success('screen found');
|
|
296
|
+
return true;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
log.warn('screen not found - installing...');
|
|
300
|
+
|
|
301
|
+
let result;
|
|
302
|
+
if (IS_MAC) {
|
|
303
|
+
result = run('brew install screen', { timeout: 120000 });
|
|
304
|
+
} else if (IS_LINUX) {
|
|
305
|
+
// Try apt first, then yum/dnf
|
|
306
|
+
result = run('apt-get update -qq && apt-get install -y screen', { timeout: 120000 });
|
|
307
|
+
if (!result.success) {
|
|
308
|
+
result = run('yum install -y screen || dnf install -y screen', { timeout: 120000 });
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
if (result?.success) {
|
|
313
|
+
log.success('screen installed successfully');
|
|
314
|
+
return true;
|
|
315
|
+
} else {
|
|
316
|
+
log.warn('Could not auto-install screen');
|
|
317
|
+
log.info('Install manually: apt install screen (Debian/Ubuntu) or brew install screen (Mac)');
|
|
318
|
+
return false;
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
// ============================================================================
|
|
323
|
+
// POSTGRESQL INSTALLATION
|
|
324
|
+
// ============================================================================
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Check if PostgreSQL is installed and running
|
|
328
|
+
*/
|
|
329
|
+
function checkPostgres() {
|
|
330
|
+
log.header('Checking PostgreSQL');
|
|
331
|
+
|
|
332
|
+
// Check if psql exists
|
|
333
|
+
if (!commandExists('psql')) {
|
|
334
|
+
log.warn('PostgreSQL not found - will install');
|
|
335
|
+
return false;
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Check if server is running
|
|
339
|
+
const result = run('pg_isready', { silent: true });
|
|
340
|
+
if (result.success) {
|
|
341
|
+
log.success('PostgreSQL is installed and running');
|
|
342
|
+
return true;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
log.warn('PostgreSQL installed but not running');
|
|
346
|
+
return 'installed_not_running';
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Install PostgreSQL based on OS
|
|
351
|
+
*/
|
|
352
|
+
function installPostgres() {
|
|
353
|
+
log.header('Installing PostgreSQL');
|
|
354
|
+
|
|
355
|
+
const PG_TIMEOUT = 180000; // 3 minute timeout for PG install
|
|
356
|
+
|
|
357
|
+
if (IS_MAC) {
|
|
358
|
+
log.step(1, 'Installing via Homebrew...');
|
|
359
|
+
|
|
360
|
+
// Check if Homebrew exists
|
|
361
|
+
if (!commandExists('brew')) {
|
|
362
|
+
log.info('Installing Homebrew first...');
|
|
363
|
+
run('/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"', { timeout: 300000 });
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
run('brew install postgresql@16', { timeout: PG_TIMEOUT });
|
|
367
|
+
run('brew services start postgresql@16', { timeout: 30000 });
|
|
368
|
+
|
|
369
|
+
// Add to PATH
|
|
370
|
+
try {
|
|
371
|
+
const brewPrefix = execSync('brew --prefix', { encoding: 'utf8', timeout: 10000 }).trim();
|
|
372
|
+
const pgPath = `${brewPrefix}/opt/postgresql@16/bin`;
|
|
373
|
+
log.info(`Add to PATH: export PATH="${pgPath}:$PATH"`);
|
|
374
|
+
} catch (e) {}
|
|
375
|
+
|
|
376
|
+
} else if (IS_LINUX) {
|
|
377
|
+
log.step(1, 'Detecting Linux distribution...');
|
|
378
|
+
|
|
379
|
+
// Check for apt (Debian/Ubuntu)
|
|
380
|
+
if (commandExists('apt-get')) {
|
|
381
|
+
log.step(2, 'Installing via apt (timeout: 3 min)...');
|
|
382
|
+
run('sudo apt-get update', { timeout: 60000 });
|
|
383
|
+
const result = run('sudo apt-get install -y postgresql postgresql-contrib', { timeout: PG_TIMEOUT });
|
|
384
|
+
if (!result.success) {
|
|
385
|
+
log.warn('PostgreSQL install timed out or failed');
|
|
386
|
+
log.info('Try manually: sudo apt-get install -y postgresql postgresql-contrib');
|
|
387
|
+
return false;
|
|
388
|
+
}
|
|
389
|
+
run('sudo systemctl start postgresql', { timeout: 30000 });
|
|
390
|
+
run('sudo systemctl enable postgresql', { timeout: 30000 });
|
|
391
|
+
}
|
|
392
|
+
// Check for yum/dnf (RHEL/CentOS/Fedora)
|
|
393
|
+
else if (commandExists('dnf')) {
|
|
394
|
+
log.step(2, 'Installing via dnf (timeout: 3 min)...');
|
|
395
|
+
const result = run('sudo dnf install -y postgresql-server postgresql-contrib', { timeout: PG_TIMEOUT });
|
|
396
|
+
if (!result.success) {
|
|
397
|
+
log.warn('PostgreSQL install timed out');
|
|
398
|
+
return false;
|
|
399
|
+
}
|
|
400
|
+
run('sudo postgresql-setup --initdb', { timeout: 60000 });
|
|
401
|
+
run('sudo systemctl start postgresql', { timeout: 30000 });
|
|
402
|
+
run('sudo systemctl enable postgresql', { timeout: 30000 });
|
|
403
|
+
}
|
|
404
|
+
else if (commandExists('yum')) {
|
|
405
|
+
log.step(2, 'Installing via yum (timeout: 3 min)...');
|
|
406
|
+
const result = run('sudo yum install -y postgresql-server postgresql-contrib', { timeout: PG_TIMEOUT });
|
|
407
|
+
if (!result.success) {
|
|
408
|
+
log.warn('PostgreSQL install timed out');
|
|
409
|
+
return false;
|
|
410
|
+
}
|
|
411
|
+
run('sudo postgresql-setup initdb', { timeout: 60000 });
|
|
412
|
+
run('sudo systemctl start postgresql', { timeout: 30000 });
|
|
413
|
+
run('sudo systemctl enable postgresql', { timeout: 30000 });
|
|
414
|
+
}
|
|
415
|
+
// Check for pacman (Arch)
|
|
416
|
+
else if (commandExists('pacman')) {
|
|
417
|
+
log.step(2, 'Installing via pacman (timeout: 3 min)...');
|
|
418
|
+
const result = run('sudo pacman -S --noconfirm postgresql', { timeout: PG_TIMEOUT });
|
|
419
|
+
if (!result.success) {
|
|
420
|
+
log.warn('PostgreSQL install timed out');
|
|
421
|
+
return false;
|
|
422
|
+
}
|
|
423
|
+
run('sudo -u postgres initdb -D /var/lib/postgres/data', { timeout: 60000 });
|
|
424
|
+
run('sudo systemctl start postgresql', { timeout: 30000 });
|
|
425
|
+
run('sudo systemctl enable postgresql', { timeout: 30000 });
|
|
426
|
+
}
|
|
427
|
+
else {
|
|
428
|
+
log.error('Could not detect package manager. Please install PostgreSQL manually.');
|
|
429
|
+
return false;
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
} else if (IS_WINDOWS) {
|
|
433
|
+
log.error('Windows detected - please install PostgreSQL manually from:');
|
|
434
|
+
log.info('https://www.postgresql.org/download/windows/');
|
|
435
|
+
log.info('Or use: choco install postgresql');
|
|
436
|
+
return false;
|
|
437
|
+
}
|
|
438
|
+
|
|
439
|
+
// Verify installation with timeout
|
|
440
|
+
log.info('Verifying PostgreSQL installation...');
|
|
441
|
+
const check = run('pg_isready', { silent: true, timeout: 10000 });
|
|
442
|
+
if (check.success) {
|
|
443
|
+
log.success('PostgreSQL installed and running!');
|
|
444
|
+
return true;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// Try starting the service
|
|
448
|
+
log.info('Trying to start PostgreSQL service...');
|
|
449
|
+
if (IS_MAC) {
|
|
450
|
+
run('brew services start postgresql@16', { timeout: 30000 });
|
|
451
|
+
} else if (IS_LINUX) {
|
|
452
|
+
run('sudo systemctl start postgresql', { timeout: 30000 });
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
// Wait up to 30 seconds for PG to be ready
|
|
456
|
+
for (let i = 0; i < 6; i++) {
|
|
457
|
+
if (run('pg_isready', { silent: true, timeout: 5000 }).success) {
|
|
458
|
+
log.success('PostgreSQL is ready');
|
|
459
|
+
return true;
|
|
460
|
+
}
|
|
461
|
+
log.info('Waiting for PostgreSQL to start...');
|
|
462
|
+
run('sleep 5', { silent: true });
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
log.warn('PostgreSQL may not be fully started - continuing anyway');
|
|
466
|
+
return true; // Continue setup, might work
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
// ============================================================================
|
|
470
|
+
// PGVECTOR INSTALLATION
|
|
471
|
+
// ============================================================================
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* Check if pgvector extension is available
|
|
475
|
+
*/
|
|
476
|
+
function checkPgvector() {
|
|
477
|
+
log.header('Checking pgvector Extension');
|
|
478
|
+
|
|
479
|
+
const result = run(
|
|
480
|
+
`sudo -u postgres psql -c "SELECT 1 FROM pg_available_extensions WHERE name = 'vector';" 2>/dev/null`,
|
|
481
|
+
{ silent: true, timeout: 15000 }
|
|
482
|
+
);
|
|
483
|
+
|
|
484
|
+
if (result.success && result.output && result.output.includes('1')) {
|
|
485
|
+
log.success('pgvector extension is available');
|
|
486
|
+
return true;
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
log.warn('pgvector not found - will install');
|
|
490
|
+
return false;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
/**
|
|
494
|
+
* Install pgvector extension
|
|
495
|
+
*/
|
|
496
|
+
function installPgvector() {
|
|
497
|
+
log.header('Installing pgvector Extension');
|
|
498
|
+
|
|
499
|
+
const PGVECTOR_TIMEOUT = 120000; // 2 minute timeout
|
|
500
|
+
|
|
501
|
+
if (IS_MAC) {
|
|
502
|
+
log.step(1, 'Installing pgvector via Homebrew...');
|
|
503
|
+
run('brew install pgvector', { timeout: PGVECTOR_TIMEOUT });
|
|
504
|
+
|
|
505
|
+
} else if (IS_LINUX) {
|
|
506
|
+
// Try apt first (Ubuntu/Debian have pgvector in repos now)
|
|
507
|
+
if (commandExists('apt-get')) {
|
|
508
|
+
log.step(1, 'Trying apt install (timeout: 2 min)...');
|
|
509
|
+
const aptResult = run('sudo apt-get install -y postgresql-16-pgvector 2>/dev/null || sudo apt-get install -y postgresql-pgvector 2>/dev/null', { silent: true, timeout: PGVECTOR_TIMEOUT });
|
|
510
|
+
|
|
511
|
+
if (!aptResult.success) {
|
|
512
|
+
log.step(2, 'Building pgvector from source (timeout: 3 min)...');
|
|
513
|
+
buildPgvectorFromSource();
|
|
514
|
+
}
|
|
515
|
+
} else {
|
|
516
|
+
log.step(1, 'Building pgvector from source (timeout: 3 min)...');
|
|
517
|
+
buildPgvectorFromSource();
|
|
518
|
+
}
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
// Verify with timeout
|
|
522
|
+
log.info('Verifying pgvector installation...');
|
|
523
|
+
const check = run(
|
|
524
|
+
`sudo -u postgres psql -c "SELECT 1 FROM pg_available_extensions WHERE name = 'vector';" 2>/dev/null`,
|
|
525
|
+
{ silent: true, timeout: 15000 }
|
|
526
|
+
);
|
|
527
|
+
|
|
528
|
+
if (check.success && check.output && check.output.includes('1')) {
|
|
529
|
+
log.success('pgvector installed successfully!');
|
|
530
|
+
return true;
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
log.warn('pgvector install may have timed out - continuing anyway');
|
|
534
|
+
log.info('SpecMem can work without pgvector (reduced functionality)');
|
|
535
|
+
return false;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Build pgvector from source
|
|
540
|
+
*/
|
|
541
|
+
function buildPgvectorFromSource() {
|
|
542
|
+
log.info('Building pgvector from source...');
|
|
543
|
+
|
|
544
|
+
const BUILD_TIMEOUT = 180000; // 3 minute timeout for build
|
|
545
|
+
|
|
546
|
+
// Install build dependencies
|
|
547
|
+
if (commandExists('apt-get')) {
|
|
548
|
+
run('sudo apt-get install -y build-essential git postgresql-server-dev-all', { timeout: 120000 });
|
|
549
|
+
} else if (commandExists('dnf')) {
|
|
550
|
+
run('sudo dnf install -y gcc make git postgresql-devel', { timeout: 120000 });
|
|
551
|
+
} else if (commandExists('yum')) {
|
|
552
|
+
run('sudo yum install -y gcc make git postgresql-devel', { timeout: 120000 });
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
// Clone and build with timeout
|
|
556
|
+
const tmpDir = '/tmp/pgvector-build';
|
|
557
|
+
run(`rm -rf ${tmpDir}`, { timeout: 10000 });
|
|
558
|
+
|
|
559
|
+
const cloneResult = run(`git clone --branch v0.7.4 https://github.com/pgvector/pgvector.git ${tmpDir}`, { timeout: 60000 });
|
|
560
|
+
if (!cloneResult.success) {
|
|
561
|
+
log.warn('Failed to clone pgvector repo - skipping');
|
|
562
|
+
return;
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
const buildResult = run(`cd ${tmpDir} && make && sudo make install`, { timeout: BUILD_TIMEOUT });
|
|
566
|
+
if (!buildResult.success) {
|
|
567
|
+
log.warn('pgvector build timed out or failed');
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
run(`rm -rf ${tmpDir}`, { timeout: 10000 });
|
|
571
|
+
}
|
|
572
|
+
|
|
573
|
+
// ============================================================================
|
|
574
|
+
// DATABASE SETUP
|
|
575
|
+
// ============================================================================
|
|
576
|
+
|
|
577
|
+
/**
|
|
578
|
+
* Create SpecMem database and user
|
|
579
|
+
*/
|
|
580
|
+
function setupDatabase() {
|
|
581
|
+
log.header('Setting Up SpecMem Database');
|
|
582
|
+
|
|
583
|
+
const { name, user, password } = DB_CONFIG;
|
|
584
|
+
|
|
585
|
+
// Create user with SUPERUSER (needed for pgvector extension)
|
|
586
|
+
log.step(1, `Creating user: ${user}`);
|
|
587
|
+
run(`sudo -u postgres psql -c "CREATE USER ${user} WITH SUPERUSER PASSWORD '${password}';" 2>/dev/null || true`, { silent: true });
|
|
588
|
+
// Ensure SUPERUSER in case user already existed
|
|
589
|
+
run(`sudo -u postgres psql -c "ALTER USER ${user} WITH SUPERUSER;" 2>/dev/null || true`, { silent: true });
|
|
590
|
+
|
|
591
|
+
// Create database
|
|
592
|
+
log.step(2, `Creating database: ${name}`);
|
|
593
|
+
run(`sudo -u postgres psql -c "CREATE DATABASE ${name} OWNER ${user};" 2>/dev/null || true`, { silent: true });
|
|
594
|
+
|
|
595
|
+
// Grant privileges
|
|
596
|
+
log.step(3, 'Granting privileges...');
|
|
597
|
+
run(`sudo -u postgres psql -c "GRANT ALL PRIVILEGES ON DATABASE ${name} TO ${user};" 2>/dev/null || true`, { silent: true });
|
|
598
|
+
|
|
599
|
+
// Enable pgvector extension
|
|
600
|
+
log.step(4, 'Enabling pgvector extension...');
|
|
601
|
+
run(`sudo -u postgres psql -d ${name} -c "CREATE EXTENSION IF NOT EXISTS vector;" 2>/dev/null || true`, { silent: true });
|
|
602
|
+
|
|
603
|
+
// Verify connection
|
|
604
|
+
log.step(5, 'Verifying database connection...');
|
|
605
|
+
const verify = run(
|
|
606
|
+
`PGPASSWORD='${password}' psql -h localhost -U ${user} -d ${name} -c "SELECT 1;" 2>/dev/null`,
|
|
607
|
+
{ silent: true }
|
|
608
|
+
);
|
|
609
|
+
|
|
610
|
+
if (verify.success) {
|
|
611
|
+
log.success('Database setup complete!');
|
|
612
|
+
return true;
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
// Try adjusting pg_hba.conf for password auth
|
|
616
|
+
log.warn('Connection failed - adjusting authentication...');
|
|
617
|
+
adjustPgAuth();
|
|
618
|
+
|
|
619
|
+
return true;
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
/**
|
|
623
|
+
* Adjust PostgreSQL authentication to allow password auth
|
|
624
|
+
*/
|
|
625
|
+
function adjustPgAuth() {
|
|
626
|
+
log.info('Configuring PostgreSQL authentication...');
|
|
627
|
+
|
|
628
|
+
// Find pg_hba.conf
|
|
629
|
+
const possiblePaths = [
|
|
630
|
+
'/etc/postgresql/16/main/pg_hba.conf',
|
|
631
|
+
'/etc/postgresql/15/main/pg_hba.conf',
|
|
632
|
+
'/etc/postgresql/14/main/pg_hba.conf',
|
|
633
|
+
'/var/lib/pgsql/data/pg_hba.conf',
|
|
634
|
+
'/var/lib/postgres/data/pg_hba.conf'
|
|
635
|
+
];
|
|
636
|
+
|
|
637
|
+
let pgHbaPath = null;
|
|
638
|
+
for (const p of possiblePaths) {
|
|
639
|
+
if (fs.existsSync(p)) {
|
|
640
|
+
pgHbaPath = p;
|
|
641
|
+
break;
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
|
|
645
|
+
if (!pgHbaPath) {
|
|
646
|
+
// Try to find it
|
|
647
|
+
const findResult = run('sudo find /etc /var -name pg_hba.conf 2>/dev/null | head -1', { silent: true });
|
|
648
|
+
if (findResult.success && findResult.output) {
|
|
649
|
+
pgHbaPath = findResult.output.trim();
|
|
650
|
+
}
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
if (pgHbaPath) {
|
|
654
|
+
log.info(`Found pg_hba.conf: ${pgHbaPath}`);
|
|
655
|
+
|
|
656
|
+
// Backup and modify
|
|
657
|
+
run(`sudo cp ${pgHbaPath} ${pgHbaPath}.backup`);
|
|
658
|
+
|
|
659
|
+
// Add password auth for our user
|
|
660
|
+
const authLine = `host ${DB_CONFIG.name} ${DB_CONFIG.user} 127.0.0.1/32 md5`;
|
|
661
|
+
run(`echo '${authLine}' | sudo tee -a ${pgHbaPath}`);
|
|
662
|
+
|
|
663
|
+
// Reload PostgreSQL
|
|
664
|
+
run('sudo systemctl reload postgresql 2>/dev/null || sudo -u postgres pg_ctl reload');
|
|
665
|
+
|
|
666
|
+
log.success('PostgreSQL authentication configured');
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
// ============================================================================
|
|
671
|
+
// DOCKER SETUP
|
|
672
|
+
// ============================================================================
|
|
673
|
+
|
|
674
|
+
/**
|
|
675
|
+
* Check and install Docker - Full auto-install for all platforms
|
|
676
|
+
*/
|
|
677
|
+
function setupDocker() {
|
|
678
|
+
log.header('Checking Docker');
|
|
679
|
+
|
|
680
|
+
// Skip if requested or in lite mode
|
|
681
|
+
if (SKIP_EMBEDDINGS) {
|
|
682
|
+
log.info('Skipping Docker/embeddings setup (SPECMEM_SKIP_EMBEDDINGS=true)');
|
|
683
|
+
log.info('SpecMem will use API-based embeddings as fallback');
|
|
684
|
+
return true;
|
|
685
|
+
}
|
|
686
|
+
|
|
687
|
+
// Warn if running inside Docker (Docker-in-Docker is complex)
|
|
688
|
+
if (IS_DOCKER) {
|
|
689
|
+
log.warn('Running inside Docker container detected!');
|
|
690
|
+
log.info('Docker-in-Docker requires special setup.');
|
|
691
|
+
log.info('Options:');
|
|
692
|
+
log.info(' 1. Mount host Docker socket: -v /var/run/docker.sock:/var/run/docker.sock');
|
|
693
|
+
log.info(' 2. Use privileged mode: --privileged');
|
|
694
|
+
log.info(' 3. Skip local embeddings: export SPECMEM_SKIP_EMBEDDINGS=true');
|
|
695
|
+
log.info('');
|
|
696
|
+
log.info('Attempting to continue anyway...');
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
// Check if Docker is already installed
|
|
700
|
+
if (commandExists('docker')) {
|
|
701
|
+
log.success('Docker is installed');
|
|
702
|
+
return startDockerDaemon();
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
log.warn('Docker not found - attempting auto-install...');
|
|
706
|
+
|
|
707
|
+
// Platform-specific installation
|
|
708
|
+
if (IS_MAC) {
|
|
709
|
+
return installDockerMac();
|
|
710
|
+
} else if (IS_LINUX) {
|
|
711
|
+
return installDockerLinux();
|
|
712
|
+
} else if (IS_WINDOWS) {
|
|
713
|
+
log.error('Windows detected - please install Docker Desktop manually:');
|
|
714
|
+
log.info('https://docs.docker.com/desktop/install/windows-install/');
|
|
715
|
+
log.info('Or use: winget install Docker.DockerDesktop');
|
|
716
|
+
return false;
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
return false;
|
|
720
|
+
}
|
|
721
|
+
|
|
722
|
+
/**
|
|
723
|
+
* Start Docker daemon if not running
|
|
724
|
+
*/
|
|
725
|
+
function startDockerDaemon() {
|
|
726
|
+
const running = run('docker info', { silent: true });
|
|
727
|
+
if (running.success) {
|
|
728
|
+
log.success('Docker daemon is running');
|
|
729
|
+
return true;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
log.warn('Docker daemon not running - attempting to start...');
|
|
733
|
+
|
|
734
|
+
if (IS_MAC) {
|
|
735
|
+
// Try to start Docker Desktop
|
|
736
|
+
log.step(1, 'Starting Docker Desktop...');
|
|
737
|
+
run('open -a Docker', { silent: true });
|
|
738
|
+
|
|
739
|
+
// Wait for Docker to start (up to 60 seconds)
|
|
740
|
+
log.info('Waiting for Docker daemon to start...');
|
|
741
|
+
for (let i = 0; i < 12; i++) {
|
|
742
|
+
run('sleep 5', { silent: true });
|
|
743
|
+
if (run('docker info', { silent: true }).success) {
|
|
744
|
+
log.success('Docker daemon started');
|
|
745
|
+
return true;
|
|
746
|
+
}
|
|
747
|
+
process.stdout.write('.');
|
|
748
|
+
}
|
|
749
|
+
console.log('');
|
|
750
|
+
|
|
751
|
+
// Try colima as fallback
|
|
752
|
+
if (commandExists('colima')) {
|
|
753
|
+
log.step(2, 'Trying colima start...');
|
|
754
|
+
run('colima start');
|
|
755
|
+
if (run('docker info', { silent: true }).success) {
|
|
756
|
+
log.success('Docker (via colima) started');
|
|
757
|
+
return true;
|
|
758
|
+
}
|
|
759
|
+
}
|
|
760
|
+
|
|
761
|
+
log.warn('Could not start Docker daemon automatically');
|
|
762
|
+
log.info('Please start Docker Desktop manually and re-run installation');
|
|
763
|
+
return false;
|
|
764
|
+
|
|
765
|
+
} else if (IS_LINUX) {
|
|
766
|
+
// In Docker container, systemctl won't work
|
|
767
|
+
if (IS_DOCKER) {
|
|
768
|
+
log.warn('Inside Docker container - systemctl unavailable');
|
|
769
|
+
log.info('Checking if Docker socket is mounted...');
|
|
770
|
+
|
|
771
|
+
if (fs.existsSync('/var/run/docker.sock')) {
|
|
772
|
+
if (run('docker info', { silent: true }).success) {
|
|
773
|
+
log.success('Docker socket available (mounted from host)');
|
|
774
|
+
return true;
|
|
775
|
+
}
|
|
776
|
+
}
|
|
777
|
+
|
|
778
|
+
log.warn('Docker socket not available in container');
|
|
779
|
+
log.info('SpecMem will work without local embeddings');
|
|
780
|
+
log.info('To enable: run container with -v /var/run/docker.sock:/var/run/docker.sock');
|
|
781
|
+
return false;
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
// Try systemctl first (only on non-containerized Linux)
|
|
785
|
+
log.step(1, 'Starting Docker via systemctl...');
|
|
786
|
+
run('sudo systemctl start docker');
|
|
787
|
+
run('sudo systemctl enable docker');
|
|
788
|
+
|
|
789
|
+
if (run('docker info', { silent: true }).success) {
|
|
790
|
+
log.success('Docker daemon started');
|
|
791
|
+
return true;
|
|
792
|
+
}
|
|
793
|
+
|
|
794
|
+
// Try service command as fallback
|
|
795
|
+
log.step(2, 'Trying service command...');
|
|
796
|
+
run('sudo service docker start');
|
|
797
|
+
|
|
798
|
+
if (run('docker info', { silent: true }).success) {
|
|
799
|
+
log.success('Docker daemon started');
|
|
800
|
+
return true;
|
|
801
|
+
}
|
|
802
|
+
|
|
803
|
+
log.warn('Could not start Docker daemon');
|
|
804
|
+
return false;
|
|
805
|
+
}
|
|
806
|
+
|
|
807
|
+
return false;
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
/**
|
|
811
|
+
* Install Docker on macOS
|
|
812
|
+
*/
|
|
813
|
+
function installDockerMac() {
|
|
814
|
+
log.header('Installing Docker on macOS');
|
|
815
|
+
|
|
816
|
+
// Check for Homebrew
|
|
817
|
+
if (!commandExists('brew')) {
|
|
818
|
+
log.step(1, 'Installing Homebrew first...');
|
|
819
|
+
const brewInstall = run('/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"');
|
|
820
|
+
if (!brewInstall.success) {
|
|
821
|
+
log.error('Failed to install Homebrew');
|
|
822
|
+
log.info('Install Docker Desktop manually: https://docs.docker.com/desktop/install/mac-install/');
|
|
823
|
+
return false;
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
|
|
827
|
+
// Option 1: Try Docker Desktop (official, GUI)
|
|
828
|
+
log.step(2, 'Installing Docker Desktop via Homebrew...');
|
|
829
|
+
const desktopResult = run('brew install --cask docker', { silent: true });
|
|
830
|
+
|
|
831
|
+
if (desktopResult.success) {
|
|
832
|
+
log.success('Docker Desktop installed');
|
|
833
|
+
log.step(3, 'Starting Docker Desktop...');
|
|
834
|
+
run('open -a Docker');
|
|
835
|
+
|
|
836
|
+
// Wait for Docker to initialize
|
|
837
|
+
log.info('Waiting for Docker to initialize (this may take a minute)...');
|
|
838
|
+
for (let i = 0; i < 12; i++) {
|
|
839
|
+
run('sleep 5', { silent: true });
|
|
840
|
+
if (run('docker info', { silent: true }).success) {
|
|
841
|
+
log.success('Docker is ready!');
|
|
842
|
+
return true;
|
|
843
|
+
}
|
|
844
|
+
process.stdout.write('.');
|
|
845
|
+
}
|
|
846
|
+
console.log('');
|
|
847
|
+
log.warn('Docker Desktop installed but not yet ready');
|
|
848
|
+
log.info('Please wait for Docker Desktop to finish starting, then re-run');
|
|
849
|
+
return true; // It's installed, just not ready
|
|
850
|
+
}
|
|
851
|
+
|
|
852
|
+
// Option 2: Try colima (lightweight, CLI-only)
|
|
853
|
+
log.step(2, 'Docker Desktop failed, trying colima...');
|
|
854
|
+
run('brew install colima docker docker-compose');
|
|
855
|
+
|
|
856
|
+
if (commandExists('colima')) {
|
|
857
|
+
log.step(3, 'Starting colima...');
|
|
858
|
+
run('colima start --cpu 2 --memory 4');
|
|
859
|
+
|
|
860
|
+
if (run('docker info', { silent: true }).success) {
|
|
861
|
+
log.success('Docker (via colima) is ready!');
|
|
862
|
+
return true;
|
|
863
|
+
}
|
|
864
|
+
}
|
|
865
|
+
|
|
866
|
+
log.error('Could not install Docker automatically');
|
|
867
|
+
log.info('Please install Docker Desktop manually: https://docs.docker.com/desktop/install/mac-install/');
|
|
868
|
+
return false;
|
|
869
|
+
}
|
|
870
|
+
|
|
871
|
+
/**
|
|
872
|
+
* Install Docker on Linux - supports multiple package managers
|
|
873
|
+
*/
|
|
874
|
+
function installDockerLinux() {
|
|
875
|
+
log.header('Installing Docker on Linux');
|
|
876
|
+
|
|
877
|
+
// Method 1: Official Docker install script (works on most distros)
|
|
878
|
+
log.step(1, 'Trying official Docker install script...');
|
|
879
|
+
const scriptResult = run('curl -fsSL https://get.docker.com | sudo sh', { timeout: 300000 });
|
|
880
|
+
|
|
881
|
+
if (scriptResult.success && commandExists('docker')) {
|
|
882
|
+
log.success('Docker installed via official script');
|
|
883
|
+
configureDockerLinux();
|
|
884
|
+
return startDockerDaemon();
|
|
885
|
+
}
|
|
886
|
+
|
|
887
|
+
// Method 2: Package manager specific
|
|
888
|
+
log.step(2, 'Trying package manager installation...');
|
|
889
|
+
|
|
890
|
+
if (commandExists('apt-get')) {
|
|
891
|
+
// Debian/Ubuntu
|
|
892
|
+
log.info('Detected Debian/Ubuntu...');
|
|
893
|
+
run('sudo apt-get update');
|
|
894
|
+
run('sudo apt-get install -y ca-certificates curl gnupg');
|
|
895
|
+
run('sudo install -m 0755 -d /etc/apt/keyrings');
|
|
896
|
+
run('curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg');
|
|
897
|
+
run('sudo chmod a+r /etc/apt/keyrings/docker.gpg');
|
|
898
|
+
|
|
899
|
+
// Add repo (try Ubuntu first, then Debian)
|
|
900
|
+
const distro = run('lsb_release -is 2>/dev/null || cat /etc/os-release | grep ^ID= | cut -d= -f2', { silent: true });
|
|
901
|
+
const codename = run('lsb_release -cs 2>/dev/null || cat /etc/os-release | grep VERSION_CODENAME | cut -d= -f2', { silent: true });
|
|
902
|
+
|
|
903
|
+
const repoDistro = distro.output?.toLowerCase().includes('ubuntu') ? 'ubuntu' : 'debian';
|
|
904
|
+
run(`echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/${repoDistro} $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list`);
|
|
905
|
+
|
|
906
|
+
run('sudo apt-get update');
|
|
907
|
+
run('sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin');
|
|
908
|
+
|
|
909
|
+
} else if (commandExists('dnf')) {
|
|
910
|
+
// Fedora/RHEL 8+
|
|
911
|
+
log.info('Detected Fedora/RHEL...');
|
|
912
|
+
run('sudo dnf -y install dnf-plugins-core');
|
|
913
|
+
run('sudo dnf config-manager --add-repo https://download.docker.com/linux/fedora/docker-ce.repo');
|
|
914
|
+
run('sudo dnf install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin');
|
|
915
|
+
|
|
916
|
+
} else if (commandExists('yum')) {
|
|
917
|
+
// CentOS/RHEL 7
|
|
918
|
+
log.info('Detected CentOS/RHEL...');
|
|
919
|
+
run('sudo yum install -y yum-utils');
|
|
920
|
+
run('sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo');
|
|
921
|
+
run('sudo yum install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin');
|
|
922
|
+
|
|
923
|
+
} else if (commandExists('pacman')) {
|
|
924
|
+
// Arch Linux
|
|
925
|
+
log.info('Detected Arch Linux...');
|
|
926
|
+
run('sudo pacman -Sy --noconfirm docker docker-compose');
|
|
927
|
+
|
|
928
|
+
} else if (commandExists('zypper')) {
|
|
929
|
+
// openSUSE
|
|
930
|
+
log.info('Detected openSUSE...');
|
|
931
|
+
run('sudo zypper install -y docker docker-compose');
|
|
932
|
+
|
|
933
|
+
} else {
|
|
934
|
+
log.error('Could not detect package manager');
|
|
935
|
+
log.info('Please install Docker manually: https://docs.docker.com/engine/install/');
|
|
936
|
+
return false;
|
|
937
|
+
}
|
|
938
|
+
|
|
939
|
+
if (commandExists('docker')) {
|
|
940
|
+
log.success('Docker installed');
|
|
941
|
+
configureDockerLinux();
|
|
942
|
+
return startDockerDaemon();
|
|
943
|
+
}
|
|
944
|
+
|
|
945
|
+
log.error('Docker installation failed');
|
|
946
|
+
return false;
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
/**
|
|
950
|
+
* Configure Docker for non-root usage on Linux
|
|
951
|
+
* SECURITY: Binds Docker to 127.0.0.1 only (no external access)
|
|
952
|
+
*/
|
|
953
|
+
function configureDockerLinux() {
|
|
954
|
+
log.step('→', 'Configuring Docker for non-root usage...');
|
|
955
|
+
|
|
956
|
+
const user = process.env.USER || process.env.LOGNAME || 'root';
|
|
957
|
+
|
|
958
|
+
// Add user to docker group
|
|
959
|
+
run(`sudo usermod -aG docker ${user}`);
|
|
960
|
+
|
|
961
|
+
// SECURITY: Configure Docker to bind to localhost only
|
|
962
|
+
log.step('→', 'Securing Docker to localhost only (127.0.0.1)...');
|
|
963
|
+
const daemonConfig = {
|
|
964
|
+
"iptables": true,
|
|
965
|
+
"ip": "127.0.0.1",
|
|
966
|
+
"ip-forward": false,
|
|
967
|
+
"userland-proxy": true,
|
|
968
|
+
"live-restore": true,
|
|
969
|
+
"log-driver": "json-file",
|
|
970
|
+
"log-opts": {
|
|
971
|
+
"max-size": "10m",
|
|
972
|
+
"max-file": "3"
|
|
973
|
+
}
|
|
974
|
+
};
|
|
975
|
+
|
|
976
|
+
try {
|
|
977
|
+
const daemonJsonPath = '/etc/docker/daemon.json';
|
|
978
|
+
run('sudo mkdir -p /etc/docker');
|
|
979
|
+
|
|
980
|
+
// Check if config exists and merge
|
|
981
|
+
let existingConfig = {};
|
|
982
|
+
if (fs.existsSync(daemonJsonPath)) {
|
|
983
|
+
try {
|
|
984
|
+
existingConfig = JSON.parse(fs.readFileSync(daemonJsonPath, 'utf8'));
|
|
985
|
+
} catch (e) {}
|
|
986
|
+
}
|
|
987
|
+
|
|
988
|
+
const mergedConfig = { ...existingConfig, ...daemonConfig };
|
|
989
|
+
const configJson = JSON.stringify(mergedConfig, null, 2);
|
|
990
|
+
|
|
991
|
+
// Write via sudo
|
|
992
|
+
run(`echo '${configJson}' | sudo tee ${daemonJsonPath}`);
|
|
993
|
+
log.success('Docker configured for localhost-only access (127.0.0.1)');
|
|
994
|
+
} catch (e) {
|
|
995
|
+
log.warn('Could not configure Docker daemon.json - manual security review recommended');
|
|
996
|
+
}
|
|
997
|
+
|
|
998
|
+
// Enable and start Docker service
|
|
999
|
+
run('sudo systemctl enable docker');
|
|
1000
|
+
run('sudo systemctl restart docker'); // Restart to apply new config
|
|
1001
|
+
|
|
1002
|
+
// Set up Docker to start on boot
|
|
1003
|
+
run('sudo systemctl enable containerd');
|
|
1004
|
+
|
|
1005
|
+
log.success(`User '${user}' added to docker group`);
|
|
1006
|
+
log.info('Note: You may need to log out and back in for group changes to take effect');
|
|
1007
|
+
}
|
|
1008
|
+
|
|
1009
|
+
/**
|
|
1010
|
+
* Build or pull the SpecMem embedding Docker image
|
|
1011
|
+
*/
|
|
1012
|
+
function setupEmbeddingImage() {
|
|
1013
|
+
log.header('Setting Up Embedding Docker Image');
|
|
1014
|
+
|
|
1015
|
+
const imageName = 'specmem-embeddings:latest';
|
|
1016
|
+
|
|
1017
|
+
// Check if image already exists
|
|
1018
|
+
const exists = run(`docker image inspect ${imageName}`, { silent: true });
|
|
1019
|
+
if (exists.success) {
|
|
1020
|
+
log.success('Embedding image already exists');
|
|
1021
|
+
return true;
|
|
1022
|
+
}
|
|
1023
|
+
|
|
1024
|
+
// Try to build from local Dockerfile
|
|
1025
|
+
const dockerfilePath = path.join(SPECMEM_PKG_DIR, 'embedding-sandbox', 'Dockerfile');
|
|
1026
|
+
|
|
1027
|
+
if (fs.existsSync(dockerfilePath)) {
|
|
1028
|
+
log.step(1, 'Building embedding image from Dockerfile...');
|
|
1029
|
+
const buildResult = run(
|
|
1030
|
+
`docker build -t ${imageName} ${path.dirname(dockerfilePath)}`,
|
|
1031
|
+
{ timeout: 600000 } // 10 min timeout for build
|
|
1032
|
+
);
|
|
1033
|
+
|
|
1034
|
+
if (buildResult.success) {
|
|
1035
|
+
log.success('Embedding image built successfully');
|
|
1036
|
+
return true;
|
|
1037
|
+
}
|
|
1038
|
+
log.warn('Docker build failed, will build on first use');
|
|
1039
|
+
} else {
|
|
1040
|
+
log.info('No Dockerfile found - image will be built on first use');
|
|
1041
|
+
}
|
|
1042
|
+
|
|
1043
|
+
return false;
|
|
1044
|
+
}
|
|
1045
|
+
|
|
1046
|
+
/**
|
|
1047
|
+
* Load embedded Docker images from package
|
|
1048
|
+
*/
|
|
1049
|
+
function loadEmbeddedDockerImages() {
|
|
1050
|
+
log.header('Loading Embedded Docker Images');
|
|
1051
|
+
|
|
1052
|
+
const dockerDistDir = path.join(SPECMEM_PKG_DIR, 'docker-dist');
|
|
1053
|
+
const manifestPath = path.join(dockerDistDir, 'manifest.json');
|
|
1054
|
+
|
|
1055
|
+
// Check if we have embedded images
|
|
1056
|
+
if (!fs.existsSync(manifestPath)) {
|
|
1057
|
+
log.info('No embedded Docker images found (development mode)');
|
|
1058
|
+
log.info('Images will be built on first use');
|
|
1059
|
+
return false;
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
try {
|
|
1063
|
+
const manifest = JSON.parse(fs.readFileSync(manifestPath, 'utf8'));
|
|
1064
|
+
log.info(`Found ${manifest.images.length} embedded image(s)`);
|
|
1065
|
+
|
|
1066
|
+
for (const image of manifest.images) {
|
|
1067
|
+
const imagePath = path.join(dockerDistDir, image.file);
|
|
1068
|
+
|
|
1069
|
+
if (!fs.existsSync(imagePath)) {
|
|
1070
|
+
log.warn(`Image file not found: ${image.file}`);
|
|
1071
|
+
continue;
|
|
1072
|
+
}
|
|
1073
|
+
|
|
1074
|
+
log.step('→', `Loading ${image.name}:${image.tag}...`);
|
|
1075
|
+
|
|
1076
|
+
// Check if image already exists
|
|
1077
|
+
const exists = run(`docker image inspect ${image.name}:${image.tag}`, { silent: true });
|
|
1078
|
+
if (exists.success) {
|
|
1079
|
+
log.info(`Image ${image.name}:${image.tag} already exists, skipping`);
|
|
1080
|
+
continue;
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
// Load the image
|
|
1084
|
+
const loadResult = run(`gunzip -c "${imagePath}" | docker load`, { silent: true });
|
|
1085
|
+
|
|
1086
|
+
if (loadResult.success) {
|
|
1087
|
+
log.success(`Loaded: ${image.name}:${image.tag}`);
|
|
1088
|
+
} else {
|
|
1089
|
+
log.warn(`Failed to load: ${image.name}:${image.tag}`);
|
|
1090
|
+
}
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
return true;
|
|
1094
|
+
} catch (e) {
|
|
1095
|
+
log.warn(`Error loading embedded images: ${e.message}`);
|
|
1096
|
+
return false;
|
|
1097
|
+
}
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
// ============================================================================
|
|
1101
|
+
// CLAUDE COMMANDS SETUP
|
|
1102
|
+
// ============================================================================
|
|
1103
|
+
|
|
1104
|
+
/**
|
|
1105
|
+
* Install SpecMem slash commands to 's commands directory
|
|
1106
|
+
* These are the /specmem-* commands that provide memory operations
|
|
1107
|
+
*/
|
|
1108
|
+
function installCommands() {
|
|
1109
|
+
log.header('Installing SpecMem Commands');
|
|
1110
|
+
|
|
1111
|
+
const commandsDir = path.join(CLAUDE_DIR, 'commands');
|
|
1112
|
+
const specmemCommandsDir = path.join(SPECMEM_PKG_DIR, 'commands');
|
|
1113
|
+
|
|
1114
|
+
ensureDir(commandsDir);
|
|
1115
|
+
|
|
1116
|
+
if (!fs.existsSync(specmemCommandsDir)) {
|
|
1117
|
+
log.warn(`Commands directory not found: ${specmemCommandsDir}`);
|
|
1118
|
+
return { installed: false, commands: [] };
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
// Get all .md command files
|
|
1122
|
+
const commandFiles = fs.readdirSync(specmemCommandsDir).filter(f => f.endsWith('.md'));
|
|
1123
|
+
const copiedCommands = [];
|
|
1124
|
+
|
|
1125
|
+
// Clean up old SpecMem commands that no longer exist in source
|
|
1126
|
+
if (fs.existsSync(commandsDir)) {
|
|
1127
|
+
const existingCommands = fs.readdirSync(commandsDir).filter(f => f.startsWith('specmem') && f.endsWith('.md'));
|
|
1128
|
+
for (const oldCmd of existingCommands) {
|
|
1129
|
+
if (!commandFiles.includes(oldCmd)) {
|
|
1130
|
+
try {
|
|
1131
|
+
fs.unlinkSync(path.join(commandsDir, oldCmd));
|
|
1132
|
+
log.info(`Removed outdated: ${oldCmd}`);
|
|
1133
|
+
} catch (e) {}
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1136
|
+
}
|
|
1137
|
+
|
|
1138
|
+
// Copy all command files
|
|
1139
|
+
for (const cmdFile of commandFiles) {
|
|
1140
|
+
const src = path.join(specmemCommandsDir, cmdFile);
|
|
1141
|
+
const dest = path.join(commandsDir, cmdFile);
|
|
1142
|
+
|
|
1143
|
+
try {
|
|
1144
|
+
fs.copyFileSync(src, dest);
|
|
1145
|
+
copiedCommands.push(cmdFile.replace('.md', ''));
|
|
1146
|
+
log.success(`Installed: /${cmdFile.replace('.md', '')}`);
|
|
1147
|
+
} catch (e) {
|
|
1148
|
+
log.warn(`Failed to install: ${cmdFile}`);
|
|
1149
|
+
}
|
|
1150
|
+
}
|
|
1151
|
+
|
|
1152
|
+
if (copiedCommands.length > 0) {
|
|
1153
|
+
log.success(`Total: ${copiedCommands.length} commands installed`);
|
|
1154
|
+
}
|
|
1155
|
+
|
|
1156
|
+
return { installed: copiedCommands.length > 0, commands: copiedCommands };
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
// ============================================================================
|
|
1160
|
+
// CLAUDE SKILLS SETUP
|
|
1161
|
+
// ============================================================================
|
|
1162
|
+
|
|
1163
|
+
/**
|
|
1164
|
+
* Install SpecMem skills to 's commands directory
|
|
1165
|
+
* Skills are .md files that provide specialized behaviors/prompts
|
|
1166
|
+
* They get deployed alongside commands (same directory in Code)
|
|
1167
|
+
*/
|
|
1168
|
+
function installSkills() {
|
|
1169
|
+
log.header('Installing SpecMem Skills');
|
|
1170
|
+
|
|
1171
|
+
const commandsDir = path.join(CLAUDE_DIR, 'commands');
|
|
1172
|
+
const skillsDir = path.join(SPECMEM_PKG_DIR, 'skills');
|
|
1173
|
+
|
|
1174
|
+
ensureDir(commandsDir);
|
|
1175
|
+
|
|
1176
|
+
if (!fs.existsSync(skillsDir)) {
|
|
1177
|
+
log.warn(`Skills directory not found: ${skillsDir}`);
|
|
1178
|
+
return { installed: false, skills: [] };
|
|
1179
|
+
}
|
|
1180
|
+
|
|
1181
|
+
const copiedSkills = [];
|
|
1182
|
+
|
|
1183
|
+
/**
|
|
1184
|
+
* Recursively copy skill files from a directory
|
|
1185
|
+
*/
|
|
1186
|
+
function copySkillsFrom(srcDir, prefix = '') {
|
|
1187
|
+
if (!fs.existsSync(srcDir)) return;
|
|
1188
|
+
|
|
1189
|
+
const items = fs.readdirSync(srcDir, { withFileTypes: true });
|
|
1190
|
+
|
|
1191
|
+
for (const item of items) {
|
|
1192
|
+
const srcPath = path.join(srcDir, item.name);
|
|
1193
|
+
|
|
1194
|
+
if (item.isDirectory()) {
|
|
1195
|
+
// Recurse into subdirectories (e.g., teammemberskills/)
|
|
1196
|
+
copySkillsFrom(srcPath, item.name + '-');
|
|
1197
|
+
} else if (item.name.endsWith('.md')) {
|
|
1198
|
+
// Skill file - copy to commands dir
|
|
1199
|
+
const destName = prefix ? `${prefix}${item.name}` : item.name;
|
|
1200
|
+
const destPath = path.join(commandsDir, destName);
|
|
1201
|
+
|
|
1202
|
+
try {
|
|
1203
|
+
fs.copyFileSync(srcPath, destPath);
|
|
1204
|
+
copiedSkills.push(destName.replace('.md', ''));
|
|
1205
|
+
log.success(`Skill: /${destName.replace('.md', '')}`);
|
|
1206
|
+
} catch (e) {
|
|
1207
|
+
log.warn(`Failed to install skill: ${destName}`);
|
|
1208
|
+
}
|
|
1209
|
+
}
|
|
1210
|
+
}
|
|
1211
|
+
}
|
|
1212
|
+
|
|
1213
|
+
// Copy all skills (including from subdirectories)
|
|
1214
|
+
copySkillsFrom(skillsDir);
|
|
1215
|
+
|
|
1216
|
+
if (copiedSkills.length > 0) {
|
|
1217
|
+
log.success(`Total: ${copiedSkills.length} skills installed`);
|
|
1218
|
+
}
|
|
1219
|
+
|
|
1220
|
+
return { installed: copiedSkills.length > 0, skills: copiedSkills };
|
|
1221
|
+
}
|
|
1222
|
+
|
|
1223
|
+
// ============================================================================
|
|
1224
|
+
// SPECMEM PLUGINS SETUP
|
|
1225
|
+
// ============================================================================
|
|
1226
|
+
|
|
1227
|
+
/**
|
|
1228
|
+
* Install SpecMem plugins to 's plugins directory
|
|
1229
|
+
* Plugins contain agent definitions that get loaded by agent-loading-hook
|
|
1230
|
+
*/
|
|
1231
|
+
function installPlugins() {
|
|
1232
|
+
log.header('Installing SpecMem Plugins');
|
|
1233
|
+
|
|
1234
|
+
const claudePluginsDir = path.join(CLAUDE_DIR, 'plugins');
|
|
1235
|
+
const specmemPluginsDir = path.join(SPECMEM_PKG_DIR, 'plugins');
|
|
1236
|
+
|
|
1237
|
+
ensureDir(claudePluginsDir);
|
|
1238
|
+
|
|
1239
|
+
if (!fs.existsSync(specmemPluginsDir)) {
|
|
1240
|
+
log.info('No bundled plugins found (development mode)');
|
|
1241
|
+
return { installed: false, plugins: [] };
|
|
1242
|
+
}
|
|
1243
|
+
|
|
1244
|
+
const copiedPlugins = [];
|
|
1245
|
+
|
|
1246
|
+
/**
|
|
1247
|
+
* Recursively copy a directory
|
|
1248
|
+
*/
|
|
1249
|
+
function copyDirRecursive(src, dest) {
|
|
1250
|
+
ensureDir(dest);
|
|
1251
|
+
const items = fs.readdirSync(src, { withFileTypes: true });
|
|
1252
|
+
|
|
1253
|
+
for (const item of items) {
|
|
1254
|
+
const srcPath = path.join(src, item.name);
|
|
1255
|
+
const destPath = path.join(dest, item.name);
|
|
1256
|
+
|
|
1257
|
+
if (item.isDirectory()) {
|
|
1258
|
+
copyDirRecursive(srcPath, destPath);
|
|
1259
|
+
} else {
|
|
1260
|
+
fs.copyFileSync(srcPath, destPath);
|
|
1261
|
+
}
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1264
|
+
|
|
1265
|
+
// Get all plugin directories
|
|
1266
|
+
const plugins = fs.readdirSync(specmemPluginsDir, { withFileTypes: true })
|
|
1267
|
+
.filter(d => d.isDirectory());
|
|
1268
|
+
|
|
1269
|
+
for (const plugin of plugins) {
|
|
1270
|
+
const srcPluginDir = path.join(specmemPluginsDir, plugin.name);
|
|
1271
|
+
const destPluginDir = path.join(claudePluginsDir, plugin.name);
|
|
1272
|
+
|
|
1273
|
+
try {
|
|
1274
|
+
copyDirRecursive(srcPluginDir, destPluginDir);
|
|
1275
|
+
copiedPlugins.push(plugin.name);
|
|
1276
|
+
log.success(`Plugin: ${plugin.name}`);
|
|
1277
|
+
} catch (e) {
|
|
1278
|
+
log.warn(`Failed to install plugin: ${plugin.name}`);
|
|
1279
|
+
}
|
|
1280
|
+
}
|
|
1281
|
+
|
|
1282
|
+
if (copiedPlugins.length > 0) {
|
|
1283
|
+
log.success(`Total: ${copiedPlugins.length} plugins installed`);
|
|
1284
|
+
}
|
|
1285
|
+
|
|
1286
|
+
return { installed: copiedPlugins.length > 0, plugins: copiedPlugins };
|
|
1287
|
+
}
|
|
1288
|
+
|
|
1289
|
+
// ============================================================================
|
|
1290
|
+
// CLAUDE HOOKS SETUP
|
|
1291
|
+
// ============================================================================
|
|
1292
|
+
|
|
1293
|
+
/**
|
|
1294
|
+
* Install hooks
|
|
1295
|
+
* Copies ALL hook files including .cjs and .json support files
|
|
1296
|
+
*/
|
|
1297
|
+
function installHooks() {
|
|
1298
|
+
log.header('Installing Hooks');
|
|
1299
|
+
|
|
1300
|
+
ensureDir(CLAUDE_HOOKS_DIR);
|
|
1301
|
+
|
|
1302
|
+
const hooksDir = path.join(SPECMEM_PKG_DIR, 'claude-hooks');
|
|
1303
|
+
|
|
1304
|
+
if (!fs.existsSync(hooksDir)) {
|
|
1305
|
+
log.warn(`Hooks directory not found: ${hooksDir}`);
|
|
1306
|
+
return;
|
|
1307
|
+
}
|
|
1308
|
+
|
|
1309
|
+
// CRITICAL: Include .cjs and .json files for token compressor system
|
|
1310
|
+
const hooks = fs.readdirSync(hooksDir).filter(f =>
|
|
1311
|
+
f.endsWith('.js') || f.endsWith('.cjs') || f.endsWith('.json') ||
|
|
1312
|
+
f.endsWith('.py') || f.endsWith('.sh')
|
|
1313
|
+
);
|
|
1314
|
+
|
|
1315
|
+
let installed = 0;
|
|
1316
|
+
for (const hook of hooks) {
|
|
1317
|
+
const src = path.join(hooksDir, hook);
|
|
1318
|
+
const dest = path.join(CLAUDE_HOOKS_DIR, hook);
|
|
1319
|
+
|
|
1320
|
+
try {
|
|
1321
|
+
fs.copyFileSync(src, dest);
|
|
1322
|
+
// Only chmod executable files, not .json
|
|
1323
|
+
if (!hook.endsWith('.json')) {
|
|
1324
|
+
fs.chmodSync(dest, 0o755);
|
|
1325
|
+
}
|
|
1326
|
+
installed++;
|
|
1327
|
+
} catch (e) {
|
|
1328
|
+
log.warn(`Failed to install: ${hook}`);
|
|
1329
|
+
}
|
|
1330
|
+
}
|
|
1331
|
+
|
|
1332
|
+
log.success(`Installed ${installed} hook files`);
|
|
1333
|
+
}
|
|
1334
|
+
|
|
1335
|
+
/**
|
|
1336
|
+
* Configure settings.json with hooks
|
|
1337
|
+
*/
|
|
1338
|
+
function configureSettings() {
|
|
1339
|
+
log.header('Configuring Settings');
|
|
1340
|
+
|
|
1341
|
+
ensureDir(CLAUDE_DIR);
|
|
1342
|
+
|
|
1343
|
+
let settings = {};
|
|
1344
|
+
|
|
1345
|
+
// Load existing settings
|
|
1346
|
+
if (fs.existsSync(CLAUDE_SETTINGS)) {
|
|
1347
|
+
try {
|
|
1348
|
+
settings = JSON.parse(fs.readFileSync(CLAUDE_SETTINGS, 'utf8'));
|
|
1349
|
+
log.info('Loaded existing settings.json');
|
|
1350
|
+
} catch (e) {
|
|
1351
|
+
log.warn('Could not parse existing settings.json, creating new');
|
|
1352
|
+
}
|
|
1353
|
+
}
|
|
1354
|
+
|
|
1355
|
+
// Ensure permissions
|
|
1356
|
+
if (!settings.permissions) settings.permissions = {};
|
|
1357
|
+
if (!settings.permissions.allow) settings.permissions.allow = [];
|
|
1358
|
+
|
|
1359
|
+
// Add SpecMem permissions (MCP tools + Skills for commands)
|
|
1360
|
+
const requiredPermissions = [
|
|
1361
|
+
'mcp__specmem__*', // All MCP tools
|
|
1362
|
+
'Skill(specmem)', // Main specmem skill
|
|
1363
|
+
'Skill(specmem-*)', // All specmem-* skills/commands
|
|
1364
|
+
'Bash',
|
|
1365
|
+
'Read',
|
|
1366
|
+
'Write',
|
|
1367
|
+
'Edit',
|
|
1368
|
+
'Glob',
|
|
1369
|
+
'Grep'
|
|
1370
|
+
];
|
|
1371
|
+
for (const perm of requiredPermissions) {
|
|
1372
|
+
if (!settings.permissions.allow.includes(perm)) {
|
|
1373
|
+
settings.permissions.allow.push(perm);
|
|
1374
|
+
}
|
|
1375
|
+
}
|
|
1376
|
+
|
|
1377
|
+
// Configure hooks - MERGE with existing, don't overwrite!
|
|
1378
|
+
if (!settings.hooks) settings.hooks = {};
|
|
1379
|
+
|
|
1380
|
+
// Standard env vars for all hooks
|
|
1381
|
+
const hookEnv = {
|
|
1382
|
+
SPECMEM_HOME: SPECMEM_GLOBAL_DIR,
|
|
1383
|
+
SPECMEM_PKG: SPECMEM_PKG_DIR,
|
|
1384
|
+
SPECMEM_RUN_DIR: '${cwd}/specmem/sockets',
|
|
1385
|
+
SPECMEM_EMBEDDING_SOCKET: '${cwd}/specmem/sockets/embeddings.sock',
|
|
1386
|
+
SPECMEM_PROJECT_PATH: '${cwd}'
|
|
1387
|
+
};
|
|
1388
|
+
|
|
1389
|
+
/**
|
|
1390
|
+
* Helper to merge hooks without clobbering user's custom hooks
|
|
1391
|
+
* - Removes old specmem hooks (by matcher or command pattern)
|
|
1392
|
+
* - Adds new specmem hooks
|
|
1393
|
+
* - Preserves user's custom non-specmem hooks
|
|
1394
|
+
*/
|
|
1395
|
+
function mergeHooks(existing, newHooks) {
|
|
1396
|
+
if (!existing) return newHooks;
|
|
1397
|
+
|
|
1398
|
+
// Build set of specmem matchers for new hooks
|
|
1399
|
+
const specmemMatchers = new Map();
|
|
1400
|
+
for (const hook of newHooks) {
|
|
1401
|
+
const matcherKey = hook.matcher || '__CATCHALL__';
|
|
1402
|
+
specmemMatchers.set(matcherKey, hook);
|
|
1403
|
+
}
|
|
1404
|
+
|
|
1405
|
+
// Filter existing hooks:
|
|
1406
|
+
// - Remove groups with same matcher as specmem (specmem takes priority)
|
|
1407
|
+
// - Remove old specmem hooks (by command pattern)
|
|
1408
|
+
const preserved = existing.filter(h => {
|
|
1409
|
+
const matcherKey = h.matcher || '__CATCHALL__';
|
|
1410
|
+
|
|
1411
|
+
// If specmem has a hook for this matcher, remove existing
|
|
1412
|
+
if (specmemMatchers.has(matcherKey)) {
|
|
1413
|
+
return false;
|
|
1414
|
+
}
|
|
1415
|
+
|
|
1416
|
+
// Check if this is a specmem hook (to avoid duplicates on re-init)
|
|
1417
|
+
const hookStr = JSON.stringify(h);
|
|
1418
|
+
if (hookStr.includes('specmem-') ||
|
|
1419
|
+
hookStr.includes('/specmem/') ||
|
|
1420
|
+
hookStr.includes('team-comms-enforcer') ||
|
|
1421
|
+
hookStr.includes('smart-context-hook') ||
|
|
1422
|
+
hookStr.includes('agent-loading-hook') ||
|
|
1423
|
+
hookStr.includes('input-aware-improver')) {
|
|
1424
|
+
return false;
|
|
1425
|
+
}
|
|
1426
|
+
|
|
1427
|
+
return true; // Preserve user's custom hooks
|
|
1428
|
+
});
|
|
1429
|
+
|
|
1430
|
+
// Return: preserved user hooks + new specmem hooks
|
|
1431
|
+
return [...preserved, ...newHooks];
|
|
1432
|
+
}
|
|
1433
|
+
|
|
1434
|
+
// UserPromptSubmit hooks - MERGE
|
|
1435
|
+
const specmemUserPromptHooks = [
|
|
1436
|
+
{
|
|
1437
|
+
hooks: [{
|
|
1438
|
+
type: 'command',
|
|
1439
|
+
command: `node ${path.join(CLAUDE_HOOKS_DIR, 'specmem-drilldown-hook.js')}`,
|
|
1440
|
+
timeout: 30,
|
|
1441
|
+
env: {
|
|
1442
|
+
...hookEnv,
|
|
1443
|
+
SPECMEM_SEARCH_LIMIT: '5',
|
|
1444
|
+
SPECMEM_THRESHOLD: '0.30',
|
|
1445
|
+
SPECMEM_MAX_CONTENT: '200'
|
|
1446
|
+
}
|
|
1447
|
+
}]
|
|
1448
|
+
},
|
|
1449
|
+
{
|
|
1450
|
+
hooks: [{
|
|
1451
|
+
type: 'command',
|
|
1452
|
+
command: `node ${path.join(CLAUDE_HOOKS_DIR, 'input-aware-improver.js')}`,
|
|
1453
|
+
timeout: 5,
|
|
1454
|
+
env: hookEnv
|
|
1455
|
+
}]
|
|
1456
|
+
}
|
|
1457
|
+
];
|
|
1458
|
+
settings.hooks.UserPromptSubmit = mergeHooks(settings.hooks.UserPromptSubmit, specmemUserPromptHooks);
|
|
1459
|
+
|
|
1460
|
+
// PreToolUse hooks - Agent loading with chooser - MERGE
|
|
1461
|
+
const specmemPreToolUseHooks = [
|
|
1462
|
+
{
|
|
1463
|
+
matcher: 'Task',
|
|
1464
|
+
hooks: [{
|
|
1465
|
+
type: 'command',
|
|
1466
|
+
command: `node ${path.join(CLAUDE_HOOKS_DIR, 'agent-loading-hook.js')}`,
|
|
1467
|
+
timeout: 10,
|
|
1468
|
+
statusMessage: 'Agent Chooser...',
|
|
1469
|
+
env: {
|
|
1470
|
+
...hookEnv,
|
|
1471
|
+
SPECMEM_FORCE_CHOOSER: '1',
|
|
1472
|
+
SPECMEM_AGENT_AUTO: '0'
|
|
1473
|
+
}
|
|
1474
|
+
}]
|
|
1475
|
+
},
|
|
1476
|
+
{
|
|
1477
|
+
matcher: 'Grep',
|
|
1478
|
+
hooks: [{
|
|
1479
|
+
type: 'command',
|
|
1480
|
+
command: `node ${path.join(CLAUDE_HOOKS_DIR, 'smart-context-hook.js')}`,
|
|
1481
|
+
timeout: 8,
|
|
1482
|
+
env: {
|
|
1483
|
+
...hookEnv,
|
|
1484
|
+
SPECMEM_SEARCH_LIMIT: '3',
|
|
1485
|
+
SPECMEM_THRESHOLD: '0.25',
|
|
1486
|
+
SPECMEM_MAX_CONTENT: '150'
|
|
1487
|
+
}
|
|
1488
|
+
}]
|
|
1489
|
+
},
|
|
1490
|
+
{
|
|
1491
|
+
matcher: 'Glob',
|
|
1492
|
+
hooks: [{
|
|
1493
|
+
type: 'command',
|
|
1494
|
+
command: `node ${path.join(CLAUDE_HOOKS_DIR, 'smart-context-hook.js')}`,
|
|
1495
|
+
timeout: 8,
|
|
1496
|
+
env: {
|
|
1497
|
+
...hookEnv,
|
|
1498
|
+
SPECMEM_SEARCH_LIMIT: '3',
|
|
1499
|
+
SPECMEM_THRESHOLD: '0.25',
|
|
1500
|
+
SPECMEM_MAX_CONTENT: '150'
|
|
1501
|
+
}
|
|
1502
|
+
}]
|
|
1503
|
+
},
|
|
1504
|
+
{
|
|
1505
|
+
matcher: 'Read',
|
|
1506
|
+
hooks: [{
|
|
1507
|
+
type: 'command',
|
|
1508
|
+
command: `node ${path.join(CLAUDE_HOOKS_DIR, 'smart-context-hook.js')}`,
|
|
1509
|
+
timeout: 8,
|
|
1510
|
+
env: {
|
|
1511
|
+
...hookEnv,
|
|
1512
|
+
SPECMEM_SEARCH_LIMIT: '3',
|
|
1513
|
+
SPECMEM_THRESHOLD: '0.25',
|
|
1514
|
+
SPECMEM_MAX_CONTENT: '150'
|
|
1515
|
+
}
|
|
1516
|
+
}]
|
|
1517
|
+
}
|
|
1518
|
+
];
|
|
1519
|
+
settings.hooks.PreToolUse = mergeHooks(settings.hooks.PreToolUse, specmemPreToolUseHooks);
|
|
1520
|
+
|
|
1521
|
+
// SessionStart hook - MERGE
|
|
1522
|
+
const specmemSessionStartHooks = [
|
|
1523
|
+
{
|
|
1524
|
+
hooks: [{
|
|
1525
|
+
type: 'command',
|
|
1526
|
+
command: `node ${path.join(CLAUDE_HOOKS_DIR, 'specmem-session-start.cjs')}`,
|
|
1527
|
+
timeout: 30,
|
|
1528
|
+
env: hookEnv
|
|
1529
|
+
}]
|
|
1530
|
+
}
|
|
1531
|
+
];
|
|
1532
|
+
settings.hooks.SessionStart = mergeHooks(settings.hooks.SessionStart, specmemSessionStartHooks);
|
|
1533
|
+
|
|
1534
|
+
// PreCompact hook - saves context before compaction - MERGE
|
|
1535
|
+
const specmemPreCompactHooks = [
|
|
1536
|
+
{
|
|
1537
|
+
hooks: [{
|
|
1538
|
+
type: 'command',
|
|
1539
|
+
command: `node ${path.join(CLAUDE_HOOKS_DIR, 'specmem-precompact.js')}`,
|
|
1540
|
+
timeout: 60,
|
|
1541
|
+
env: hookEnv
|
|
1542
|
+
}]
|
|
1543
|
+
}
|
|
1544
|
+
];
|
|
1545
|
+
settings.hooks.PreCompact = mergeHooks(settings.hooks.PreCompact, specmemPreCompactHooks);
|
|
1546
|
+
|
|
1547
|
+
// PostToolUse hooks - agent completion tracking - MERGE
|
|
1548
|
+
const specmemPostToolUseHooks = [
|
|
1549
|
+
{
|
|
1550
|
+
matcher: 'Task',
|
|
1551
|
+
hooks: [{
|
|
1552
|
+
type: 'command',
|
|
1553
|
+
command: `node ${path.join(CLAUDE_HOOKS_DIR, 'task-progress-hook.js')}`,
|
|
1554
|
+
timeout: 10,
|
|
1555
|
+
statusMessage: 'Team member finished',
|
|
1556
|
+
env: hookEnv
|
|
1557
|
+
}]
|
|
1558
|
+
}
|
|
1559
|
+
];
|
|
1560
|
+
settings.hooks.PostToolUse = mergeHooks(settings.hooks.PostToolUse, specmemPostToolUseHooks);
|
|
1561
|
+
|
|
1562
|
+
// SubagentStart/Stop hooks - MERGE
|
|
1563
|
+
const specmemSubagentStartHooks = [
|
|
1564
|
+
{
|
|
1565
|
+
hooks: [{
|
|
1566
|
+
type: 'command',
|
|
1567
|
+
command: `node ${path.join(CLAUDE_HOOKS_DIR, 'subagent-loading-hook.js')}`,
|
|
1568
|
+
timeout: 5,
|
|
1569
|
+
statusMessage: 'Starting subagent...',
|
|
1570
|
+
env: hookEnv
|
|
1571
|
+
}]
|
|
1572
|
+
}
|
|
1573
|
+
];
|
|
1574
|
+
settings.hooks.SubagentStart = mergeHooks(settings.hooks.SubagentStart, specmemSubagentStartHooks);
|
|
1575
|
+
|
|
1576
|
+
const specmemSubagentStopHooks = [
|
|
1577
|
+
{
|
|
1578
|
+
hooks: [{
|
|
1579
|
+
type: 'command',
|
|
1580
|
+
command: `node ${path.join(CLAUDE_HOOKS_DIR, 'subagent-loading-hook.js')}`,
|
|
1581
|
+
timeout: 5,
|
|
1582
|
+
statusMessage: 'Subagent completed',
|
|
1583
|
+
env: hookEnv
|
|
1584
|
+
}]
|
|
1585
|
+
}
|
|
1586
|
+
];
|
|
1587
|
+
settings.hooks.SubagentStop = mergeHooks(settings.hooks.SubagentStop, specmemSubagentStopHooks);
|
|
1588
|
+
|
|
1589
|
+
// Configure MCP servers
|
|
1590
|
+
if (!settings.mcpServers) settings.mcpServers = {};
|
|
1591
|
+
|
|
1592
|
+
// Read database credentials from .env if available, otherwise use defaults
|
|
1593
|
+
const envPath = path.join(process.cwd(), '.env');
|
|
1594
|
+
// Use DB_CONFIG as the single source of truth for credentials
|
|
1595
|
+
let dbCredentials = {
|
|
1596
|
+
SPECMEM_DB_HOST: DB_CONFIG.host,
|
|
1597
|
+
SPECMEM_DB_PORT: String(DB_CONFIG.port),
|
|
1598
|
+
SPECMEM_DB_NAME: DB_CONFIG.name,
|
|
1599
|
+
SPECMEM_DB_USER: DB_CONFIG.user,
|
|
1600
|
+
SPECMEM_DB_PASSWORD: DB_CONFIG.password
|
|
1601
|
+
};
|
|
1602
|
+
|
|
1603
|
+
if (fs.existsSync(envPath)) {
|
|
1604
|
+
try {
|
|
1605
|
+
const envContent = fs.readFileSync(envPath, 'utf-8');
|
|
1606
|
+
const envLines = envContent.split('\n');
|
|
1607
|
+
for (const line of envLines) {
|
|
1608
|
+
const match = line.match(/^(SPECMEM_DB_\w+)=(.+)$/);
|
|
1609
|
+
if (match) {
|
|
1610
|
+
dbCredentials[match[1]] = match[2].trim();
|
|
1611
|
+
}
|
|
1612
|
+
}
|
|
1613
|
+
log.dim('Loaded DB credentials from .env');
|
|
1614
|
+
} catch (e) {
|
|
1615
|
+
log.dim('Using default DB credentials');
|
|
1616
|
+
}
|
|
1617
|
+
}
|
|
1618
|
+
|
|
1619
|
+
settings.mcpServers.specmem = {
|
|
1620
|
+
command: 'node',
|
|
1621
|
+
args: [
|
|
1622
|
+
'--max-old-space-size=250',
|
|
1623
|
+
path.join(SPECMEM_PKG_DIR, 'bootstrap.cjs')
|
|
1624
|
+
],
|
|
1625
|
+
env: {
|
|
1626
|
+
HOME: HOME,
|
|
1627
|
+
SPECMEM_PROJECT_PATH: '${PWD}',
|
|
1628
|
+
...dbCredentials
|
|
1629
|
+
}
|
|
1630
|
+
};
|
|
1631
|
+
|
|
1632
|
+
// Write settings
|
|
1633
|
+
fs.writeFileSync(CLAUDE_SETTINGS, JSON.stringify(settings, null, 2));
|
|
1634
|
+
log.success(' settings configured (merged with existing - no clobbering!)');
|
|
1635
|
+
}
|
|
1636
|
+
|
|
1637
|
+
// ============================================================================
|
|
1638
|
+
// GLOBAL DIRECTORIES & ENV
|
|
1639
|
+
// ============================================================================
|
|
1640
|
+
|
|
1641
|
+
/**
|
|
1642
|
+
* Setup global SpecMem directories
|
|
1643
|
+
*/
|
|
1644
|
+
function setupGlobalDirs() {
|
|
1645
|
+
log.header('Setting Up Global Directories');
|
|
1646
|
+
|
|
1647
|
+
const dirs = [
|
|
1648
|
+
SPECMEM_GLOBAL_DIR,
|
|
1649
|
+
path.join(SPECMEM_GLOBAL_DIR, 'instances'),
|
|
1650
|
+
path.join(SPECMEM_GLOBAL_DIR, 'docker'),
|
|
1651
|
+
path.join(SPECMEM_GLOBAL_DIR, 'sockets'),
|
|
1652
|
+
path.join(SPECMEM_GLOBAL_DIR, 'logs')
|
|
1653
|
+
];
|
|
1654
|
+
|
|
1655
|
+
for (const dir of dirs) {
|
|
1656
|
+
ensureDir(dir);
|
|
1657
|
+
}
|
|
1658
|
+
}
|
|
1659
|
+
|
|
1660
|
+
/**
|
|
1661
|
+
* Copy default agent configuration
|
|
1662
|
+
*/
|
|
1663
|
+
function copyAgentConfig() {
|
|
1664
|
+
const srcConfig = path.join(SPECMEM_PKG_DIR, '.specmem', 'agent-config.json');
|
|
1665
|
+
const destConfig = path.join(SPECMEM_GLOBAL_DIR, 'agent-config.json');
|
|
1666
|
+
|
|
1667
|
+
if (fs.existsSync(srcConfig) && !fs.existsSync(destConfig)) {
|
|
1668
|
+
try {
|
|
1669
|
+
fs.copyFileSync(srcConfig, destConfig);
|
|
1670
|
+
log.success('Agent config template installed');
|
|
1671
|
+
} catch (e) {
|
|
1672
|
+
log.warn('Could not copy agent config');
|
|
1673
|
+
}
|
|
1674
|
+
}
|
|
1675
|
+
}
|
|
1676
|
+
|
|
1677
|
+
/**
|
|
1678
|
+
* Create environment template
|
|
1679
|
+
*/
|
|
1680
|
+
function createEnvTemplate() {
|
|
1681
|
+
log.header('Creating Environment Template');
|
|
1682
|
+
|
|
1683
|
+
const envTemplate = `# SpecMem Configuration
|
|
1684
|
+
# Generated by specmem-hardwicksoftware
|
|
1685
|
+
# https://justcalljon.pro
|
|
1686
|
+
|
|
1687
|
+
# Database (auto-configured)
|
|
1688
|
+
SPECMEM_DB_HOST=${DB_CONFIG.host}
|
|
1689
|
+
SPECMEM_DB_PORT=${DB_CONFIG.port}
|
|
1690
|
+
SPECMEM_DB_NAME=${DB_CONFIG.name}
|
|
1691
|
+
SPECMEM_DB_USER=${DB_CONFIG.user}
|
|
1692
|
+
SPECMEM_DB_PASSWORD=${DB_CONFIG.password}
|
|
1693
|
+
|
|
1694
|
+
# Embedding Service
|
|
1695
|
+
SPECMEM_EMBEDDING_TIMEOUT=45
|
|
1696
|
+
SPECMEM_EMBEDDING_MAX_RETRIES=3
|
|
1697
|
+
|
|
1698
|
+
# Memory Settings
|
|
1699
|
+
SPECMEM_MAX_HEAP_MB=100
|
|
1700
|
+
SPECMEM_SEARCH_LIMIT=10
|
|
1701
|
+
SPECMEM_THRESHOLD=0.25
|
|
1702
|
+
|
|
1703
|
+
# Docker (on-demand activation)
|
|
1704
|
+
SPECMEM_DOCKER_CPU_LIMIT=20
|
|
1705
|
+
SPECMEM_DOCKER_MEMORY_LIMIT=2g
|
|
1706
|
+
SPECMEM_DOCKER_IDLE_TIMEOUT=60
|
|
1707
|
+
`;
|
|
1708
|
+
|
|
1709
|
+
const envPath = path.join(SPECMEM_GLOBAL_DIR, 'specmem.env.template');
|
|
1710
|
+
fs.writeFileSync(envPath, envTemplate);
|
|
1711
|
+
log.success('Environment template created');
|
|
1712
|
+
}
|
|
1713
|
+
|
|
1714
|
+
// ============================================================================
|
|
1715
|
+
// MAIN INSTALLATION
|
|
1716
|
+
// ============================================================================
|
|
1717
|
+
|
|
1718
|
+
async function main() {
|
|
1719
|
+
console.log(`
|
|
1720
|
+
${c.bright}${c.cyan}
|
|
1721
|
+
╔═══════════════════════════════════════════════════════════════╗
|
|
1722
|
+
║ ║
|
|
1723
|
+
║ ███████╗██████╗ ███████╗ ██████╗███╗ ███╗███████╗███╗ ███╗
|
|
1724
|
+
║ ██╔════╝██╔══██╗██╔════╝██╔════╝████╗ ████║██╔════╝████╗ ████║
|
|
1725
|
+
║ ███████╗██████╔╝█████╗ ██║ ██╔████╔██║█████╗ ██╔████╔██║
|
|
1726
|
+
║ ╚════██║██╔═══╝ ██╔══╝ ██║ ██║╚██╔╝██║██╔══╝ ██║╚██╔╝██║
|
|
1727
|
+
║ ███████║██║ ███████╗╚██████╗██║ ╚═╝ ██║███████╗██║ ╚═╝ ██║
|
|
1728
|
+
║ ╚══════╝╚═╝ ╚══════╝ ╚═════╝╚═╝ ╚═╝╚══════╝╚═╝ ╚═╝
|
|
1729
|
+
║ ║
|
|
1730
|
+
║ FULL AUTO-INSTALL ║
|
|
1731
|
+
║ PostgreSQL + pgvector + Docker + Hooks ║
|
|
1732
|
+
║ https://justcalljon.pro ║
|
|
1733
|
+
║ ║
|
|
1734
|
+
╚═══════════════════════════════════════════════════════════════╝
|
|
1735
|
+
${c.reset}
|
|
1736
|
+
`);
|
|
1737
|
+
|
|
1738
|
+
log.info('Starting SpecMem full auto-installation...');
|
|
1739
|
+
log.info(`Platform: ${PLATFORM}`);
|
|
1740
|
+
|
|
1741
|
+
// ============================================================================
|
|
1742
|
+
// CRITICAL WARNING: YOU MUST RUN SETUP TO CUSTOMIZE!
|
|
1743
|
+
// ============================================================================
|
|
1744
|
+
console.log(`
|
|
1745
|
+
${c.red}${c.bright}╔═══════════════════════════════════════════════════════════════════════════════╗
|
|
1746
|
+
║ ⚠️ IMPORTANT: RUN SETUP FIRST! ⚠️ ║
|
|
1747
|
+
╠═══════════════════════════════════════════════════════════════════════════════╣${c.reset}
|
|
1748
|
+
${c.red}║${c.reset} ${c.red}║${c.reset}
|
|
1749
|
+
${c.red}║${c.reset} If you skip ${c.cyan}specmem setup${c.reset}, the following ${c.yellow}DEFAULTS${c.reset} will be applied: ${c.red}║${c.reset}
|
|
1750
|
+
${c.red}║${c.reset} ${c.red}║${c.reset}
|
|
1751
|
+
${c.red}║${c.reset} ${c.bright}DATABASE:${c.reset} ${c.red}║${c.reset}
|
|
1752
|
+
${c.red}║${c.reset} • Host: ${c.cyan}localhost:5432${c.reset} ${c.red}║${c.reset}
|
|
1753
|
+
${c.red}║${c.reset} • Database: ${c.cyan}specmem_westayunprofessional${c.reset} ${c.red}║${c.reset}
|
|
1754
|
+
${c.red}║${c.reset} • User: ${c.cyan}specmem_westayunprofessional${c.reset} ${c.red}║${c.reset}
|
|
1755
|
+
${c.red}║${c.reset} • Password: ${c.cyan}specmem_westayunprofessional${c.reset} ${c.red}║${c.reset}
|
|
1756
|
+
${c.red}║${c.reset} ${c.red}║${c.reset}
|
|
1757
|
+
${c.red}║${c.reset} ${c.bright}HOOKS (auto-installed to ~/.claude/hooks/):${c.reset} ${c.red}║${c.reset}
|
|
1758
|
+
${c.red}║${c.reset} • specmem-drilldown-hook.js (UserPromptSubmit, 30s timeout) ${c.red}║${c.reset}
|
|
1759
|
+
${c.red}║${c.reset} • input-aware-improver.js (UserPromptSubmit, 5s timeout) ${c.red}║${c.reset}
|
|
1760
|
+
${c.red}║${c.reset} • agent-loading-hook.js (PreToolUse:Task, 10s timeout) ${c.red}║${c.reset}
|
|
1761
|
+
${c.red}║${c.reset} • smart-context-hook.js (PreToolUse:Grep/Glob/Read, 8s timeout) ${c.red}║${c.reset}
|
|
1762
|
+
${c.red}║${c.reset} • specmem-session-start.cjs (SessionStart, 30s timeout) ${c.red}║${c.reset}
|
|
1763
|
+
${c.red}║${c.reset} • specmem-precompact.js (PreCompact, 60s timeout) ${c.red}║${c.reset}
|
|
1764
|
+
${c.red}║${c.reset} • task-progress-hook.js (PostToolUse:Task, 10s timeout) ${c.red}║${c.reset}
|
|
1765
|
+
${c.red}║${c.reset} • subagent-loading-hook.js (SubagentStart/Stop, 5s timeout) ${c.red}║${c.reset}
|
|
1766
|
+
${c.red}║${c.reset} ${c.red}║${c.reset}
|
|
1767
|
+
${c.red}║${c.reset} ${c.bright}MCP SERVER:${c.reset} ${c.red}║${c.reset}
|
|
1768
|
+
${c.red}║${c.reset} • Command: ${c.cyan}node --max-old-space-size=250 bootstrap.cjs${c.reset} ${c.red}║${c.reset}
|
|
1769
|
+
${c.red}║${c.reset} • Project path: ${c.cyan}\${PWD}${c.reset} (current working directory) ${c.red}║${c.reset}
|
|
1770
|
+
${c.red}║${c.reset} ${c.red}║${c.reset}
|
|
1771
|
+
${c.red}║${c.reset} ${c.bright}PERMISSIONS (auto-granted in settings.json):${c.reset} ${c.red}║${c.reset}
|
|
1772
|
+
${c.red}║${c.reset} • mcp__specmem__* (all SpecMem MCP tools) ${c.red}║${c.reset}
|
|
1773
|
+
${c.red}║${c.reset} • Skill(specmem), Skill(specmem-*) ${c.red}║${c.reset}
|
|
1774
|
+
${c.red}║${c.reset} • Bash, Read, Write, Edit, Glob, Grep ${c.red}║${c.reset}
|
|
1775
|
+
${c.red}║${c.reset} ${c.red}║${c.reset}
|
|
1776
|
+
${c.red}║${c.reset} ${c.bright}EMBEDDING MODEL (downloaded on first use):${c.reset} ${c.red}║${c.reset}
|
|
1777
|
+
${c.red}║${c.reset} • sentence-transformers/all-MiniLM-L6-v2 (~90MB) ${c.red}║${c.reset}
|
|
1778
|
+
${c.red}║${c.reset} • ONNX + INT8 quantization for 2-4x faster inference ${c.red}║${c.reset}
|
|
1779
|
+
${c.red}║${c.reset} ${c.red}║${c.reset}
|
|
1780
|
+
${c.red}║${c.reset} ${c.bright}DOCKER:${c.reset} ${c.red}║${c.reset}
|
|
1781
|
+
${c.red}║${c.reset} • Auto-install if missing (Linux official script, Mac via Homebrew) ${c.red}║${c.reset}
|
|
1782
|
+
${c.red}║${c.reset} • Bound to 127.0.0.1 only (localhost, no external access) ${c.red}║${c.reset}
|
|
1783
|
+
${c.red}║${c.reset} • Memory limit: 2GB, CPU limit: 20% ${c.red}║${c.reset}
|
|
1784
|
+
${c.red}║${c.reset} ${c.red}║${c.reset}
|
|
1785
|
+
${c.red}${c.bright}╠═══════════════════════════════════════════════════════════════════════════════╣
|
|
1786
|
+
║ To customize these settings, run: ${c.cyan}specmem setup${c.reset}${c.red}${c.bright} ║
|
|
1787
|
+
╚═══════════════════════════════════════════════════════════════════════════════╝${c.reset}
|
|
1788
|
+
`);
|
|
1789
|
+
|
|
1790
|
+
// Give user a moment to read
|
|
1791
|
+
log.info('Proceeding with default configuration in 3 seconds...');
|
|
1792
|
+
log.info(`(Run ${c.cyan}specmem setup${c.reset} after install to customize)`);
|
|
1793
|
+
console.log('');
|
|
1794
|
+
|
|
1795
|
+
const results = {
|
|
1796
|
+
claudeCode: false,
|
|
1797
|
+
screen: false,
|
|
1798
|
+
postgres: false,
|
|
1799
|
+
pgvector: false,
|
|
1800
|
+
database: false,
|
|
1801
|
+
docker: false,
|
|
1802
|
+
hooks: false,
|
|
1803
|
+
commands: false,
|
|
1804
|
+
skills: false,
|
|
1805
|
+
plugins: false,
|
|
1806
|
+
settings: false
|
|
1807
|
+
};
|
|
1808
|
+
|
|
1809
|
+
try {
|
|
1810
|
+
// Step 0: Install ALL core system deps FIRST (python3, pip, screen, curl, git)
|
|
1811
|
+
installCoreDeps();
|
|
1812
|
+
|
|
1813
|
+
// Step 0a: Claude Code (REQUIRED)
|
|
1814
|
+
results.claudeCode = ensureClaudeCode();
|
|
1815
|
+
if (!results.claudeCode) {
|
|
1816
|
+
log.warn('Claude Code not installed - SpecMem requires Claude Code to function');
|
|
1817
|
+
log.info('Install manually: npm install -g @anthropic-ai/claude-code');
|
|
1818
|
+
}
|
|
1819
|
+
|
|
1820
|
+
// Step 0b: screen (needed for team members) - should already be installed by installCoreDeps
|
|
1821
|
+
results.screen = ensureScreen();
|
|
1822
|
+
|
|
1823
|
+
// Step 1: PostgreSQL
|
|
1824
|
+
const pgStatus = checkPostgres();
|
|
1825
|
+
if (pgStatus === true) {
|
|
1826
|
+
results.postgres = true;
|
|
1827
|
+
} else {
|
|
1828
|
+
results.postgres = installPostgres();
|
|
1829
|
+
}
|
|
1830
|
+
|
|
1831
|
+
// Step 2: pgvector
|
|
1832
|
+
if (results.postgres) {
|
|
1833
|
+
if (!checkPgvector()) {
|
|
1834
|
+
installPgvector();
|
|
1835
|
+
}
|
|
1836
|
+
results.pgvector = true;
|
|
1837
|
+
}
|
|
1838
|
+
|
|
1839
|
+
// Step 3: Database setup
|
|
1840
|
+
if (results.postgres) {
|
|
1841
|
+
results.database = setupDatabase();
|
|
1842
|
+
}
|
|
1843
|
+
|
|
1844
|
+
// Step 4: Docker
|
|
1845
|
+
results.docker = setupDocker();
|
|
1846
|
+
|
|
1847
|
+
// Step 4b: Load embedded Docker images (if packaged)
|
|
1848
|
+
if (results.docker) {
|
|
1849
|
+
loadEmbeddedDockerImages();
|
|
1850
|
+
// Step 4c: Build/setup embedding image
|
|
1851
|
+
setupEmbeddingImage();
|
|
1852
|
+
}
|
|
1853
|
+
|
|
1854
|
+
// Step 5: Global directories
|
|
1855
|
+
setupGlobalDirs();
|
|
1856
|
+
|
|
1857
|
+
// Step 6: Environment template + agent config
|
|
1858
|
+
createEnvTemplate();
|
|
1859
|
+
copyAgentConfig();
|
|
1860
|
+
|
|
1861
|
+
// Step 7: hooks
|
|
1862
|
+
installHooks();
|
|
1863
|
+
results.hooks = true;
|
|
1864
|
+
|
|
1865
|
+
// Step 8: SpecMem commands (slash commands)
|
|
1866
|
+
const cmdResult = installCommands();
|
|
1867
|
+
results.commands = cmdResult.installed;
|
|
1868
|
+
|
|
1869
|
+
// Step 8b: SpecMem skills (specialized prompts)
|
|
1870
|
+
const skillResult = installSkills();
|
|
1871
|
+
results.skills = skillResult.installed;
|
|
1872
|
+
|
|
1873
|
+
// Step 8c: SpecMem plugins (agent definitions)
|
|
1874
|
+
const pluginResult = installPlugins();
|
|
1875
|
+
results.plugins = pluginResult.installed;
|
|
1876
|
+
|
|
1877
|
+
// Step 9: settings (with Skill permissions)
|
|
1878
|
+
configureSettings();
|
|
1879
|
+
results.settings = true;
|
|
1880
|
+
|
|
1881
|
+
// Summary
|
|
1882
|
+
log.header('Installation Summary');
|
|
1883
|
+
|
|
1884
|
+
console.log(`
|
|
1885
|
+
${results.postgres ? c.green + '✓' : c.red + '✗'}${c.reset} PostgreSQL ${results.postgres ? 'Installed & Running' : 'FAILED - Install manually'}
|
|
1886
|
+
${results.pgvector ? c.green + '✓' : c.yellow + '⚠'}${c.reset} pgvector ${results.pgvector ? 'Available' : 'May need manual install'}
|
|
1887
|
+
${results.database ? c.green + '✓' : c.red + '✗'}${c.reset} Database ${results.database ? 'Created & Configured' : 'FAILED'}
|
|
1888
|
+
${results.docker ? c.green + '✓' : c.yellow + '⚠'}${c.reset} Docker ${results.docker ? 'Available' : 'Not found - embeddings limited'}
|
|
1889
|
+
${results.hooks ? c.green + '✓' : c.red + '✗'}${c.reset} Hooks ${results.hooks ? 'Installed' : 'FAILED'}
|
|
1890
|
+
${results.commands ? c.green + '✓' : c.red + '✗'}${c.reset} Commands ${results.commands ? 'Installed (/specmem-*)' : 'FAILED'}
|
|
1891
|
+
${results.skills ? c.green + '✓' : c.red + '✗'}${c.reset} Skills ${results.skills ? 'Installed (specialized prompts)' : 'FAILED'}
|
|
1892
|
+
${results.plugins ? c.green + '✓' : c.yellow + '⚠'}${c.reset} Plugins ${results.plugins ? 'Installed (agent definitions)' : 'None bundled'}
|
|
1893
|
+
${results.settings ? c.green + '✓' : c.red + '✗'}${c.reset} Settings ${results.settings ? 'Configured (with Skill perms)' : 'FAILED'}
|
|
1894
|
+
`);
|
|
1895
|
+
|
|
1896
|
+
console.log(`
|
|
1897
|
+
${c.green}${c.bright}Installation Complete!${c.reset}
|
|
1898
|
+
|
|
1899
|
+
${c.bright}Next steps:${c.reset}
|
|
1900
|
+
1. Navigate to your project: ${c.cyan}cd /path/to/your/project${c.reset}
|
|
1901
|
+
2. Run the full init: ${c.cyan}specmem-init${c.reset}
|
|
1902
|
+
- Analyzes your project (Small/Medium/Large tier)
|
|
1903
|
+
- Optimizes model settings based on project size
|
|
1904
|
+
- Configures embedding timeouts and cache
|
|
1905
|
+
- Compresses commands with token optimization
|
|
1906
|
+
- Deploys to global and per-project locations
|
|
1907
|
+
3. Start Code - SpecMem auto-injects context!
|
|
1908
|
+
|
|
1909
|
+
${c.bright}Commands:${c.reset}
|
|
1910
|
+
${c.cyan}specmem-init${c.reset} Full project initialization with loading bars
|
|
1911
|
+
${c.cyan}specmem start${c.reset} Start services manually
|
|
1912
|
+
${c.cyan}specmem status${c.reset} Check health
|
|
1913
|
+
${c.cyan}specmem doctor${c.reset} Diagnose issues
|
|
1914
|
+
|
|
1915
|
+
${c.bright}Database:${c.reset}
|
|
1916
|
+
Host: ${DB_CONFIG.host}:${DB_CONFIG.port}
|
|
1917
|
+
Database: ${DB_CONFIG.name}
|
|
1918
|
+
User: ${DB_CONFIG.user}
|
|
1919
|
+
|
|
1920
|
+
${c.yellow}Need help?${c.reset} https://justcalljon.pro
|
|
1921
|
+
`);
|
|
1922
|
+
|
|
1923
|
+
// Offer to run specmem-init if we're in a project directory (not npm's cache)
|
|
1924
|
+
const cwd = process.cwd();
|
|
1925
|
+
const isProjectDir = fs.existsSync(path.join(cwd, 'package.json')) ||
|
|
1926
|
+
fs.existsSync(path.join(cwd, '.git')) ||
|
|
1927
|
+
fs.existsSync(path.join(cwd, 'src'));
|
|
1928
|
+
|
|
1929
|
+
if (isProjectDir && !cwd.includes('node_modules') && !cwd.includes('.npm')) {
|
|
1930
|
+
log.info(`Detected project directory: ${cwd}`);
|
|
1931
|
+
log.info(`Running ${c.cyan}specmem-init${c.reset} for this project...`);
|
|
1932
|
+
console.log('');
|
|
1933
|
+
|
|
1934
|
+
try {
|
|
1935
|
+
const initScript = path.join(SPECMEM_PKG_DIR, 'scripts', 'specmem-init.cjs');
|
|
1936
|
+
if (fs.existsSync(initScript)) {
|
|
1937
|
+
run(`node "${initScript}"`, { silent: false });
|
|
1938
|
+
}
|
|
1939
|
+
} catch (e) {
|
|
1940
|
+
log.warn(`specmem-init failed: ${e.message}`);
|
|
1941
|
+
log.info(`Run ${c.cyan}specmem-init${c.reset} manually to complete setup`);
|
|
1942
|
+
}
|
|
1943
|
+
}
|
|
1944
|
+
|
|
1945
|
+
} catch (error) {
|
|
1946
|
+
log.error(`Installation failed: ${error.message}`);
|
|
1947
|
+
console.error(error);
|
|
1948
|
+
process.exit(1);
|
|
1949
|
+
}
|
|
1950
|
+
}
|
|
1951
|
+
|
|
1952
|
+
// Run if called directly
|
|
1953
|
+
if (require.main === module) {
|
|
1954
|
+
main();
|
|
1955
|
+
}
|
|
1956
|
+
|
|
1957
|
+
module.exports = { main };
|