claude-code-workflow 6.1.3 → 6.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +145 -274
- package/bin/ccw-mcp.js +7 -0
- package/bin/ccw.js +10 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +219 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/cli.d.ts +32 -0
- package/dist/commands/cli.d.ts.map +1 -0
- package/dist/commands/cli.js +619 -0
- package/dist/commands/cli.js.map +1 -0
- package/dist/commands/core-memory.d.ts +32 -0
- package/dist/commands/core-memory.d.ts.map +1 -0
- package/dist/commands/core-memory.js +640 -0
- package/dist/commands/core-memory.js.map +1 -0
- package/dist/commands/hook.d.ts +16 -0
- package/dist/commands/hook.d.ts.map +1 -0
- package/dist/commands/hook.js +276 -0
- package/dist/commands/hook.js.map +1 -0
- package/dist/commands/install.d.ts +12 -0
- package/dist/commands/install.d.ts.map +1 -0
- package/dist/commands/install.js +443 -0
- package/dist/commands/install.js.map +1 -0
- package/dist/commands/list.d.ts +5 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +32 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/memory.d.ts +57 -0
- package/dist/commands/memory.d.ts.map +1 -0
- package/dist/commands/memory.js +890 -0
- package/dist/commands/memory.js.map +1 -0
- package/dist/commands/serve.d.ts +12 -0
- package/dist/commands/serve.d.ts.map +1 -0
- package/dist/commands/serve.js +63 -0
- package/dist/commands/serve.js.map +1 -0
- package/dist/commands/session-path-resolver.d.ts +45 -0
- package/dist/commands/session-path-resolver.d.ts.map +1 -0
- package/dist/commands/session-path-resolver.js +302 -0
- package/dist/commands/session-path-resolver.js.map +1 -0
- package/dist/commands/session.d.ts +12 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +954 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/stop.d.ts +11 -0
- package/dist/commands/stop.d.ts.map +1 -0
- package/dist/commands/stop.js +96 -0
- package/dist/commands/stop.js.map +1 -0
- package/dist/commands/tool.d.ts +29 -0
- package/dist/commands/tool.d.ts.map +1 -0
- package/dist/commands/tool.js +173 -0
- package/dist/commands/tool.js.map +1 -0
- package/dist/commands/uninstall.d.ts +9 -0
- package/dist/commands/uninstall.d.ts.map +1 -0
- package/dist/commands/uninstall.js +239 -0
- package/dist/commands/uninstall.js.map +1 -0
- package/dist/commands/upgrade.d.ts +10 -0
- package/dist/commands/upgrade.d.ts.map +1 -0
- package/dist/commands/upgrade.js +288 -0
- package/dist/commands/upgrade.js.map +1 -0
- package/dist/commands/view.d.ts +14 -0
- package/dist/commands/view.d.ts.map +1 -0
- package/dist/commands/view.js +100 -0
- package/dist/commands/view.js.map +1 -0
- package/dist/config/storage-paths.d.ts +184 -0
- package/dist/config/storage-paths.d.ts.map +1 -0
- package/dist/config/storage-paths.js +536 -0
- package/dist/config/storage-paths.js.map +1 -0
- package/dist/core/cache-manager.d.ts +80 -0
- package/dist/core/cache-manager.d.ts.map +1 -0
- package/dist/core/cache-manager.js +260 -0
- package/dist/core/cache-manager.js.map +1 -0
- package/dist/core/claude-freshness.d.ts +53 -0
- package/dist/core/claude-freshness.d.ts.map +1 -0
- package/dist/core/claude-freshness.js +232 -0
- package/dist/core/claude-freshness.js.map +1 -0
- package/dist/core/core-memory-store.d.ts +320 -0
- package/dist/core/core-memory-store.d.ts.map +1 -0
- package/dist/core/core-memory-store.js +1177 -0
- package/dist/core/core-memory-store.js.map +1 -0
- package/dist/core/dashboard-generator-patch.d.ts +2 -0
- package/dist/core/dashboard-generator-patch.d.ts.map +1 -0
- package/dist/core/dashboard-generator-patch.js +48 -0
- package/dist/core/dashboard-generator-patch.js.map +1 -0
- package/dist/core/dashboard-generator.d.ts +8 -0
- package/dist/core/dashboard-generator.d.ts.map +1 -0
- package/dist/core/dashboard-generator.js +695 -0
- package/dist/core/dashboard-generator.js.map +1 -0
- package/dist/core/data-aggregator.d.ts +145 -0
- package/dist/core/data-aggregator.d.ts.map +1 -0
- package/dist/core/data-aggregator.js +416 -0
- package/dist/core/data-aggregator.js.map +1 -0
- package/dist/core/history-importer.d.ts +102 -0
- package/dist/core/history-importer.d.ts.map +1 -0
- package/dist/core/history-importer.js +493 -0
- package/dist/core/history-importer.js.map +1 -0
- package/dist/core/lite-scanner-complete.d.ts +81 -0
- package/dist/core/lite-scanner-complete.d.ts.map +1 -0
- package/dist/core/lite-scanner-complete.js +368 -0
- package/dist/core/lite-scanner-complete.js.map +1 -0
- package/dist/core/lite-scanner.d.ts +81 -0
- package/dist/core/lite-scanner.d.ts.map +1 -0
- package/dist/core/lite-scanner.js +368 -0
- package/dist/core/lite-scanner.js.map +1 -0
- package/dist/core/manifest.d.ts +88 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +214 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/memory-embedder-bridge.d.ts +83 -0
- package/dist/core/memory-embedder-bridge.d.ts.map +1 -0
- package/dist/core/memory-embedder-bridge.js +181 -0
- package/dist/core/memory-embedder-bridge.js.map +1 -0
- package/dist/core/memory-store.d.ts +249 -0
- package/dist/core/memory-store.d.ts.map +1 -0
- package/dist/core/memory-store.js +781 -0
- package/dist/core/memory-store.js.map +1 -0
- package/dist/core/routes/ccw-routes.d.ts +20 -0
- package/dist/core/routes/ccw-routes.d.ts.map +1 -0
- package/dist/core/routes/ccw-routes.js +70 -0
- package/dist/core/routes/ccw-routes.js.map +1 -0
- package/dist/core/routes/claude-routes.d.ts +19 -0
- package/dist/core/routes/claude-routes.d.ts.map +1 -0
- package/dist/core/routes/claude-routes.js +1017 -0
- package/dist/core/routes/claude-routes.js.map +1 -0
- package/dist/core/routes/cli-routes.d.ts +20 -0
- package/dist/core/routes/cli-routes.d.ts.map +1 -0
- package/dist/core/routes/cli-routes.js +468 -0
- package/dist/core/routes/cli-routes.js.map +1 -0
- package/dist/core/routes/codexlens-routes.d.ts +20 -0
- package/dist/core/routes/codexlens-routes.d.ts.map +1 -0
- package/dist/core/routes/codexlens-routes.js +754 -0
- package/dist/core/routes/codexlens-routes.js.map +1 -0
- package/dist/core/routes/core-memory-routes.d.ts +21 -0
- package/dist/core/routes/core-memory-routes.d.ts.map +1 -0
- package/dist/core/routes/core-memory-routes.js +520 -0
- package/dist/core/routes/core-memory-routes.js.map +1 -0
- package/dist/core/routes/files-routes.d.ts +20 -0
- package/dist/core/routes/files-routes.d.ts.map +1 -0
- package/dist/core/routes/files-routes.js +374 -0
- package/dist/core/routes/files-routes.js.map +1 -0
- package/dist/core/routes/graph-routes.d.ts +20 -0
- package/dist/core/routes/graph-routes.d.ts.map +1 -0
- package/dist/core/routes/graph-routes.js +517 -0
- package/dist/core/routes/graph-routes.js.map +1 -0
- package/dist/core/routes/help-routes.d.ts +20 -0
- package/dist/core/routes/help-routes.d.ts.map +1 -0
- package/dist/core/routes/help-routes.js +250 -0
- package/dist/core/routes/help-routes.js.map +1 -0
- package/dist/core/routes/hooks-routes.d.ts +21 -0
- package/dist/core/routes/hooks-routes.d.ts.map +1 -0
- package/dist/core/routes/hooks-routes.js +346 -0
- package/dist/core/routes/hooks-routes.js.map +1 -0
- package/dist/core/routes/mcp-routes.d.ts +20 -0
- package/dist/core/routes/mcp-routes.d.ts.map +1 -0
- package/dist/core/routes/mcp-routes.js +1129 -0
- package/dist/core/routes/mcp-routes.js.map +1 -0
- package/dist/core/routes/mcp-templates-db.d.ts +54 -0
- package/dist/core/routes/mcp-templates-db.d.ts.map +1 -0
- package/dist/core/routes/mcp-templates-db.js +226 -0
- package/dist/core/routes/mcp-templates-db.js.map +1 -0
- package/dist/core/routes/memory-routes.d.ts +21 -0
- package/dist/core/routes/memory-routes.d.ts.map +1 -0
- package/dist/core/routes/memory-routes.js +1095 -0
- package/dist/core/routes/memory-routes.js.map +1 -0
- package/dist/core/routes/rules-routes.d.ts +20 -0
- package/dist/core/routes/rules-routes.d.ts.map +1 -0
- package/dist/core/routes/rules-routes.js +442 -0
- package/dist/core/routes/rules-routes.js.map +1 -0
- package/dist/core/routes/session-routes.d.ts +20 -0
- package/dist/core/routes/session-routes.d.ts.map +1 -0
- package/dist/core/routes/session-routes.js +423 -0
- package/dist/core/routes/session-routes.js.map +1 -0
- package/dist/core/routes/skills-routes.d.ts +20 -0
- package/dist/core/routes/skills-routes.d.ts.map +1 -0
- package/dist/core/routes/skills-routes.js +533 -0
- package/dist/core/routes/skills-routes.js.map +1 -0
- package/dist/core/routes/status-routes.d.ts +20 -0
- package/dist/core/routes/status-routes.d.ts.map +1 -0
- package/dist/core/routes/status-routes.js +38 -0
- package/dist/core/routes/status-routes.js.map +1 -0
- package/dist/core/routes/system-routes.d.ts +22 -0
- package/dist/core/routes/system-routes.d.ts.map +1 -0
- package/dist/core/routes/system-routes.js +354 -0
- package/dist/core/routes/system-routes.js.map +1 -0
- package/dist/core/server.d.ts +17 -0
- package/dist/core/server.d.ts.map +1 -0
- package/dist/core/server.js +386 -0
- package/dist/core/server.js.map +1 -0
- package/dist/core/session-clustering-service.d.ts +153 -0
- package/dist/core/session-clustering-service.d.ts.map +1 -0
- package/dist/core/session-clustering-service.js +1065 -0
- package/dist/core/session-clustering-service.js.map +1 -0
- package/dist/core/session-scanner.d.ts +32 -0
- package/dist/core/session-scanner.d.ts.map +1 -0
- package/dist/core/session-scanner.js +253 -0
- package/dist/core/session-scanner.js.map +1 -0
- package/dist/core/websocket.d.ts +23 -0
- package/dist/core/websocket.d.ts.map +1 -0
- package/dist/core/websocket.js +168 -0
- package/dist/core/websocket.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/mcp-server/index.d.ts +7 -0
- package/dist/mcp-server/index.d.ts.map +1 -0
- package/dist/mcp-server/index.js +157 -0
- package/dist/mcp-server/index.js.map +1 -0
- package/dist/tools/classify-folders.d.ts +26 -0
- package/dist/tools/classify-folders.d.ts.map +1 -0
- package/dist/tools/classify-folders.js +201 -0
- package/dist/tools/classify-folders.js.map +1 -0
- package/dist/tools/cli-config-manager.d.ts +62 -0
- package/dist/tools/cli-config-manager.d.ts.map +1 -0
- package/dist/tools/cli-config-manager.js +221 -0
- package/dist/tools/cli-config-manager.js.map +1 -0
- package/dist/tools/cli-executor.d.ts +373 -0
- package/dist/tools/cli-executor.d.ts.map +1 -0
- package/dist/tools/cli-executor.js +1625 -0
- package/dist/tools/cli-executor.js.map +1 -0
- package/dist/tools/cli-history-store.d.ts +330 -0
- package/dist/tools/cli-history-store.d.ts.map +1 -0
- package/dist/tools/cli-history-store.js +916 -0
- package/dist/tools/cli-history-store.js.map +1 -0
- package/dist/tools/codex-lens.d.ts +118 -0
- package/dist/tools/codex-lens.d.ts.map +1 -0
- package/dist/tools/codex-lens.js +962 -0
- package/dist/tools/codex-lens.js.map +1 -0
- package/dist/tools/convert-tokens-to-css.d.ts +14 -0
- package/dist/tools/convert-tokens-to-css.d.ts.map +1 -0
- package/dist/tools/convert-tokens-to-css.js +244 -0
- package/dist/tools/convert-tokens-to-css.js.map +1 -0
- package/dist/tools/core-memory.d.ts +66 -0
- package/dist/tools/core-memory.d.ts.map +1 -0
- package/dist/tools/core-memory.js +324 -0
- package/dist/tools/core-memory.js.map +1 -0
- package/dist/tools/detect-changed-modules.d.ts +24 -0
- package/dist/tools/detect-changed-modules.d.ts.map +1 -0
- package/dist/tools/detect-changed-modules.js +277 -0
- package/dist/tools/detect-changed-modules.js.map +1 -0
- package/dist/tools/discover-design-files.d.ts +36 -0
- package/dist/tools/discover-design-files.d.ts.map +1 -0
- package/dist/tools/discover-design-files.js +147 -0
- package/dist/tools/discover-design-files.js.map +1 -0
- package/dist/tools/edit-file.d.ts +28 -0
- package/dist/tools/edit-file.d.ts.map +1 -0
- package/dist/tools/edit-file.js +479 -0
- package/dist/tools/edit-file.js.map +1 -0
- package/dist/tools/generate-module-docs.d.ts +22 -0
- package/dist/tools/generate-module-docs.d.ts.map +1 -0
- package/dist/tools/generate-module-docs.js +379 -0
- package/dist/tools/generate-module-docs.js.map +1 -0
- package/dist/tools/get-modules-by-depth.d.ts +15 -0
- package/dist/tools/get-modules-by-depth.d.ts.map +1 -0
- package/dist/tools/get-modules-by-depth.js +296 -0
- package/dist/tools/get-modules-by-depth.js.map +1 -0
- package/dist/tools/index.d.ts +55 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +304 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/native-session-discovery.d.ts +97 -0
- package/dist/tools/native-session-discovery.d.ts.map +1 -0
- package/dist/tools/native-session-discovery.js +700 -0
- package/dist/tools/native-session-discovery.js.map +1 -0
- package/dist/tools/notifier.d.ts +50 -0
- package/dist/tools/notifier.d.ts.map +1 -0
- package/dist/tools/notifier.js +90 -0
- package/dist/tools/notifier.js.map +1 -0
- package/dist/tools/read-file.d.ts +32 -0
- package/dist/tools/read-file.d.ts.map +1 -0
- package/dist/tools/read-file.js +329 -0
- package/dist/tools/read-file.js.map +1 -0
- package/dist/tools/resume-strategy.d.ts +48 -0
- package/dist/tools/resume-strategy.d.ts.map +1 -0
- package/dist/tools/resume-strategy.js +248 -0
- package/dist/tools/resume-strategy.js.map +1 -0
- package/dist/tools/session-content-parser.d.ts +58 -0
- package/dist/tools/session-content-parser.d.ts.map +1 -0
- package/dist/tools/session-content-parser.js +420 -0
- package/dist/tools/session-content-parser.js.map +1 -0
- package/dist/tools/session-manager.d.ts +9 -0
- package/dist/tools/session-manager.d.ts.map +1 -0
- package/dist/tools/session-manager.js +834 -0
- package/dist/tools/session-manager.js.map +1 -0
- package/dist/tools/smart-context.d.ts +35 -0
- package/dist/tools/smart-context.d.ts.map +1 -0
- package/dist/tools/smart-context.js +182 -0
- package/dist/tools/smart-context.js.map +1 -0
- package/dist/tools/smart-search.d.ts +105 -0
- package/dist/tools/smart-search.d.ts.map +1 -0
- package/dist/tools/smart-search.js +1753 -0
- package/dist/tools/smart-search.js.map +1 -0
- package/dist/tools/storage-manager.d.ts +114 -0
- package/dist/tools/storage-manager.d.ts.map +1 -0
- package/dist/tools/storage-manager.js +392 -0
- package/dist/tools/storage-manager.js.map +1 -0
- package/dist/tools/ui-generate-preview.d.ts +39 -0
- package/dist/tools/ui-generate-preview.d.ts.map +1 -0
- package/dist/tools/ui-generate-preview.js +300 -0
- package/dist/tools/ui-generate-preview.js.map +1 -0
- package/dist/tools/ui-instantiate-prototypes.d.ts +75 -0
- package/dist/tools/ui-instantiate-prototypes.d.ts.map +1 -0
- package/dist/tools/ui-instantiate-prototypes.js +256 -0
- package/dist/tools/ui-instantiate-prototypes.js.map +1 -0
- package/dist/tools/update-module-claude.d.ts +80 -0
- package/dist/tools/update-module-claude.d.ts.map +1 -0
- package/dist/tools/update-module-claude.js +351 -0
- package/dist/tools/update-module-claude.js.map +1 -0
- package/dist/tools/write-file.d.ts +19 -0
- package/dist/tools/write-file.d.ts.map +1 -0
- package/dist/tools/write-file.js +193 -0
- package/dist/tools/write-file.js.map +1 -0
- package/dist/types/config.d.ts +11 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +2 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +4 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/session.d.ts +20 -0
- package/dist/types/session.d.ts.map +1 -0
- package/dist/types/session.js +2 -0
- package/dist/types/session.js.map +1 -0
- package/dist/types/tool.d.ts +36 -0
- package/dist/types/tool.d.ts.map +1 -0
- package/dist/types/tool.js +11 -0
- package/dist/types/tool.js.map +1 -0
- package/dist/utils/browser-launcher.d.ts +13 -0
- package/dist/utils/browser-launcher.d.ts.map +1 -0
- package/dist/utils/browser-launcher.js +60 -0
- package/dist/utils/browser-launcher.js.map +1 -0
- package/dist/utils/file-utils.d.ts +25 -0
- package/dist/utils/file-utils.d.ts.map +1 -0
- package/dist/utils/file-utils.js +48 -0
- package/dist/utils/file-utils.js.map +1 -0
- package/dist/utils/path-resolver.d.ts +80 -0
- package/dist/utils/path-resolver.d.ts.map +1 -0
- package/dist/utils/path-resolver.js +260 -0
- package/dist/utils/path-resolver.js.map +1 -0
- package/dist/utils/path-validator.d.ts +49 -0
- package/dist/utils/path-validator.d.ts.map +1 -0
- package/dist/utils/path-validator.js +123 -0
- package/dist/utils/path-validator.js.map +1 -0
- package/dist/utils/ui.d.ts +62 -0
- package/dist/utils/ui.d.ts.map +1 -0
- package/dist/utils/ui.js +129 -0
- package/dist/utils/ui.js.map +1 -0
- package/package.json +65 -67
- package/src/.workflow/.cli-history/history.db +0 -0
- package/src/.workflow/.cli-history/history.db-shm +0 -0
- package/src/.workflow/.cli-history/history.db-wal +0 -0
- package/src/cli.ts +244 -0
- package/src/commands/cli.ts +740 -0
- package/src/commands/core-memory.ts +770 -0
- package/src/commands/hook.ts +315 -0
- package/src/commands/install.ts +519 -0
- package/src/commands/list.ts +37 -0
- package/src/commands/memory.ts +1090 -0
- package/src/commands/serve.ts +76 -0
- package/src/commands/session-path-resolver.ts +372 -0
- package/src/commands/session.ts +1141 -0
- package/src/commands/stop.ts +111 -0
- package/src/commands/tool.ts +201 -0
- package/src/commands/uninstall.ts +287 -0
- package/src/commands/upgrade.ts +352 -0
- package/src/commands/view.ts +119 -0
- package/src/config/storage-paths.ts +670 -0
- package/src/core/cache-manager.ts +294 -0
- package/src/core/claude-freshness.ts +319 -0
- package/src/core/core-memory-store.ts +1528 -0
- package/src/core/dashboard-generator-patch.ts +47 -0
- package/src/core/dashboard-generator.ts +739 -0
- package/src/core/data-aggregator.ts +584 -0
- package/src/core/history-importer.ts +625 -0
- package/src/core/lite-scanner-complete.ts +469 -0
- package/src/core/lite-scanner.ts +469 -0
- package/src/core/manifest.ts +271 -0
- package/src/core/memory-embedder-bridge.ts +262 -0
- package/src/core/memory-store.ts +978 -0
- package/src/core/routes/ccw-routes.ts +96 -0
- package/src/core/routes/claude-routes.ts +1183 -0
- package/src/core/routes/cli-routes.ts +561 -0
- package/src/core/routes/codexlens-routes.ts +806 -0
- package/src/core/routes/core-memory-routes.ts +605 -0
- package/src/core/routes/files-routes.ts +428 -0
- package/src/core/routes/graph-routes.md +164 -0
- package/src/core/routes/graph-routes.ts +626 -0
- package/src/core/routes/help-routes.ts +308 -0
- package/src/core/routes/hooks-routes.ts +405 -0
- package/src/core/routes/mcp-routes.ts +1271 -0
- package/src/core/routes/mcp-routes.ts.backup +550 -0
- package/src/core/routes/mcp-templates-db.ts +268 -0
- package/src/core/routes/memory-routes.ts +1206 -0
- package/src/core/routes/rules-routes.ts +526 -0
- package/src/core/routes/session-routes.ts +467 -0
- package/src/core/routes/skills-routes.ts +599 -0
- package/src/core/routes/status-routes.ts +57 -0
- package/src/core/routes/system-routes.ts +427 -0
- package/src/core/server.ts +431 -0
- package/src/core/session-clustering-service.ts +1258 -0
- package/src/core/session-scanner.ts +283 -0
- package/src/core/websocket.ts +190 -0
- package/src/index.ts +10 -0
- package/src/mcp-server/index.ts +186 -0
- package/src/templates/assets/css/github-dark.min.css +10 -0
- package/src/templates/assets/css/github.min.css +10 -0
- package/src/templates/assets/js/cytoscape.min.js +32 -0
- package/src/templates/assets/js/d3.min.js +2 -0
- package/src/templates/assets/js/highlight.min.js +1244 -0
- package/src/templates/assets/js/lucide.min.js +12 -0
- package/src/templates/assets/js/marked.min.js +69 -0
- package/src/templates/assets/js/tailwind.js +83 -0
- package/src/templates/dashboard-css/01-base.css +302 -0
- package/src/templates/dashboard-css/02-session.css +748 -0
- package/src/templates/dashboard-css/04-lite-tasks.css +1181 -0
- package/src/templates/dashboard-css/06-cards.css +1576 -0
- package/src/templates/dashboard-css/07-managers.css +2107 -0
- package/src/templates/dashboard-css/09-explorer.css +1408 -0
- package/src/templates/dashboard-css/10-cli-status.css +337 -0
- package/src/templates/dashboard-css/11-cli-history.css +271 -0
- package/src/templates/dashboard-css/12-cli-legacy.css +796 -0
- package/src/templates/dashboard-css/13-cli-ccw.css +199 -0
- package/src/templates/dashboard-css/14-cli-modals.css +258 -0
- package/src/templates/dashboard-css/15-cli-endpoints.css +305 -0
- package/src/templates/dashboard-css/16-cli-session.css +241 -0
- package/src/templates/dashboard-css/17-cli-conversation.css +283 -0
- package/src/templates/dashboard-css/18-cli-settings.css +160 -0
- package/src/templates/dashboard-css/19-cli-native-session.css +496 -0
- package/src/templates/dashboard-css/20-cli-taskqueue.css +188 -0
- package/src/templates/dashboard-css/21-cli-toolmgmt.css +310 -0
- package/src/templates/dashboard-css/22-cli-semantic.css +240 -0
- package/src/templates/dashboard-css/23-memory.css +2390 -0
- package/src/templates/dashboard-css/24-prompt-history.css +1089 -0
- package/src/templates/dashboard-css/25-skills-rules.css +326 -0
- package/src/templates/dashboard-css/26-claude-manager.css +908 -0
- package/src/templates/dashboard-css/27-graph-explorer.css +1678 -0
- package/src/templates/dashboard-css/28-mcp-manager.css +748 -0
- package/src/templates/dashboard-css/29-help.css +264 -0
- package/src/templates/dashboard-css/30-core-memory.css +1700 -0
- package/src/templates/dashboard-js/api.js +220 -0
- package/src/templates/dashboard-js/components/carousel.js +398 -0
- package/src/templates/dashboard-js/components/cli-history.js +876 -0
- package/src/templates/dashboard-js/components/cli-status.js +978 -0
- package/src/templates/dashboard-js/components/global-notifications.js +508 -0
- package/src/templates/dashboard-js/components/hook-manager.js +1278 -0
- package/src/templates/dashboard-js/components/index-manager.js +302 -0
- package/src/templates/dashboard-js/components/mcp-manager.js +1219 -0
- package/src/templates/dashboard-js/components/modals.js +326 -0
- package/src/templates/dashboard-js/components/navigation.js +313 -0
- package/src/templates/dashboard-js/components/notifications.js +758 -0
- package/src/templates/dashboard-js/components/storage-manager.js +478 -0
- package/src/templates/dashboard-js/components/tabs-other.js +424 -0
- package/src/templates/dashboard-js/components/task-queue-sidebar.js +716 -0
- package/src/templates/dashboard-js/help-i18n.js +272 -0
- package/src/templates/dashboard-js/i18n.js +2807 -0
- package/src/templates/dashboard-js/main.js +87 -0
- package/src/templates/dashboard-js/state.js +243 -0
- package/src/templates/dashboard-js/utils.js +199 -0
- package/src/templates/dashboard-js/views/claude-manager.js +912 -0
- package/src/templates/dashboard-js/views/cli-manager.js +2272 -0
- package/src/templates/dashboard-js/views/codexlens-manager.js +964 -0
- package/src/templates/dashboard-js/views/core-memory-clusters.js +503 -0
- package/src/templates/dashboard-js/views/core-memory.js +782 -0
- package/src/templates/dashboard-js/views/explorer.js +888 -0
- package/src/templates/dashboard-js/views/graph-explorer.js +1157 -0
- package/src/templates/dashboard-js/views/help.js +856 -0
- package/src/templates/dashboard-js/views/history.js +337 -0
- package/src/templates/dashboard-js/views/home.js +243 -0
- package/src/templates/dashboard-js/views/hook-manager.js +660 -0
- package/src/templates/dashboard-js/views/lite-tasks.js +861 -0
- package/src/templates/dashboard-js/views/mcp-manager.js +2187 -0
- package/src/templates/dashboard-js/views/mcp-manager.js.backup +1729 -0
- package/src/templates/dashboard-js/views/mcp-manager.js.new +928 -0
- package/src/templates/dashboard-js/views/memory.js +1221 -0
- package/src/templates/dashboard-js/views/prompt-history.js +713 -0
- package/src/templates/dashboard-js/views/rules-manager.js +828 -0
- package/src/templates/dashboard-js/views/session-detail.js +781 -0
- package/src/templates/dashboard-js/views/skills-manager.js +819 -0
- package/src/templates/dashboard.html +831 -0
- package/src/templates/hooks-config-example.json +60 -0
- package/src/tools/classify-folders.ts +245 -0
- package/src/tools/cli-config-manager.ts +268 -0
- package/src/tools/cli-executor.ts +2014 -0
- package/src/tools/cli-history-store.ts +1195 -0
- package/src/tools/codex-lens.ts +1141 -0
- package/src/tools/convert-tokens-to-css.ts +300 -0
- package/src/tools/core-memory.ts +444 -0
- package/src/tools/detect-changed-modules.ts +325 -0
- package/src/tools/discover-design-files.ts +184 -0
- package/src/tools/edit-file.ts +568 -0
- package/src/tools/generate-module-docs.ts +438 -0
- package/src/tools/get-modules-by-depth.ts +349 -0
- package/src/tools/index.ts +370 -0
- package/src/tools/native-session-discovery.ts +795 -0
- package/src/tools/notifier.ts +129 -0
- package/src/tools/read-file.ts +410 -0
- package/src/tools/resume-strategy.ts +345 -0
- package/src/tools/session-content-parser.ts +619 -0
- package/src/tools/session-manager.ts +1026 -0
- package/src/tools/smart-context.ts +228 -0
- package/src/tools/smart-search.ts +2065 -0
- package/src/tools/smart-search.ts.backup +1233 -0
- package/src/tools/storage-manager.ts +455 -0
- package/src/tools/write-file.ts +222 -0
- package/src/types/config.ts +11 -0
- package/src/types/index.ts +3 -0
- package/src/types/session.ts +25 -0
- package/src/types/tool.ts +41 -0
- package/src/utils/browser-launcher.ts +62 -0
- package/src/utils/file-utils.ts +48 -0
- package/src/utils/path-resolver.ts +315 -0
- package/src/utils/path-validator.ts +153 -0
- package/src/utils/ui.ts +155 -0
- package/.claude/agents/action-planning-agent.md +0 -778
- package/.claude/agents/cli-execution-agent.md +0 -270
- package/.claude/agents/cli-explore-agent.md +0 -182
- package/.claude/agents/cli-lite-planning-agent.md +0 -396
- package/.claude/agents/cli-planning-agent.md +0 -558
- package/.claude/agents/code-developer.md +0 -310
- package/.claude/agents/conceptual-planning-agent.md +0 -308
- package/.claude/agents/context-search-agent.md +0 -582
- package/.claude/agents/doc-generator.md +0 -330
- package/.claude/agents/memory-bridge.md +0 -94
- package/.claude/agents/test-context-search-agent.md +0 -399
- package/.claude/agents/test-fix-agent.md +0 -343
- package/.claude/agents/ui-design-agent.md +0 -593
- package/.claude/agents/universal-executor.md +0 -131
- package/.claude/commands/cli/cli-init.md +0 -440
- package/.claude/commands/enhance-prompt.md +0 -93
- package/.claude/commands/memory/code-map-memory.md +0 -687
- package/.claude/commands/memory/docs-full-cli.md +0 -471
- package/.claude/commands/memory/docs-related-cli.md +0 -386
- package/.claude/commands/memory/docs.md +0 -615
- package/.claude/commands/memory/load-skill-memory.md +0 -182
- package/.claude/commands/memory/load.md +0 -240
- package/.claude/commands/memory/skill-memory.md +0 -525
- package/.claude/commands/memory/style-skill-memory.md +0 -396
- package/.claude/commands/memory/tech-research.md +0 -477
- package/.claude/commands/memory/update-full.md +0 -332
- package/.claude/commands/memory/update-related.md +0 -332
- package/.claude/commands/memory/workflow-skill-memory.md +0 -517
- package/.claude/commands/task/breakdown.md +0 -204
- package/.claude/commands/task/create.md +0 -152
- package/.claude/commands/task/execute.md +0 -270
- package/.claude/commands/task/replan.md +0 -437
- package/.claude/commands/version.md +0 -254
- package/.claude/commands/workflow/action-plan-verify.md +0 -447
- package/.claude/commands/workflow/brainstorm/api-designer.md +0 -585
- package/.claude/commands/workflow/brainstorm/artifacts.md +0 -452
- package/.claude/commands/workflow/brainstorm/auto-parallel.md +0 -443
- package/.claude/commands/workflow/brainstorm/data-architect.md +0 -220
- package/.claude/commands/workflow/brainstorm/product-manager.md +0 -200
- package/.claude/commands/workflow/brainstorm/product-owner.md +0 -200
- package/.claude/commands/workflow/brainstorm/scrum-master.md +0 -200
- package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
- package/.claude/commands/workflow/brainstorm/synthesis.md +0 -398
- package/.claude/commands/workflow/brainstorm/system-architect.md +0 -387
- package/.claude/commands/workflow/brainstorm/ui-designer.md +0 -221
- package/.claude/commands/workflow/brainstorm/ux-expert.md +0 -221
- package/.claude/commands/workflow/execute.md +0 -460
- package/.claude/commands/workflow/init.md +0 -164
- package/.claude/commands/workflow/lite-execute.md +0 -686
- package/.claude/commands/workflow/lite-fix.md +0 -621
- package/.claude/commands/workflow/lite-plan.md +0 -592
- package/.claude/commands/workflow/plan.md +0 -551
- package/.claude/commands/workflow/replan.md +0 -515
- package/.claude/commands/workflow/review-fix.md +0 -606
- package/.claude/commands/workflow/review-module-cycle.md +0 -765
- package/.claude/commands/workflow/review-session-cycle.md +0 -776
- package/.claude/commands/workflow/review.md +0 -291
- package/.claude/commands/workflow/session/complete.md +0 -500
- package/.claude/commands/workflow/session/list.md +0 -96
- package/.claude/commands/workflow/session/resume.md +0 -61
- package/.claude/commands/workflow/session/start.md +0 -200
- package/.claude/commands/workflow/tdd-plan.md +0 -460
- package/.claude/commands/workflow/tdd-verify.md +0 -386
- package/.claude/commands/workflow/test-cycle-execute.md +0 -498
- package/.claude/commands/workflow/test-fix-gen.md +0 -699
- package/.claude/commands/workflow/test-gen.md +0 -529
- package/.claude/commands/workflow/tools/conflict-resolution.md +0 -680
- package/.claude/commands/workflow/tools/context-gather.md +0 -434
- package/.claude/commands/workflow/tools/task-generate-agent.md +0 -291
- package/.claude/commands/workflow/tools/task-generate-tdd.md +0 -518
- package/.claude/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
- package/.claude/commands/workflow/tools/test-concept-enhanced.md +0 -163
- package/.claude/commands/workflow/tools/test-context-gather.md +0 -235
- package/.claude/commands/workflow/tools/test-task-generate.md +0 -256
- package/.claude/commands/workflow/ui-design/animation-extract.md +0 -1150
- package/.claude/commands/workflow/ui-design/codify-style.md +0 -652
- package/.claude/commands/workflow/ui-design/design-sync.md +0 -454
- package/.claude/commands/workflow/ui-design/explore-auto.md +0 -678
- package/.claude/commands/workflow/ui-design/generate.md +0 -504
- package/.claude/commands/workflow/ui-design/imitate-auto.md +0 -745
- package/.claude/commands/workflow/ui-design/import-from-code.md +0 -537
- package/.claude/commands/workflow/ui-design/layout-extract.md +0 -788
- package/.claude/commands/workflow/ui-design/reference-page-generator.md +0 -356
- package/.claude/commands/workflow/ui-design/style-extract.md +0 -773
- package/.claude/scripts/classify-folders.sh +0 -39
- package/.claude/scripts/convert_tokens_to_css.sh +0 -229
- package/.claude/scripts/detect_changed_modules.sh +0 -161
- package/.claude/scripts/discover-design-files.sh +0 -87
- package/.claude/scripts/extract-animations.js +0 -243
- package/.claude/scripts/extract-computed-styles.js +0 -118
- package/.claude/scripts/extract-layout-structure.js +0 -411
- package/.claude/scripts/generate_module_docs.sh +0 -717
- package/.claude/scripts/get_modules_by_depth.sh +0 -170
- package/.claude/scripts/ui-generate-preview.sh +0 -395
- package/.claude/scripts/ui-instantiate-prototypes.sh +0 -815
- package/.claude/scripts/update_module_claude.sh +0 -337
- package/.claude/skills/command-guide/SKILL.md +0 -388
- package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +0 -592
- package/.claude/skills/command-guide/guides/cli-tools-guide.md +0 -410
- package/.claude/skills/command-guide/guides/examples.md +0 -537
- package/.claude/skills/command-guide/guides/getting-started.md +0 -242
- package/.claude/skills/command-guide/guides/implementation-details.md +0 -1010
- package/.claude/skills/command-guide/guides/index-structure.md +0 -326
- package/.claude/skills/command-guide/guides/troubleshooting.md +0 -92
- package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +0 -316
- package/.claude/skills/command-guide/guides/workflow-patterns.md +0 -662
- package/.claude/skills/command-guide/index/all-commands.json +0 -772
- package/.claude/skills/command-guide/index/by-category.json +0 -800
- package/.claude/skills/command-guide/index/by-use-case.json +0 -786
- package/.claude/skills/command-guide/index/command-relationships.json +0 -307
- package/.claude/skills/command-guide/index/essential-commands.json +0 -112
- package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -778
- package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -270
- package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +0 -182
- package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +0 -396
- package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
- package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -310
- package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +0 -308
- package/.claude/skills/command-guide/reference/agents/context-search-agent.md +0 -582
- package/.claude/skills/command-guide/reference/agents/doc-generator.md +0 -330
- package/.claude/skills/command-guide/reference/agents/memory-bridge.md +0 -94
- package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +0 -399
- package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -343
- package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +0 -593
- package/.claude/skills/command-guide/reference/agents/universal-executor.md +0 -131
- package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +0 -440
- package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +0 -93
- package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +0 -687
- package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +0 -471
- package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +0 -386
- package/.claude/skills/command-guide/reference/commands/memory/docs.md +0 -615
- package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +0 -182
- package/.claude/skills/command-guide/reference/commands/memory/load.md +0 -240
- package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +0 -525
- package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +0 -396
- package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +0 -477
- package/.claude/skills/command-guide/reference/commands/memory/update-full.md +0 -332
- package/.claude/skills/command-guide/reference/commands/memory/update-related.md +0 -332
- package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +0 -517
- package/.claude/skills/command-guide/reference/commands/task/breakdown.md +0 -204
- package/.claude/skills/command-guide/reference/commands/task/create.md +0 -152
- package/.claude/skills/command-guide/reference/commands/task/execute.md +0 -270
- package/.claude/skills/command-guide/reference/commands/task/replan.md +0 -437
- package/.claude/skills/command-guide/reference/commands/version.md +0 -254
- package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +0 -447
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +0 -585
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +0 -452
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +0 -443
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +0 -220
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +0 -398
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +0 -387
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +0 -221
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +0 -221
- package/.claude/skills/command-guide/reference/commands/workflow/execute.md +0 -460
- package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
- package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -686
- package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -621
- package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -592
- package/.claude/skills/command-guide/reference/commands/workflow/plan.md +0 -551
- package/.claude/skills/command-guide/reference/commands/workflow/replan.md +0 -515
- package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +0 -606
- package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +0 -765
- package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +0 -776
- package/.claude/skills/command-guide/reference/commands/workflow/review.md +0 -291
- package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -500
- package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -96
- package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -61
- package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +0 -460
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +0 -386
- package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +0 -498
- package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +0 -699
- package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +0 -529
- package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +0 -680
- package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -434
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -291
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +0 -518
- package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +0 -163
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +0 -235
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -256
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +0 -1150
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +0 -652
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +0 -454
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +0 -678
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +0 -504
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +0 -745
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +0 -537
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +0 -788
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +0 -356
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +0 -773
- package/.claude/skills/command-guide/scripts/analyze_commands.py +0 -502
- package/.claude/skills/command-guide/scripts/update-index.sh +0 -130
- package/.claude/skills/command-guide/templates/issue-bug.md +0 -104
- package/.claude/skills/command-guide/templates/issue-diagnosis.md +0 -275
- package/.claude/skills/command-guide/templates/issue-feature.md +0 -97
- package/.claude/skills/command-guide/templates/issue-question.md +0 -141
- package/.claude/skills/prompt-enhancer/SKILL.md +0 -124
- package/.claude/workflows/_template-compare-matrix.html +0 -692
- package/.claude/workflows/cli-templates/fix-plan-template.json +0 -75
- package/.claude/workflows/cli-templates/fix-progress-template.json +0 -48
- package/.claude/workflows/cli-templates/memory/style-skill-memory/skill-md-template.md +0 -299
- package/.claude/workflows/cli-templates/planning-roles/data-architect.md +0 -120
- package/.claude/workflows/cli-templates/planning-roles/product-manager.md +0 -119
- package/.claude/workflows/cli-templates/planning-roles/product-owner.md +0 -261
- package/.claude/workflows/cli-templates/planning-roles/scrum-master.md +0 -186
- package/.claude/workflows/cli-templates/planning-roles/subject-matter-expert.md +0 -281
- package/.claude/workflows/cli-templates/planning-roles/synthesis-role.md +0 -414
- package/.claude/workflows/cli-templates/planning-roles/system-architect.md +0 -106
- package/.claude/workflows/cli-templates/planning-roles/test-strategist.md +0 -124
- package/.claude/workflows/cli-templates/planning-roles/ui-designer.md +0 -379
- package/.claude/workflows/cli-templates/planning-roles/ux-expert.md +0 -240
- package/.claude/workflows/cli-templates/prompts/analysis/01-diagnose-bug-root-cause.txt +0 -127
- package/.claude/workflows/cli-templates/prompts/analysis/01-trace-code-execution.txt +0 -115
- package/.claude/workflows/cli-templates/prompts/analysis/02-analyze-code-patterns.txt +0 -37
- package/.claude/workflows/cli-templates/prompts/analysis/02-analyze-technical-document.txt +0 -33
- package/.claude/workflows/cli-templates/prompts/analysis/02-review-architecture.txt +0 -29
- package/.claude/workflows/cli-templates/prompts/analysis/02-review-code-quality.txt +0 -28
- package/.claude/workflows/cli-templates/prompts/analysis/03-analyze-performance.txt +0 -29
- package/.claude/workflows/cli-templates/prompts/analysis/03-assess-security-risks.txt +0 -29
- package/.claude/workflows/cli-templates/prompts/analysis/03-review-quality-standards.txt +0 -29
- package/.claude/workflows/cli-templates/prompts/development/02-generate-tests.txt +0 -70
- package/.claude/workflows/cli-templates/prompts/development/02-implement-component-ui.txt +0 -55
- package/.claude/workflows/cli-templates/prompts/development/02-implement-feature.txt +0 -58
- package/.claude/workflows/cli-templates/prompts/development/02-refactor-codebase.txt +0 -55
- package/.claude/workflows/cli-templates/prompts/development/03-debug-runtime-issues.txt +0 -55
- package/.claude/workflows/cli-templates/prompts/documentation/api.txt +0 -15
- package/.claude/workflows/cli-templates/prompts/documentation/folder-navigation.txt +0 -27
- package/.claude/workflows/cli-templates/prompts/documentation/module-readme.txt +0 -49
- package/.claude/workflows/cli-templates/prompts/documentation/project-architecture.txt +0 -41
- package/.claude/workflows/cli-templates/prompts/documentation/project-examples.txt +0 -35
- package/.claude/workflows/cli-templates/prompts/documentation/project-readme.txt +0 -35
- package/.claude/workflows/cli-templates/prompts/memory/02-document-module-structure.txt +0 -165
- package/.claude/workflows/cli-templates/prompts/planning/01-plan-architecture-design.txt +0 -109
- package/.claude/workflows/cli-templates/prompts/planning/02-breakdown-task-steps.txt +0 -30
- package/.claude/workflows/cli-templates/prompts/planning/02-design-component-spec.txt +0 -28
- package/.claude/workflows/cli-templates/prompts/planning/03-evaluate-concept-feasibility.txt +0 -127
- package/.claude/workflows/cli-templates/prompts/planning/03-plan-migration-strategy.txt +0 -30
- package/.claude/workflows/cli-templates/prompts/tech/tech-module-format.txt +0 -359
- package/.claude/workflows/cli-templates/prompts/tech/tech-skill-index.txt +0 -185
- package/.claude/workflows/cli-templates/prompts/test/test-concept-analysis.txt +0 -179
- package/.claude/workflows/cli-templates/prompts/universal/00-universal-creative-style.txt +0 -95
- package/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt +0 -92
- package/.claude/workflows/cli-templates/prompts/verification/codex-technical.txt +0 -28
- package/.claude/workflows/cli-templates/prompts/verification/cross-validation.txt +0 -28
- package/.claude/workflows/cli-templates/prompts/verification/gemini-strategic.txt +0 -27
- package/.claude/workflows/cli-templates/prompts/workflow/analysis-results-structure.txt +0 -224
- package/.claude/workflows/cli-templates/prompts/workflow/codex-feasibility-validation.txt +0 -176
- package/.claude/workflows/cli-templates/prompts/workflow/gemini-solution-design.txt +0 -131
- package/.claude/workflows/cli-templates/prompts/workflow/impl-plan-template.txt +0 -286
- package/.claude/workflows/cli-templates/prompts/workflow/skill-aggregation.txt +0 -172
- package/.claude/workflows/cli-templates/prompts/workflow/skill-conflict-patterns.txt +0 -98
- package/.claude/workflows/cli-templates/prompts/workflow/skill-index.txt +0 -224
- package/.claude/workflows/cli-templates/prompts/workflow/skill-lessons-learned.txt +0 -98
- package/.claude/workflows/cli-templates/prompts/workflow/skill-sessions-timeline.txt +0 -53
- package/.claude/workflows/cli-templates/prompts/workflow/task-json-agent-mode.txt +0 -123
- package/.claude/workflows/cli-templates/prompts/workflow/task-json-cli-mode.txt +0 -182
- package/.claude/workflows/cli-templates/schemas/diagnosis-json-schema.json +0 -234
- package/.claude/workflows/cli-templates/schemas/explore-json-schema.json +0 -124
- package/.claude/workflows/cli-templates/schemas/fix-plan-json-schema.json +0 -273
- package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +0 -219
- package/.claude/workflows/cli-templates/schemas/project-json-schema.json +0 -221
- package/.claude/workflows/cli-templates/schemas/review-deep-dive-results-schema.json +0 -82
- package/.claude/workflows/cli-templates/schemas/review-dimension-results-schema.json +0 -51
- package/.claude/workflows/cli-templates/tech-stacks/go-dev.md +0 -91
- package/.claude/workflows/cli-templates/tech-stacks/java-dev.md +0 -107
- package/.claude/workflows/cli-templates/tech-stacks/javascript-dev.md +0 -58
- package/.claude/workflows/cli-templates/tech-stacks/python-dev.md +0 -79
- package/.claude/workflows/cli-templates/tech-stacks/react-dev.md +0 -103
- package/.claude/workflows/cli-templates/tech-stacks/typescript-dev.md +0 -83
- package/.claude/workflows/cli-templates/ui-design/systems/animation-tokens.json +0 -247
- package/.claude/workflows/cli-templates/ui-design/systems/design-tokens.json +0 -342
- package/.claude/workflows/cli-templates/ui-design/systems/layout-templates.json +0 -145
- package/.claude/workflows/context-search-strategy.md +0 -77
- package/.claude/workflows/intelligent-tools-strategy.md +0 -662
- package/.claude/workflows/review-directory-specification.md +0 -336
- package/.claude/workflows/task-core.md +0 -214
- package/.claude/workflows/tool-strategy.md +0 -79
- package/.claude/workflows/workflow-architecture.md +0 -942
- package/.codex/AGENTS.md +0 -330
- package/.gemini/GEMINI.md +0 -164
- package/.qwen/QWEN.md +0 -164
- package/CLAUDE.md +0 -91
- package/LICENSE +0 -21
- package/ccw/README.md +0 -121
- package/ccw/bin/ccw.js +0 -10
- package/ccw/package.json +0 -47
- package/ccw/src/cli.js +0 -119
- package/ccw/src/commands/install.js +0 -324
- package/ccw/src/commands/list.js +0 -37
- package/ccw/src/commands/serve.js +0 -67
- package/ccw/src/commands/stop.js +0 -101
- package/ccw/src/commands/tool.js +0 -138
- package/ccw/src/commands/uninstall.js +0 -238
- package/ccw/src/commands/upgrade.js +0 -307
- package/ccw/src/commands/view.js +0 -105
- package/ccw/src/core/dashboard-generator-patch.js +0 -29
- package/ccw/src/core/dashboard-generator.js +0 -682
- package/ccw/src/core/data-aggregator.js +0 -409
- package/ccw/src/core/lite-scanner.js +0 -314
- package/ccw/src/core/manifest.js +0 -201
- package/ccw/src/core/server.js +0 -2063
- package/ccw/src/core/session-scanner.js +0 -235
- package/ccw/src/index.js +0 -9
- package/ccw/src/templates/dashboard-css/01-base.css +0 -291
- package/ccw/src/templates/dashboard-css/02-session.css +0 -726
- package/ccw/src/templates/dashboard-css/04-lite-tasks.css +0 -843
- package/ccw/src/templates/dashboard-css/06-cards.css +0 -1570
- package/ccw/src/templates/dashboard-css/07-managers.css +0 -936
- package/ccw/src/templates/dashboard-css/09-explorer.css +0 -1397
- package/ccw/src/templates/dashboard-js/api.js +0 -200
- package/ccw/src/templates/dashboard-js/components/carousel.js +0 -398
- package/ccw/src/templates/dashboard-js/components/global-notifications.js +0 -219
- package/ccw/src/templates/dashboard-js/components/hook-manager.js +0 -283
- package/ccw/src/templates/dashboard-js/components/mcp-manager.js +0 -528
- package/ccw/src/templates/dashboard-js/components/modals.js +0 -260
- package/ccw/src/templates/dashboard-js/components/navigation.js +0 -245
- package/ccw/src/templates/dashboard-js/components/notifications.js +0 -194
- package/ccw/src/templates/dashboard-js/components/tabs-other.js +0 -273
- package/ccw/src/templates/dashboard-js/main.js +0 -72
- package/ccw/src/templates/dashboard-js/state.js +0 -42
- package/ccw/src/templates/dashboard-js/utils.js +0 -153
- package/ccw/src/templates/dashboard-js/views/explorer.js +0 -852
- package/ccw/src/templates/dashboard-js/views/home.js +0 -197
- package/ccw/src/templates/dashboard-js/views/hook-manager.js +0 -392
- package/ccw/src/templates/dashboard-js/views/lite-tasks.js +0 -395
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js +0 -411
- package/ccw/src/templates/dashboard-js/views/session-detail.js +0 -780
- package/ccw/src/templates/dashboard.html +0 -731
- package/ccw/src/tools/classify-folders.js +0 -204
- package/ccw/src/tools/convert-tokens-to-css.js +0 -250
- package/ccw/src/tools/detect-changed-modules.js +0 -288
- package/ccw/src/tools/discover-design-files.js +0 -134
- package/ccw/src/tools/edit-file.js +0 -266
- package/ccw/src/tools/generate-module-docs.js +0 -416
- package/ccw/src/tools/get-modules-by-depth.js +0 -308
- package/ccw/src/tools/index.js +0 -176
- package/ccw/src/utils/browser-launcher.js +0 -60
- package/ccw/src/utils/file-utils.js +0 -48
- package/ccw/src/utils/path-resolver.js +0 -279
- package/ccw/src/utils/ui.js +0 -148
- /package/{ccw/src → src}/templates/dashboard-css/03-tasks.css +0 -0
- /package/{ccw/src → src}/templates/dashboard-css/05-context.css +0 -0
- /package/{ccw/src → src}/templates/dashboard-css/08-review.css +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/_conflict_tab.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/_exp_helpers.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/_review_tab.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/flowchart.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/sidebar.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/tabs-context.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/task-drawer-core.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/task-drawer-renderers.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/theme.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/components/version-check.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/views/fix-session.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/views/project-overview.js +0 -0
- /package/{ccw/src → src}/templates/dashboard-js/views/review-session.js +0 -0
- /package/{ccw/src → src}/templates/review-cycle-dashboard.html +0 -0
- /package/{ccw/src → src}/templates/workflow-dashboard.html +0 -0
- /package/{ccw/src → src}/tools/ui-generate-preview.js +0 -0
- /package/{ccw/src → src}/tools/ui-instantiate-prototypes.js +0 -0
- /package/{ccw/src → src}/tools/update-module-claude.js +0 -0
|
@@ -0,0 +1,978 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Memory Store - SQLite Storage Backend
|
|
3
|
+
* Provides persistent storage for memory module with entity tracking, associations, and conversation history
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import Database from 'better-sqlite3';
|
|
7
|
+
import { existsSync, mkdirSync } from 'fs';
|
|
8
|
+
import { join } from 'path';
|
|
9
|
+
import { StoragePaths, ensureStorageDir, getProjectId } from '../config/storage-paths.js';
|
|
10
|
+
|
|
11
|
+
// Types
|
|
12
|
+
export interface Entity {
|
|
13
|
+
id?: number;
|
|
14
|
+
type: 'file' | 'module' | 'topic' | 'url';
|
|
15
|
+
value: string;
|
|
16
|
+
normalized_value: string;
|
|
17
|
+
first_seen_at: string;
|
|
18
|
+
last_seen_at: string;
|
|
19
|
+
metadata?: string;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export interface AccessLog {
|
|
23
|
+
id?: number;
|
|
24
|
+
entity_id: number;
|
|
25
|
+
action: 'read' | 'write' | 'mention';
|
|
26
|
+
session_id?: string;
|
|
27
|
+
timestamp: string;
|
|
28
|
+
context_summary?: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface EntityStats {
|
|
32
|
+
entity_id: number;
|
|
33
|
+
read_count: number;
|
|
34
|
+
write_count: number;
|
|
35
|
+
mention_count: number;
|
|
36
|
+
heat_score: number;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface Association {
|
|
40
|
+
source_id: number;
|
|
41
|
+
target_id: number;
|
|
42
|
+
weight: number;
|
|
43
|
+
last_interaction_at?: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export interface PromptHistory {
|
|
47
|
+
id?: number;
|
|
48
|
+
session_id: string;
|
|
49
|
+
project_path?: string;
|
|
50
|
+
prompt_text?: string;
|
|
51
|
+
context_summary?: string;
|
|
52
|
+
timestamp: number;
|
|
53
|
+
hash?: string;
|
|
54
|
+
quality_score?: number;
|
|
55
|
+
intent_label?: string;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export interface PromptPattern {
|
|
59
|
+
id?: number;
|
|
60
|
+
pattern_type?: string;
|
|
61
|
+
frequency: number;
|
|
62
|
+
example_ids?: string;
|
|
63
|
+
last_detected?: number;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export interface Conversation {
|
|
67
|
+
id: string;
|
|
68
|
+
source?: string;
|
|
69
|
+
external_id?: string;
|
|
70
|
+
project_name?: string;
|
|
71
|
+
git_branch?: string;
|
|
72
|
+
created_at: string;
|
|
73
|
+
updated_at: string;
|
|
74
|
+
quality_score?: number;
|
|
75
|
+
turn_count: number;
|
|
76
|
+
prompt_preview?: string;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export interface Message {
|
|
80
|
+
id?: number;
|
|
81
|
+
conversation_id: string;
|
|
82
|
+
role: 'user' | 'assistant' | 'system';
|
|
83
|
+
content_text?: string;
|
|
84
|
+
content_json?: string;
|
|
85
|
+
timestamp: string;
|
|
86
|
+
token_count?: number;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export interface ToolCall {
|
|
90
|
+
id?: number;
|
|
91
|
+
message_id: number;
|
|
92
|
+
tool_name: string;
|
|
93
|
+
// NOTE: Naming inconsistency - using tool_args/tool_output vs tool_input/tool_result in HistoryImporter
|
|
94
|
+
// Kept for backward compatibility with existing databases
|
|
95
|
+
tool_args?: string;
|
|
96
|
+
tool_output?: string;
|
|
97
|
+
status?: string;
|
|
98
|
+
duration_ms?: number;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export interface HotEntity extends Entity {
|
|
102
|
+
stats: EntityStats;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export interface EntityWithAssociations extends Entity {
|
|
106
|
+
associations: Array<{
|
|
107
|
+
target: Entity;
|
|
108
|
+
weight: number;
|
|
109
|
+
last_interaction_at?: string;
|
|
110
|
+
}>;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Memory Store using SQLite
|
|
115
|
+
*/
|
|
116
|
+
export class MemoryStore {
|
|
117
|
+
private db: Database.Database;
|
|
118
|
+
private dbPath: string;
|
|
119
|
+
private projectPath: string;
|
|
120
|
+
|
|
121
|
+
constructor(projectPath: string) {
|
|
122
|
+
this.projectPath = projectPath;
|
|
123
|
+
// Use centralized storage path
|
|
124
|
+
const paths = StoragePaths.project(projectPath);
|
|
125
|
+
const memoryDir = paths.memory;
|
|
126
|
+
ensureStorageDir(memoryDir);
|
|
127
|
+
|
|
128
|
+
this.dbPath = paths.memoryDb;
|
|
129
|
+
this.db = new Database(this.dbPath);
|
|
130
|
+
this.db.pragma('journal_mode = WAL');
|
|
131
|
+
this.db.pragma('synchronous = NORMAL');
|
|
132
|
+
|
|
133
|
+
this.initDatabase();
|
|
134
|
+
this.migrateSchema();
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/**
|
|
138
|
+
* Initialize database schema
|
|
139
|
+
*/
|
|
140
|
+
private initDatabase(): void {
|
|
141
|
+
this.db.exec(`
|
|
142
|
+
-- Entity table
|
|
143
|
+
CREATE TABLE IF NOT EXISTS entities (
|
|
144
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
145
|
+
type TEXT NOT NULL,
|
|
146
|
+
value TEXT NOT NULL,
|
|
147
|
+
normalized_value TEXT NOT NULL,
|
|
148
|
+
first_seen_at TEXT NOT NULL,
|
|
149
|
+
last_seen_at TEXT NOT NULL,
|
|
150
|
+
metadata TEXT,
|
|
151
|
+
UNIQUE(type, normalized_value)
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
-- Access logs table
|
|
155
|
+
CREATE TABLE IF NOT EXISTS access_logs (
|
|
156
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
157
|
+
entity_id INTEGER NOT NULL,
|
|
158
|
+
action TEXT NOT NULL,
|
|
159
|
+
session_id TEXT,
|
|
160
|
+
timestamp TEXT NOT NULL,
|
|
161
|
+
context_summary TEXT,
|
|
162
|
+
FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE
|
|
163
|
+
);
|
|
164
|
+
|
|
165
|
+
-- Entity statistics table
|
|
166
|
+
CREATE TABLE IF NOT EXISTS entity_stats (
|
|
167
|
+
entity_id INTEGER PRIMARY KEY,
|
|
168
|
+
read_count INTEGER DEFAULT 0,
|
|
169
|
+
write_count INTEGER DEFAULT 0,
|
|
170
|
+
mention_count INTEGER DEFAULT 0,
|
|
171
|
+
heat_score REAL DEFAULT 0,
|
|
172
|
+
FOREIGN KEY (entity_id) REFERENCES entities(id) ON DELETE CASCADE
|
|
173
|
+
);
|
|
174
|
+
|
|
175
|
+
-- Associations table
|
|
176
|
+
CREATE TABLE IF NOT EXISTS associations (
|
|
177
|
+
source_id INTEGER NOT NULL,
|
|
178
|
+
target_id INTEGER NOT NULL,
|
|
179
|
+
weight INTEGER DEFAULT 0,
|
|
180
|
+
last_interaction_at TEXT,
|
|
181
|
+
PRIMARY KEY (source_id, target_id),
|
|
182
|
+
FOREIGN KEY (source_id) REFERENCES entities(id) ON DELETE CASCADE,
|
|
183
|
+
FOREIGN KEY (target_id) REFERENCES entities(id) ON DELETE CASCADE
|
|
184
|
+
);
|
|
185
|
+
|
|
186
|
+
-- Prompt history table
|
|
187
|
+
CREATE TABLE IF NOT EXISTS prompt_history (
|
|
188
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
189
|
+
session_id TEXT NOT NULL,
|
|
190
|
+
project_path TEXT,
|
|
191
|
+
prompt_text TEXT,
|
|
192
|
+
context_summary TEXT,
|
|
193
|
+
timestamp INTEGER,
|
|
194
|
+
hash TEXT UNIQUE,
|
|
195
|
+
quality_score INTEGER,
|
|
196
|
+
intent_label TEXT
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
-- Prompt patterns table
|
|
200
|
+
CREATE TABLE IF NOT EXISTS prompt_patterns (
|
|
201
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
202
|
+
pattern_type TEXT,
|
|
203
|
+
frequency INTEGER,
|
|
204
|
+
example_ids TEXT,
|
|
205
|
+
last_detected INTEGER
|
|
206
|
+
);
|
|
207
|
+
|
|
208
|
+
-- Conversations table
|
|
209
|
+
CREATE TABLE IF NOT EXISTS conversations (
|
|
210
|
+
id TEXT PRIMARY KEY,
|
|
211
|
+
source TEXT DEFAULT 'ccw',
|
|
212
|
+
external_id TEXT,
|
|
213
|
+
project_name TEXT,
|
|
214
|
+
git_branch TEXT,
|
|
215
|
+
created_at TEXT,
|
|
216
|
+
updated_at TEXT,
|
|
217
|
+
quality_score INTEGER,
|
|
218
|
+
turn_count INTEGER,
|
|
219
|
+
prompt_preview TEXT
|
|
220
|
+
);
|
|
221
|
+
|
|
222
|
+
-- Messages table
|
|
223
|
+
CREATE TABLE IF NOT EXISTS messages (
|
|
224
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
225
|
+
conversation_id TEXT NOT NULL,
|
|
226
|
+
role TEXT NOT NULL,
|
|
227
|
+
content_text TEXT,
|
|
228
|
+
content_json TEXT,
|
|
229
|
+
timestamp TEXT NOT NULL,
|
|
230
|
+
token_count INTEGER,
|
|
231
|
+
FOREIGN KEY (conversation_id) REFERENCES conversations(id) ON DELETE CASCADE
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
-- Tool calls table
|
|
235
|
+
CREATE TABLE IF NOT EXISTS tool_calls (
|
|
236
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
237
|
+
message_id INTEGER NOT NULL,
|
|
238
|
+
tool_name TEXT NOT NULL,
|
|
239
|
+
tool_args TEXT,
|
|
240
|
+
tool_output TEXT,
|
|
241
|
+
status TEXT,
|
|
242
|
+
duration_ms INTEGER,
|
|
243
|
+
FOREIGN KEY (message_id) REFERENCES messages(id) ON DELETE CASCADE
|
|
244
|
+
);
|
|
245
|
+
|
|
246
|
+
-- Indexes for efficient queries
|
|
247
|
+
CREATE INDEX IF NOT EXISTS idx_entities_type ON entities(type);
|
|
248
|
+
CREATE INDEX IF NOT EXISTS idx_entities_normalized ON entities(normalized_value);
|
|
249
|
+
CREATE INDEX IF NOT EXISTS idx_entities_last_seen ON entities(last_seen_at DESC);
|
|
250
|
+
CREATE INDEX IF NOT EXISTS idx_access_logs_entity ON access_logs(entity_id);
|
|
251
|
+
CREATE INDEX IF NOT EXISTS idx_access_logs_timestamp ON access_logs(timestamp DESC);
|
|
252
|
+
CREATE INDEX IF NOT EXISTS idx_access_logs_session ON access_logs(session_id);
|
|
253
|
+
CREATE INDEX IF NOT EXISTS idx_entity_stats_heat ON entity_stats(heat_score DESC);
|
|
254
|
+
CREATE INDEX IF NOT EXISTS idx_associations_source ON associations(source_id);
|
|
255
|
+
CREATE INDEX IF NOT EXISTS idx_associations_target ON associations(target_id);
|
|
256
|
+
CREATE INDEX IF NOT EXISTS idx_prompt_history_session ON prompt_history(session_id);
|
|
257
|
+
CREATE INDEX IF NOT EXISTS idx_prompt_history_timestamp ON prompt_history(timestamp DESC);
|
|
258
|
+
CREATE INDEX IF NOT EXISTS idx_conversations_created ON conversations(created_at DESC);
|
|
259
|
+
CREATE INDEX IF NOT EXISTS idx_conversations_updated ON conversations(updated_at DESC);
|
|
260
|
+
CREATE INDEX IF NOT EXISTS idx_messages_conversation ON messages(conversation_id);
|
|
261
|
+
CREATE INDEX IF NOT EXISTS idx_tool_calls_message ON tool_calls(message_id);
|
|
262
|
+
|
|
263
|
+
-- Full-text search for prompt history
|
|
264
|
+
CREATE VIRTUAL TABLE IF NOT EXISTS prompt_history_fts USING fts5(
|
|
265
|
+
prompt_text,
|
|
266
|
+
context_summary,
|
|
267
|
+
content='prompt_history',
|
|
268
|
+
content_rowid='id'
|
|
269
|
+
);
|
|
270
|
+
|
|
271
|
+
-- Triggers to keep FTS index updated
|
|
272
|
+
CREATE TRIGGER IF NOT EXISTS prompt_history_ai AFTER INSERT ON prompt_history BEGIN
|
|
273
|
+
INSERT INTO prompt_history_fts(rowid, prompt_text, context_summary)
|
|
274
|
+
VALUES (new.id, new.prompt_text, new.context_summary);
|
|
275
|
+
END;
|
|
276
|
+
|
|
277
|
+
CREATE TRIGGER IF NOT EXISTS prompt_history_ad AFTER DELETE ON prompt_history BEGIN
|
|
278
|
+
INSERT INTO prompt_history_fts(prompt_history_fts, rowid, prompt_text, context_summary)
|
|
279
|
+
VALUES('delete', old.id, old.prompt_text, old.context_summary);
|
|
280
|
+
END;
|
|
281
|
+
|
|
282
|
+
CREATE TRIGGER IF NOT EXISTS prompt_history_au AFTER UPDATE ON prompt_history BEGIN
|
|
283
|
+
INSERT INTO prompt_history_fts(prompt_history_fts, rowid, prompt_text, context_summary)
|
|
284
|
+
VALUES('delete', old.id, old.prompt_text, old.context_summary);
|
|
285
|
+
INSERT INTO prompt_history_fts(rowid, prompt_text, context_summary)
|
|
286
|
+
VALUES (new.id, new.prompt_text, new.context_summary);
|
|
287
|
+
END;
|
|
288
|
+
`);
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Migrate schema for existing databases
|
|
293
|
+
*/
|
|
294
|
+
private migrateSchema(): void {
|
|
295
|
+
try {
|
|
296
|
+
// Check if hierarchical storage columns exist in conversations table
|
|
297
|
+
const tableInfo = this.db.prepare('PRAGMA table_info(conversations)').all() as Array<{ name: string }>;
|
|
298
|
+
const hasProjectRoot = tableInfo.some(col => col.name === 'project_root');
|
|
299
|
+
const hasRelativePath = tableInfo.some(col => col.name === 'relative_path');
|
|
300
|
+
|
|
301
|
+
// Add hierarchical storage support columns
|
|
302
|
+
if (!hasProjectRoot) {
|
|
303
|
+
console.log('[Memory Store] Migrating database: adding project_root column for hierarchical storage...');
|
|
304
|
+
this.db.exec(`
|
|
305
|
+
ALTER TABLE conversations ADD COLUMN project_root TEXT;
|
|
306
|
+
`);
|
|
307
|
+
try {
|
|
308
|
+
this.db.exec(`CREATE INDEX IF NOT EXISTS idx_conversations_project_root ON conversations(project_root);`);
|
|
309
|
+
} catch (indexErr) {
|
|
310
|
+
console.warn('[Memory Store] Project root index creation warning:', (indexErr as Error).message);
|
|
311
|
+
}
|
|
312
|
+
console.log('[Memory Store] Migration complete: project_root column added');
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
if (!hasRelativePath) {
|
|
316
|
+
console.log('[Memory Store] Migrating database: adding relative_path column for hierarchical storage...');
|
|
317
|
+
this.db.exec(`
|
|
318
|
+
ALTER TABLE conversations ADD COLUMN relative_path TEXT;
|
|
319
|
+
`);
|
|
320
|
+
console.log('[Memory Store] Migration complete: relative_path column added');
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
// Add missing timestamp index for messages table (for time-based queries)
|
|
324
|
+
try {
|
|
325
|
+
const indexExists = this.db.prepare(`
|
|
326
|
+
SELECT name FROM sqlite_master
|
|
327
|
+
WHERE type='index' AND name='idx_messages_timestamp'
|
|
328
|
+
`).get();
|
|
329
|
+
|
|
330
|
+
if (!indexExists) {
|
|
331
|
+
console.log('[Memory Store] Adding missing timestamp index to messages table...');
|
|
332
|
+
this.db.exec(`CREATE INDEX IF NOT EXISTS idx_messages_timestamp ON messages(timestamp DESC);`);
|
|
333
|
+
console.log('[Memory Store] Migration complete: messages timestamp index added');
|
|
334
|
+
}
|
|
335
|
+
} catch (indexErr) {
|
|
336
|
+
console.warn('[Memory Store] Messages timestamp index creation warning:', (indexErr as Error).message);
|
|
337
|
+
}
|
|
338
|
+
} catch (err) {
|
|
339
|
+
console.error('[Memory Store] Migration error:', (err as Error).message);
|
|
340
|
+
// Don't throw - allow the store to continue working with existing schema
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* Upsert an entity
|
|
346
|
+
*/
|
|
347
|
+
upsertEntity(entity: Entity): number {
|
|
348
|
+
const stmt = this.db.prepare(`
|
|
349
|
+
INSERT INTO entities (type, value, normalized_value, first_seen_at, last_seen_at, metadata)
|
|
350
|
+
VALUES (@type, @value, @normalized_value, @first_seen_at, @last_seen_at, @metadata)
|
|
351
|
+
ON CONFLICT(type, normalized_value) DO UPDATE SET
|
|
352
|
+
value = @value,
|
|
353
|
+
last_seen_at = @last_seen_at,
|
|
354
|
+
metadata = @metadata
|
|
355
|
+
RETURNING id
|
|
356
|
+
`);
|
|
357
|
+
|
|
358
|
+
const result = stmt.get({
|
|
359
|
+
type: entity.type,
|
|
360
|
+
value: entity.value,
|
|
361
|
+
normalized_value: entity.normalized_value,
|
|
362
|
+
first_seen_at: entity.first_seen_at,
|
|
363
|
+
last_seen_at: entity.last_seen_at,
|
|
364
|
+
metadata: entity.metadata || null
|
|
365
|
+
}) as { id: number };
|
|
366
|
+
|
|
367
|
+
return result.id;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/**
|
|
371
|
+
* Get entity by type and normalized value
|
|
372
|
+
*/
|
|
373
|
+
getEntity(type: string, normalizedValue: string): Entity | null {
|
|
374
|
+
const stmt = this.db.prepare(`
|
|
375
|
+
SELECT * FROM entities WHERE type = ? AND normalized_value = ?
|
|
376
|
+
`);
|
|
377
|
+
return stmt.get(type, normalizedValue) as Entity | null;
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
/**
|
|
381
|
+
* Get entity by ID
|
|
382
|
+
*/
|
|
383
|
+
getEntityById(id: number): Entity | null {
|
|
384
|
+
const stmt = this.db.prepare(`SELECT * FROM entities WHERE id = ?`);
|
|
385
|
+
return stmt.get(id) as Entity | null;
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
/**
|
|
389
|
+
* Get hot entities (by heat score)
|
|
390
|
+
*/
|
|
391
|
+
getHotEntities(limit: number = 20): HotEntity[] {
|
|
392
|
+
const stmt = this.db.prepare(`
|
|
393
|
+
SELECT e.*, s.read_count, s.write_count, s.mention_count, s.heat_score
|
|
394
|
+
FROM entities e
|
|
395
|
+
INNER JOIN entity_stats s ON e.id = s.entity_id
|
|
396
|
+
ORDER BY s.heat_score DESC
|
|
397
|
+
LIMIT ?
|
|
398
|
+
`);
|
|
399
|
+
|
|
400
|
+
const rows = stmt.all(limit) as any[];
|
|
401
|
+
return rows.map(row => ({
|
|
402
|
+
id: row.id,
|
|
403
|
+
type: row.type,
|
|
404
|
+
value: row.value,
|
|
405
|
+
normalized_value: row.normalized_value,
|
|
406
|
+
first_seen_at: row.first_seen_at,
|
|
407
|
+
last_seen_at: row.last_seen_at,
|
|
408
|
+
metadata: row.metadata,
|
|
409
|
+
stats: {
|
|
410
|
+
entity_id: row.id,
|
|
411
|
+
read_count: row.read_count,
|
|
412
|
+
write_count: row.write_count,
|
|
413
|
+
mention_count: row.mention_count,
|
|
414
|
+
heat_score: row.heat_score
|
|
415
|
+
}
|
|
416
|
+
}));
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
/**
|
|
420
|
+
* Log entity access
|
|
421
|
+
*/
|
|
422
|
+
logAccess(log: AccessLog): void {
|
|
423
|
+
const stmt = this.db.prepare(`
|
|
424
|
+
INSERT INTO access_logs (entity_id, action, session_id, timestamp, context_summary)
|
|
425
|
+
VALUES (@entity_id, @action, @session_id, @timestamp, @context_summary)
|
|
426
|
+
`);
|
|
427
|
+
|
|
428
|
+
stmt.run({
|
|
429
|
+
entity_id: log.entity_id,
|
|
430
|
+
action: log.action,
|
|
431
|
+
session_id: log.session_id || null,
|
|
432
|
+
timestamp: log.timestamp,
|
|
433
|
+
context_summary: log.context_summary || null
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* Get recent access logs for an entity
|
|
439
|
+
*/
|
|
440
|
+
getRecentAccess(entityId: number, limit: number = 50): AccessLog[] {
|
|
441
|
+
const stmt = this.db.prepare(`
|
|
442
|
+
SELECT * FROM access_logs
|
|
443
|
+
WHERE entity_id = ?
|
|
444
|
+
ORDER BY timestamp DESC
|
|
445
|
+
LIMIT ?
|
|
446
|
+
`);
|
|
447
|
+
return stmt.all(entityId, limit) as AccessLog[];
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/**
|
|
451
|
+
* Update entity statistics
|
|
452
|
+
*/
|
|
453
|
+
updateStats(entityId: number, action: 'read' | 'write' | 'mention'): void {
|
|
454
|
+
const upsertStmt = this.db.prepare(`
|
|
455
|
+
INSERT INTO entity_stats (entity_id, read_count, write_count, mention_count, heat_score)
|
|
456
|
+
VALUES (@entity_id, 0, 0, 0, 0)
|
|
457
|
+
ON CONFLICT(entity_id) DO NOTHING
|
|
458
|
+
`);
|
|
459
|
+
|
|
460
|
+
upsertStmt.run({ entity_id: entityId });
|
|
461
|
+
|
|
462
|
+
const field = `${action}_count`;
|
|
463
|
+
const updateStmt = this.db.prepare(`
|
|
464
|
+
UPDATE entity_stats
|
|
465
|
+
SET ${field} = ${field} + 1
|
|
466
|
+
WHERE entity_id = ?
|
|
467
|
+
`);
|
|
468
|
+
|
|
469
|
+
updateStmt.run(entityId);
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
/**
|
|
473
|
+
* Get entity statistics
|
|
474
|
+
*/
|
|
475
|
+
getStats(entityId: number): EntityStats | null {
|
|
476
|
+
const stmt = this.db.prepare(`SELECT * FROM entity_stats WHERE entity_id = ?`);
|
|
477
|
+
return stmt.get(entityId) as EntityStats | null;
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
/**
|
|
481
|
+
* Calculate and update heat score for an entity
|
|
482
|
+
*/
|
|
483
|
+
calculateHeatScore(entityId: number): number {
|
|
484
|
+
const stats = this.getStats(entityId);
|
|
485
|
+
if (!stats) return 0;
|
|
486
|
+
|
|
487
|
+
const now = Date.now();
|
|
488
|
+
const logs = this.getRecentAccess(entityId, 100);
|
|
489
|
+
|
|
490
|
+
let recencyScore = 0;
|
|
491
|
+
for (const log of logs) {
|
|
492
|
+
const ageMs = now - new Date(log.timestamp).getTime();
|
|
493
|
+
const ageDays = ageMs / (1000 * 60 * 60 * 24);
|
|
494
|
+
const decay = Math.exp(-ageDays / 7); // 7-day half-life
|
|
495
|
+
recencyScore += decay;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
const heatScore = (
|
|
499
|
+
stats.read_count * 1 +
|
|
500
|
+
stats.write_count * 3 +
|
|
501
|
+
stats.mention_count * 2 +
|
|
502
|
+
recencyScore * 5
|
|
503
|
+
);
|
|
504
|
+
|
|
505
|
+
const updateStmt = this.db.prepare(`
|
|
506
|
+
UPDATE entity_stats SET heat_score = ? WHERE entity_id = ?
|
|
507
|
+
`);
|
|
508
|
+
updateStmt.run(heatScore, entityId);
|
|
509
|
+
|
|
510
|
+
return heatScore;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/**
|
|
514
|
+
* Record association between entities
|
|
515
|
+
*/
|
|
516
|
+
recordAssociation(sourceId: number, targetId: number, timestamp?: string): void {
|
|
517
|
+
const stmt = this.db.prepare(`
|
|
518
|
+
INSERT INTO associations (source_id, target_id, weight, last_interaction_at)
|
|
519
|
+
VALUES (@source_id, @target_id, 1, @last_interaction_at)
|
|
520
|
+
ON CONFLICT(source_id, target_id) DO UPDATE SET
|
|
521
|
+
weight = weight + 1,
|
|
522
|
+
last_interaction_at = @last_interaction_at
|
|
523
|
+
`);
|
|
524
|
+
|
|
525
|
+
stmt.run({
|
|
526
|
+
source_id: sourceId,
|
|
527
|
+
target_id: targetId,
|
|
528
|
+
last_interaction_at: timestamp || new Date().toISOString()
|
|
529
|
+
});
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
/**
|
|
533
|
+
* Get associations for an entity
|
|
534
|
+
*/
|
|
535
|
+
getAssociations(entityId: number, limit: number = 20): EntityWithAssociations['associations'] {
|
|
536
|
+
const stmt = this.db.prepare(`
|
|
537
|
+
SELECT e.*, a.weight, a.last_interaction_at
|
|
538
|
+
FROM associations a
|
|
539
|
+
INNER JOIN entities e ON a.target_id = e.id
|
|
540
|
+
WHERE a.source_id = ?
|
|
541
|
+
ORDER BY a.weight DESC
|
|
542
|
+
LIMIT ?
|
|
543
|
+
`);
|
|
544
|
+
|
|
545
|
+
const rows = stmt.all(entityId, limit) as any[];
|
|
546
|
+
return rows.map(row => ({
|
|
547
|
+
target: {
|
|
548
|
+
id: row.id,
|
|
549
|
+
type: row.type,
|
|
550
|
+
value: row.value,
|
|
551
|
+
normalized_value: row.normalized_value,
|
|
552
|
+
first_seen_at: row.first_seen_at,
|
|
553
|
+
last_seen_at: row.last_seen_at,
|
|
554
|
+
metadata: row.metadata
|
|
555
|
+
},
|
|
556
|
+
weight: row.weight,
|
|
557
|
+
last_interaction_at: row.last_interaction_at
|
|
558
|
+
}));
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
/**
|
|
562
|
+
* Save prompt to history
|
|
563
|
+
*/
|
|
564
|
+
savePrompt(prompt: PromptHistory): number {
|
|
565
|
+
const stmt = this.db.prepare(`
|
|
566
|
+
INSERT INTO prompt_history (session_id, project_path, prompt_text, context_summary, timestamp, hash, quality_score, intent_label)
|
|
567
|
+
VALUES (@session_id, @project_path, @prompt_text, @context_summary, @timestamp, @hash, @quality_score, @intent_label)
|
|
568
|
+
ON CONFLICT(hash) DO UPDATE SET
|
|
569
|
+
quality_score = @quality_score,
|
|
570
|
+
intent_label = @intent_label
|
|
571
|
+
RETURNING id
|
|
572
|
+
`);
|
|
573
|
+
|
|
574
|
+
const result = stmt.get({
|
|
575
|
+
session_id: prompt.session_id,
|
|
576
|
+
project_path: prompt.project_path || null,
|
|
577
|
+
prompt_text: prompt.prompt_text || null,
|
|
578
|
+
context_summary: prompt.context_summary || null,
|
|
579
|
+
timestamp: prompt.timestamp,
|
|
580
|
+
hash: prompt.hash || null,
|
|
581
|
+
quality_score: prompt.quality_score || null,
|
|
582
|
+
intent_label: prompt.intent_label || null
|
|
583
|
+
}) as { id: number };
|
|
584
|
+
|
|
585
|
+
return result.id;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
/**
|
|
589
|
+
* Get prompt history for a session
|
|
590
|
+
*/
|
|
591
|
+
getPromptHistory(sessionId: string, limit: number = 50): PromptHistory[] {
|
|
592
|
+
const stmt = this.db.prepare(`
|
|
593
|
+
SELECT * FROM prompt_history
|
|
594
|
+
WHERE session_id = ?
|
|
595
|
+
ORDER BY timestamp DESC
|
|
596
|
+
LIMIT ?
|
|
597
|
+
`);
|
|
598
|
+
return stmt.all(sessionId, limit) as PromptHistory[];
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
/**
|
|
602
|
+
* Search prompts by text
|
|
603
|
+
*/
|
|
604
|
+
searchPrompts(query: string, limit: number = 20): PromptHistory[] {
|
|
605
|
+
const stmt = this.db.prepare(`
|
|
606
|
+
SELECT ph.* FROM prompt_history ph
|
|
607
|
+
INNER JOIN prompt_history_fts fts ON fts.rowid = ph.id
|
|
608
|
+
WHERE prompt_history_fts MATCH ?
|
|
609
|
+
ORDER BY ph.timestamp DESC
|
|
610
|
+
LIMIT ?
|
|
611
|
+
`);
|
|
612
|
+
return stmt.all(query, limit) as PromptHistory[];
|
|
613
|
+
}
|
|
614
|
+
|
|
615
|
+
/**
|
|
616
|
+
* Save or update a conversation
|
|
617
|
+
*/
|
|
618
|
+
saveConversation(conversation: Conversation): void {
|
|
619
|
+
const stmt = this.db.prepare(`
|
|
620
|
+
INSERT INTO conversations (id, source, external_id, project_name, git_branch, created_at, updated_at, quality_score, turn_count, prompt_preview, project_root, relative_path)
|
|
621
|
+
VALUES (@id, @source, @external_id, @project_name, @git_branch, @created_at, @updated_at, @quality_score, @turn_count, @prompt_preview, @project_root, @relative_path)
|
|
622
|
+
ON CONFLICT(id) DO UPDATE SET
|
|
623
|
+
updated_at = @updated_at,
|
|
624
|
+
quality_score = @quality_score,
|
|
625
|
+
turn_count = @turn_count,
|
|
626
|
+
prompt_preview = @prompt_preview,
|
|
627
|
+
project_root = @project_root,
|
|
628
|
+
relative_path = @relative_path
|
|
629
|
+
`);
|
|
630
|
+
|
|
631
|
+
stmt.run({
|
|
632
|
+
id: conversation.id,
|
|
633
|
+
source: conversation.source || 'ccw',
|
|
634
|
+
external_id: conversation.external_id || null,
|
|
635
|
+
project_name: conversation.project_name || null,
|
|
636
|
+
git_branch: conversation.git_branch || null,
|
|
637
|
+
created_at: conversation.created_at,
|
|
638
|
+
updated_at: conversation.updated_at,
|
|
639
|
+
quality_score: conversation.quality_score || null,
|
|
640
|
+
turn_count: conversation.turn_count,
|
|
641
|
+
prompt_preview: conversation.prompt_preview || null,
|
|
642
|
+
project_root: this.projectPath,
|
|
643
|
+
relative_path: null // For future hierarchical tracking
|
|
644
|
+
});
|
|
645
|
+
}
|
|
646
|
+
|
|
647
|
+
/**
|
|
648
|
+
* Get conversations
|
|
649
|
+
*/
|
|
650
|
+
getConversations(limit: number = 50, offset: number = 0): Conversation[] {
|
|
651
|
+
const stmt = this.db.prepare(`
|
|
652
|
+
SELECT * FROM conversations
|
|
653
|
+
ORDER BY updated_at DESC
|
|
654
|
+
LIMIT ? OFFSET ?
|
|
655
|
+
`);
|
|
656
|
+
return stmt.all(limit, offset) as Conversation[];
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
/**
|
|
660
|
+
* Get conversation by ID
|
|
661
|
+
*/
|
|
662
|
+
getConversation(id: string): Conversation | null {
|
|
663
|
+
const stmt = this.db.prepare(`SELECT * FROM conversations WHERE id = ?`);
|
|
664
|
+
return stmt.get(id) as Conversation | null;
|
|
665
|
+
}
|
|
666
|
+
|
|
667
|
+
/**
|
|
668
|
+
* Save message
|
|
669
|
+
*/
|
|
670
|
+
saveMessage(message: Message): number {
|
|
671
|
+
const stmt = this.db.prepare(`
|
|
672
|
+
INSERT INTO messages (conversation_id, role, content_text, content_json, timestamp, token_count)
|
|
673
|
+
VALUES (@conversation_id, @role, @content_text, @content_json, @timestamp, @token_count)
|
|
674
|
+
RETURNING id
|
|
675
|
+
`);
|
|
676
|
+
|
|
677
|
+
const result = stmt.get({
|
|
678
|
+
conversation_id: message.conversation_id,
|
|
679
|
+
role: message.role,
|
|
680
|
+
content_text: message.content_text || null,
|
|
681
|
+
content_json: message.content_json || null,
|
|
682
|
+
timestamp: message.timestamp,
|
|
683
|
+
token_count: message.token_count || null
|
|
684
|
+
}) as { id: number };
|
|
685
|
+
|
|
686
|
+
return result.id;
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* Get messages for a conversation
|
|
691
|
+
*/
|
|
692
|
+
getMessages(conversationId: string): Message[] {
|
|
693
|
+
const stmt = this.db.prepare(`
|
|
694
|
+
SELECT * FROM messages
|
|
695
|
+
WHERE conversation_id = ?
|
|
696
|
+
ORDER BY timestamp ASC
|
|
697
|
+
`);
|
|
698
|
+
return stmt.all(conversationId) as Message[];
|
|
699
|
+
}
|
|
700
|
+
|
|
701
|
+
/**
|
|
702
|
+
* Save tool call
|
|
703
|
+
*/
|
|
704
|
+
saveToolCall(toolCall: ToolCall): number {
|
|
705
|
+
const stmt = this.db.prepare(`
|
|
706
|
+
INSERT INTO tool_calls (message_id, tool_name, tool_args, tool_output, status, duration_ms)
|
|
707
|
+
VALUES (@message_id, @tool_name, @tool_args, @tool_output, @status, @duration_ms)
|
|
708
|
+
RETURNING id
|
|
709
|
+
`);
|
|
710
|
+
|
|
711
|
+
const result = stmt.get({
|
|
712
|
+
message_id: toolCall.message_id,
|
|
713
|
+
tool_name: toolCall.tool_name,
|
|
714
|
+
tool_args: toolCall.tool_args || null,
|
|
715
|
+
tool_output: toolCall.tool_output || null,
|
|
716
|
+
status: toolCall.status || null,
|
|
717
|
+
duration_ms: toolCall.duration_ms || null
|
|
718
|
+
}) as { id: number };
|
|
719
|
+
|
|
720
|
+
return result.id;
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
/**
|
|
724
|
+
* Get tool calls for a message
|
|
725
|
+
*/
|
|
726
|
+
getToolCalls(messageId: number): ToolCall[] {
|
|
727
|
+
const stmt = this.db.prepare(`
|
|
728
|
+
SELECT * FROM tool_calls
|
|
729
|
+
WHERE message_id = ?
|
|
730
|
+
`);
|
|
731
|
+
return stmt.all(messageId) as ToolCall[];
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
/**
|
|
735
|
+
* Close database connection
|
|
736
|
+
*/
|
|
737
|
+
close(): void {
|
|
738
|
+
this.db.close();
|
|
739
|
+
}
|
|
740
|
+
}
|
|
741
|
+
|
|
742
|
+
// Singleton instance cache - keyed by normalized project ID for consistency
|
|
743
|
+
const storeCache = new Map<string, MemoryStore>();
|
|
744
|
+
|
|
745
|
+
/**
|
|
746
|
+
* Get or create a store instance for a project
|
|
747
|
+
* Uses normalized project ID as cache key to handle path casing differences
|
|
748
|
+
*/
|
|
749
|
+
export function getMemoryStore(projectPath: string): MemoryStore {
|
|
750
|
+
// Use getProjectId to normalize path for consistent cache key
|
|
751
|
+
const cacheKey = getProjectId(projectPath);
|
|
752
|
+
|
|
753
|
+
if (!storeCache.has(cacheKey)) {
|
|
754
|
+
storeCache.set(cacheKey, new MemoryStore(projectPath));
|
|
755
|
+
}
|
|
756
|
+
return storeCache.get(cacheKey)!;
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
/**
|
|
760
|
+
* Get aggregated stats from parent and all child projects
|
|
761
|
+
* @param projectPath - Parent project path
|
|
762
|
+
* @returns Aggregated statistics from all projects
|
|
763
|
+
*/
|
|
764
|
+
export async function getAggregatedStats(projectPath: string): Promise<{
|
|
765
|
+
entities: number;
|
|
766
|
+
prompts: number;
|
|
767
|
+
conversations: number;
|
|
768
|
+
total: number;
|
|
769
|
+
projects: Array<{ path: string; stats: { entities: number; prompts: number; conversations: number } }>;
|
|
770
|
+
}> {
|
|
771
|
+
const { scanChildProjectsAsync } = await import('../config/storage-paths.js');
|
|
772
|
+
const childProjects = await scanChildProjectsAsync(projectPath);
|
|
773
|
+
|
|
774
|
+
const projectStats: Array<{ path: string; stats: { entities: number; prompts: number; conversations: number } }> = [];
|
|
775
|
+
let totalEntities = 0;
|
|
776
|
+
let totalPrompts = 0;
|
|
777
|
+
let totalConversations = 0;
|
|
778
|
+
|
|
779
|
+
// Get parent stats
|
|
780
|
+
try {
|
|
781
|
+
const parentStore = getMemoryStore(projectPath);
|
|
782
|
+
const db = (parentStore as any).db;
|
|
783
|
+
|
|
784
|
+
const entityCount = (db.prepare('SELECT COUNT(*) as count FROM entities').get() as { count: number }).count;
|
|
785
|
+
const promptCount = (db.prepare('SELECT COUNT(*) as count FROM prompt_history').get() as { count: number }).count;
|
|
786
|
+
const conversationCount = (db.prepare('SELECT COUNT(*) as count FROM conversations').get() as { count: number }).count;
|
|
787
|
+
|
|
788
|
+
projectStats.push({
|
|
789
|
+
path: projectPath,
|
|
790
|
+
stats: { entities: entityCount, prompts: promptCount, conversations: conversationCount }
|
|
791
|
+
});
|
|
792
|
+
totalEntities += entityCount;
|
|
793
|
+
totalPrompts += promptCount;
|
|
794
|
+
totalConversations += conversationCount;
|
|
795
|
+
} catch (error) {
|
|
796
|
+
if (process.env.DEBUG) {
|
|
797
|
+
console.error(`[Memory Store] Failed to get stats for parent ${projectPath}:`, error);
|
|
798
|
+
}
|
|
799
|
+
}
|
|
800
|
+
|
|
801
|
+
// Get child stats
|
|
802
|
+
for (const child of childProjects) {
|
|
803
|
+
try {
|
|
804
|
+
const childStore = getMemoryStore(child.projectPath);
|
|
805
|
+
const db = (childStore as any).db;
|
|
806
|
+
|
|
807
|
+
const entityCount = (db.prepare('SELECT COUNT(*) as count FROM entities').get() as { count: number }).count;
|
|
808
|
+
const promptCount = (db.prepare('SELECT COUNT(*) as count FROM prompt_history').get() as { count: number }).count;
|
|
809
|
+
const conversationCount = (db.prepare('SELECT COUNT(*) as count FROM conversations').get() as { count: number }).count;
|
|
810
|
+
|
|
811
|
+
projectStats.push({
|
|
812
|
+
path: child.relativePath,
|
|
813
|
+
stats: { entities: entityCount, prompts: promptCount, conversations: conversationCount }
|
|
814
|
+
});
|
|
815
|
+
totalEntities += entityCount;
|
|
816
|
+
totalPrompts += promptCount;
|
|
817
|
+
totalConversations += conversationCount;
|
|
818
|
+
} catch (error) {
|
|
819
|
+
if (process.env.DEBUG) {
|
|
820
|
+
console.error(`[Memory Store] Failed to get stats for child ${child.projectPath}:`, error);
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
return {
|
|
826
|
+
entities: totalEntities,
|
|
827
|
+
prompts: totalPrompts,
|
|
828
|
+
conversations: totalConversations,
|
|
829
|
+
total: totalEntities + totalPrompts + totalConversations,
|
|
830
|
+
projects: projectStats
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
/**
|
|
835
|
+
* Get aggregated entities from parent and all child projects
|
|
836
|
+
* @param projectPath - Parent project path
|
|
837
|
+
* @param options - Query options
|
|
838
|
+
* @returns Combined entities from all projects with source information
|
|
839
|
+
*/
|
|
840
|
+
export async function getAggregatedEntities(
|
|
841
|
+
projectPath: string,
|
|
842
|
+
options: { type?: string; limit?: number; offset?: number } = {}
|
|
843
|
+
): Promise<Array<HotEntity & { sourceProject?: string }>> {
|
|
844
|
+
const { scanChildProjectsAsync } = await import('../config/storage-paths.js');
|
|
845
|
+
const childProjects = await scanChildProjectsAsync(projectPath);
|
|
846
|
+
|
|
847
|
+
const limit = options.limit || 50;
|
|
848
|
+
const offset = options.offset || 0;
|
|
849
|
+
const allEntities: Array<HotEntity & { sourceProject?: string }> = [];
|
|
850
|
+
|
|
851
|
+
// Get parent entities - apply LIMIT at SQL level
|
|
852
|
+
try {
|
|
853
|
+
const parentStore = getMemoryStore(projectPath);
|
|
854
|
+
const db = (parentStore as any).db;
|
|
855
|
+
|
|
856
|
+
let query = 'SELECT * FROM entities';
|
|
857
|
+
const params: any[] = [];
|
|
858
|
+
|
|
859
|
+
if (options.type) {
|
|
860
|
+
query += ' WHERE type = ?';
|
|
861
|
+
params.push(options.type);
|
|
862
|
+
}
|
|
863
|
+
|
|
864
|
+
query += ' ORDER BY last_seen_at DESC LIMIT ?';
|
|
865
|
+
params.push(limit);
|
|
866
|
+
|
|
867
|
+
const stmt = db.prepare(query);
|
|
868
|
+
const parentEntities = stmt.all(...params) as Entity[];
|
|
869
|
+
allEntities.push(...parentEntities.map((e: Entity) => ({ ...e, stats: {} as EntityStats, sourceProject: projectPath })));
|
|
870
|
+
} catch (error) {
|
|
871
|
+
if (process.env.DEBUG) {
|
|
872
|
+
console.error(`[Memory Store] Failed to get entities for parent ${projectPath}:`, error);
|
|
873
|
+
}
|
|
874
|
+
}
|
|
875
|
+
|
|
876
|
+
// Get child entities - apply LIMIT to each child
|
|
877
|
+
for (const child of childProjects) {
|
|
878
|
+
try {
|
|
879
|
+
const childStore = getMemoryStore(child.projectPath);
|
|
880
|
+
const db = (childStore as any).db;
|
|
881
|
+
|
|
882
|
+
let query = 'SELECT * FROM entities';
|
|
883
|
+
const params: any[] = [];
|
|
884
|
+
|
|
885
|
+
if (options.type) {
|
|
886
|
+
query += ' WHERE type = ?';
|
|
887
|
+
params.push(options.type);
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
query += ' ORDER BY last_seen_at DESC LIMIT ?';
|
|
891
|
+
params.push(limit);
|
|
892
|
+
|
|
893
|
+
const stmt = db.prepare(query);
|
|
894
|
+
const childEntities = stmt.all(...params) as Entity[];
|
|
895
|
+
allEntities.push(...childEntities.map((e: Entity) => ({ ...e, stats: {} as EntityStats, sourceProject: child.relativePath })));
|
|
896
|
+
} catch (error) {
|
|
897
|
+
if (process.env.DEBUG) {
|
|
898
|
+
console.error(`[Memory Store] Failed to get entities for child ${child.projectPath}:`, error);
|
|
899
|
+
}
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
// Sort by last_seen_at and apply final limit with offset
|
|
904
|
+
allEntities.sort((a, b) => {
|
|
905
|
+
const aTime = a.last_seen_at ? new Date(a.last_seen_at).getTime() : 0;
|
|
906
|
+
const bTime = b.last_seen_at ? new Date(b.last_seen_at).getTime() : 0;
|
|
907
|
+
return bTime - aTime;
|
|
908
|
+
});
|
|
909
|
+
|
|
910
|
+
return allEntities.slice(offset, offset + limit);
|
|
911
|
+
}
|
|
912
|
+
|
|
913
|
+
/**
|
|
914
|
+
* Get aggregated prompts from parent and all child projects
|
|
915
|
+
* @param projectPath - Parent project path
|
|
916
|
+
* @param limit - Maximum number of prompts to return
|
|
917
|
+
* @returns Combined prompts from all projects with source information
|
|
918
|
+
*/
|
|
919
|
+
export async function getAggregatedPrompts(
|
|
920
|
+
projectPath: string,
|
|
921
|
+
limit: number = 50
|
|
922
|
+
): Promise<Array<PromptHistory & { sourceProject?: string }>> {
|
|
923
|
+
const { scanChildProjectsAsync } = await import('../config/storage-paths.js');
|
|
924
|
+
const childProjects = await scanChildProjectsAsync(projectPath);
|
|
925
|
+
|
|
926
|
+
const allPrompts: Array<PromptHistory & { sourceProject?: string }> = [];
|
|
927
|
+
|
|
928
|
+
// Get parent prompts - use direct SQL query with LIMIT
|
|
929
|
+
try {
|
|
930
|
+
const parentStore = getMemoryStore(projectPath);
|
|
931
|
+
const db = (parentStore as any).db;
|
|
932
|
+
|
|
933
|
+
const stmt = db.prepare('SELECT * FROM prompt_history ORDER BY timestamp DESC LIMIT ?');
|
|
934
|
+
const parentPrompts = stmt.all(limit) as PromptHistory[];
|
|
935
|
+
allPrompts.push(...parentPrompts.map((p: PromptHistory) => ({ ...p, sourceProject: projectPath })));
|
|
936
|
+
} catch (error) {
|
|
937
|
+
if (process.env.DEBUG) {
|
|
938
|
+
console.error(`[Memory Store] Failed to get prompts for parent ${projectPath}:`, error);
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
// Get child prompts - apply LIMIT to each child to reduce memory footprint
|
|
943
|
+
for (const child of childProjects) {
|
|
944
|
+
try {
|
|
945
|
+
const childStore = getMemoryStore(child.projectPath);
|
|
946
|
+
const db = (childStore as any).db;
|
|
947
|
+
|
|
948
|
+
const stmt = db.prepare('SELECT * FROM prompt_history ORDER BY timestamp DESC LIMIT ?');
|
|
949
|
+
const childPrompts = stmt.all(limit) as PromptHistory[];
|
|
950
|
+
allPrompts.push(...childPrompts.map((p: PromptHistory) => ({ ...p, sourceProject: child.relativePath })));
|
|
951
|
+
} catch (error) {
|
|
952
|
+
if (process.env.DEBUG) {
|
|
953
|
+
console.error(`[Memory Store] Failed to get prompts for child ${child.projectPath}:`, error);
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
}
|
|
957
|
+
|
|
958
|
+
// Sort by timestamp and apply final limit
|
|
959
|
+
allPrompts.sort((a, b) => {
|
|
960
|
+
const aTime = a.timestamp ? new Date(a.timestamp).getTime() : 0;
|
|
961
|
+
const bTime = b.timestamp ? new Date(b.timestamp).getTime() : 0;
|
|
962
|
+
return bTime - aTime;
|
|
963
|
+
});
|
|
964
|
+
|
|
965
|
+
return allPrompts.slice(0, limit);
|
|
966
|
+
}
|
|
967
|
+
|
|
968
|
+
/**
|
|
969
|
+
* Close all store instances
|
|
970
|
+
*/
|
|
971
|
+
export function closeAllStores(): void {
|
|
972
|
+
for (const store of storeCache.values()) {
|
|
973
|
+
store.close();
|
|
974
|
+
}
|
|
975
|
+
storeCache.clear();
|
|
976
|
+
}
|
|
977
|
+
|
|
978
|
+
export default MemoryStore;
|