claude-code-workflow 6.1.4 → 6.2.2
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/.claude/CLAUDE.md +10 -0
- package/.claude/agents/action-planning-agent.md +857 -778
- package/.claude/agents/cli-execution-agent.md +266 -269
- package/.claude/agents/cli-explore-agent.md +2 -2
- package/.claude/agents/cli-lite-planning-agent.md +142 -92
- package/.claude/agents/cli-planning-agent.md +4 -4
- package/.claude/agents/code-developer.md +7 -6
- package/.claude/agents/conceptual-planning-agent.md +2 -2
- package/.claude/agents/context-search-agent.md +31 -32
- package/.claude/agents/doc-generator.md +4 -4
- package/.claude/agents/memory-bridge.md +93 -93
- package/.claude/agents/test-context-search-agent.md +8 -7
- package/.claude/agents/test-fix-agent.md +7 -6
- package/.claude/commands/clean.md +516 -0
- package/.claude/commands/memory/compact.md +383 -0
- package/.claude/commands/memory/docs-full-cli.md +471 -471
- package/.claude/commands/memory/docs-related-cli.md +386 -386
- package/.claude/commands/memory/docs.md +615 -615
- package/.claude/commands/memory/load.md +5 -5
- package/.claude/commands/memory/tech-research-rules.md +310 -0
- package/.claude/commands/memory/update-full.md +332 -332
- package/.claude/commands/memory/workflow-skill-memory.md +4 -4
- package/.claude/commands/task/create.md +151 -151
- package/.claude/commands/version.md +254 -254
- package/.claude/commands/workflow/brainstorm/api-designer.md +587 -585
- package/.claude/commands/workflow/brainstorm/artifacts.md +1 -0
- package/.claude/commands/workflow/brainstorm/auto-parallel.md +443 -443
- package/.claude/commands/workflow/brainstorm/data-architect.md +220 -220
- package/.claude/commands/workflow/brainstorm/product-manager.md +200 -200
- package/.claude/commands/workflow/brainstorm/product-owner.md +200 -200
- package/.claude/commands/workflow/brainstorm/scrum-master.md +200 -200
- package/.claude/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
- package/.claude/commands/workflow/brainstorm/system-architect.md +389 -387
- package/.claude/commands/workflow/brainstorm/ui-designer.md +221 -221
- package/.claude/commands/workflow/brainstorm/ux-expert.md +221 -221
- package/.claude/commands/workflow/debug.md +321 -0
- package/.claude/commands/workflow/execute.md +13 -0
- package/.claude/commands/workflow/init.md +165 -164
- package/.claude/commands/workflow/lite-execute.md +119 -13
- package/.claude/commands/workflow/lite-fix.md +623 -621
- package/.claude/commands/workflow/lite-plan.md +610 -592
- package/.claude/commands/workflow/plan.md +5 -5
- package/.claude/commands/workflow/review-module-cycle.md +2 -0
- package/.claude/commands/workflow/review-session-cycle.md +2 -0
- package/.claude/commands/workflow/review.md +297 -291
- package/.claude/commands/workflow/session/complete.md +153 -500
- package/.claude/commands/workflow/session/list.md +95 -95
- package/.claude/commands/workflow/session/resume.md +60 -60
- package/.claude/commands/workflow/session/start.md +199 -199
- package/.claude/commands/workflow/tdd-plan.md +3 -3
- package/.claude/commands/workflow/tdd-verify.md +23 -9
- package/.claude/commands/workflow/test-cycle-execute.md +2 -0
- package/.claude/commands/workflow/test-fix-gen.md +699 -699
- package/.claude/commands/workflow/tools/conflict-resolution.md +104 -18
- package/.claude/commands/workflow/tools/context-gather.md +436 -434
- package/.claude/commands/workflow/tools/task-generate-agent.md +490 -291
- package/.claude/commands/workflow/tools/task-generate-tdd.md +18 -10
- package/.claude/commands/workflow/tools/test-concept-enhanced.md +2 -1
- package/.claude/commands/workflow/tools/test-context-gather.md +1 -0
- package/.claude/commands/workflow/tools/test-task-generate.md +1 -0
- package/.claude/commands/workflow/ui-design/import-from-code.md +9 -6
- package/.claude/skills/command-guide/SKILL.md +5 -5
- package/.claude/skills/command-guide/index/all-commands.json +1 -1
- package/.claude/skills/command-guide/index/by-category.json +1 -1
- package/.claude/skills/command-guide/index/by-use-case.json +1 -1
- package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +857 -778
- package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +266 -269
- package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +2 -2
- package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +142 -92
- package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +4 -4
- package/.claude/skills/command-guide/reference/agents/code-developer.md +7 -6
- package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +2 -2
- package/.claude/skills/command-guide/reference/agents/context-search-agent.md +31 -32
- package/.claude/skills/command-guide/reference/agents/doc-generator.md +4 -4
- package/.claude/skills/command-guide/reference/agents/memory-bridge.md +93 -93
- package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +8 -7
- package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +7 -6
- package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +471 -471
- package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +386 -386
- package/.claude/skills/command-guide/reference/commands/memory/docs.md +17 -16
- package/.claude/skills/command-guide/reference/commands/memory/load.md +5 -5
- package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +194 -357
- package/.claude/skills/command-guide/reference/commands/memory/update-full.md +332 -332
- package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +4 -4
- package/.claude/skills/command-guide/reference/commands/task/create.md +151 -151
- package/.claude/skills/command-guide/reference/commands/version.md +254 -254
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +585 -585
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +443 -443
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +220 -220
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +200 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +200 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +200 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +200 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +387 -387
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +221 -221
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +221 -221
- package/.claude/skills/command-guide/reference/commands/workflow/execute.md +25 -20
- package/.claude/skills/command-guide/reference/commands/workflow/init.md +164 -164
- package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +748 -686
- package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +664 -621
- package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +645 -592
- package/.claude/skills/command-guide/reference/commands/workflow/plan.md +5 -5
- package/.claude/skills/command-guide/reference/commands/workflow/review.md +25 -18
- package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +547 -500
- package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +45 -27
- package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +35 -19
- package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +90 -33
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +3 -3
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +23 -9
- package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +699 -699
- package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +103 -17
- package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +434 -434
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +487 -291
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +17 -10
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +1 -1
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +6 -6
- package/.claude/workflows/chinese-response.md +38 -0
- package/.claude/workflows/cli-templates/prompts/rules/rule-api.txt +122 -0
- package/.claude/workflows/cli-templates/prompts/rules/rule-components.txt +122 -0
- package/.claude/workflows/cli-templates/prompts/rules/rule-config.txt +89 -0
- package/.claude/workflows/cli-templates/prompts/rules/rule-core.txt +60 -0
- package/.claude/workflows/cli-templates/prompts/rules/rule-patterns.txt +70 -0
- package/.claude/workflows/cli-templates/prompts/rules/rule-testing.txt +81 -0
- package/.claude/workflows/cli-templates/prompts/rules/tech-rules-agent-prompt.txt +89 -0
- package/.claude/workflows/cli-templates/prompts/workflow/gemini-solution-design.txt +131 -131
- package/.claude/workflows/cli-templates/prompts/workflow/skill-conflict-patterns.txt +5 -9
- package/.claude/workflows/cli-templates/prompts/workflow/skill-lessons-learned.txt +5 -9
- package/.claude/workflows/cli-templates/protocols/analysis-protocol.md +112 -0
- package/.claude/workflows/cli-templates/protocols/write-protocol.md +201 -0
- package/.claude/workflows/cli-templates/schemas/conflict-resolution-schema.json +137 -0
- package/.claude/workflows/cli-templates/schemas/debug-log-json-schema.json +127 -0
- package/.claude/workflows/cli-templates/schemas/fix-plan-json-schema.json +25 -0
- package/.claude/workflows/cli-templates/schemas/plan-json-schema.json +25 -0
- package/.claude/workflows/cli-tools-usage.md +526 -0
- package/{CLAUDE.md → .claude/workflows/coding-philosophy.md} +24 -45
- package/.claude/workflows/context-tools.md +84 -0
- package/.claude/workflows/file-modification.md +64 -0
- package/.claude/workflows/tool-strategy.md +216 -79
- package/.claude/workflows/windows-platform.md +16 -0
- package/.claude/workflows/workflow-architecture.md +942 -942
- package/.codex/AGENTS.md +63 -330
- package/.codex/prompts/debug.md +318 -0
- package/.codex/prompts/execute.md +273 -0
- package/.codex/prompts/lite-execute.md +164 -0
- package/.codex/prompts/lite-plan.md +469 -0
- package/.codex/prompts.zip +0 -0
- package/.gemini/GEMINI.md +25 -164
- package/.qwen/QWEN.md +0 -139
- package/README.md +29 -9
- package/ccw/README.md +30 -6
- package/ccw/bin/ccw-mcp.js +7 -0
- package/ccw/bin/ccw.js +9 -9
- package/ccw/package.json +65 -47
- package/ccw/src/.workflow/.cli-history/history.db +0 -0
- package/ccw/src/.workflow/.cli-history/history.db-shm +0 -0
- package/ccw/src/.workflow/.cli-history/history.db-wal +0 -0
- package/ccw/src/cli.ts +244 -0
- package/ccw/src/commands/cli.ts +740 -0
- package/ccw/src/commands/core-memory.ts +770 -0
- package/ccw/src/commands/hook.ts +315 -0
- package/ccw/src/commands/install.ts +519 -0
- package/ccw/src/commands/{list.js → list.ts} +1 -1
- package/ccw/src/commands/memory.ts +1090 -0
- package/ccw/src/commands/{serve.js → serve.ts} +14 -5
- package/ccw/src/commands/session-path-resolver.ts +372 -0
- package/ccw/src/commands/session.ts +1141 -0
- package/ccw/src/commands/{stop.js → stop.ts} +16 -6
- package/ccw/src/commands/tool.ts +201 -0
- package/ccw/src/commands/{uninstall.js → uninstall.ts} +89 -40
- package/ccw/src/commands/{upgrade.js → upgrade.ts} +68 -23
- package/ccw/src/commands/{view.js → view.ts} +22 -8
- package/ccw/src/config/storage-paths.ts +670 -0
- package/ccw/src/core/cache-manager.ts +294 -0
- package/ccw/src/core/claude-freshness.ts +319 -0
- package/ccw/src/core/core-memory-store.ts +1528 -0
- package/ccw/src/core/{dashboard-generator-patch.js → dashboard-generator-patch.ts} +18 -0
- package/ccw/src/core/{dashboard-generator.js → dashboard-generator.ts} +69 -12
- package/ccw/src/core/data-aggregator.ts +584 -0
- package/ccw/src/core/history-importer.ts +625 -0
- package/ccw/src/core/{lite-scanner.js → lite-scanner-complete.ts} +162 -66
- package/ccw/src/core/lite-scanner.ts +469 -0
- package/ccw/src/core/{manifest.js → manifest.ts} +104 -34
- package/ccw/src/core/memory-embedder-bridge.ts +262 -0
- package/ccw/src/core/memory-store.ts +978 -0
- package/ccw/src/core/routes/ccw-routes.ts +96 -0
- package/ccw/src/core/routes/claude-routes.ts +1183 -0
- package/ccw/src/core/routes/cli-routes.ts +561 -0
- package/ccw/src/core/routes/codexlens-routes.ts +806 -0
- package/ccw/src/core/routes/core-memory-routes.ts +605 -0
- package/ccw/src/core/routes/files-routes.ts +428 -0
- package/ccw/src/core/routes/graph-routes.md +164 -0
- package/ccw/src/core/routes/graph-routes.ts +626 -0
- package/ccw/src/core/routes/help-routes.ts +308 -0
- package/ccw/src/core/routes/hooks-routes.ts +405 -0
- package/ccw/src/core/routes/mcp-routes.ts +1271 -0
- package/ccw/src/core/routes/mcp-routes.ts.backup +550 -0
- package/ccw/src/core/routes/mcp-templates-db.ts +268 -0
- package/ccw/src/core/routes/memory-routes.ts +1206 -0
- package/ccw/src/core/routes/rules-routes.ts +526 -0
- package/ccw/src/core/routes/session-routes.ts +467 -0
- package/ccw/src/core/routes/skills-routes.ts +599 -0
- package/ccw/src/core/routes/status-routes.ts +57 -0
- package/ccw/src/core/routes/system-routes.ts +427 -0
- package/ccw/src/core/server.ts +431 -0
- package/ccw/src/core/session-clustering-service.ts +1258 -0
- package/ccw/src/core/session-scanner.ts +283 -0
- package/ccw/src/core/websocket.ts +190 -0
- package/ccw/src/{index.js → index.ts} +1 -0
- package/ccw/src/mcp-server/index.ts +186 -0
- package/ccw/src/templates/assets/css/github-dark.min.css +10 -0
- package/ccw/src/templates/assets/css/github.min.css +10 -0
- package/ccw/src/templates/assets/js/cytoscape.min.js +32 -0
- package/ccw/src/templates/assets/js/d3.min.js +2 -0
- package/ccw/src/templates/assets/js/highlight.min.js +1244 -0
- package/ccw/src/templates/assets/js/lucide.min.js +12 -0
- package/ccw/src/templates/assets/js/marked.min.js +69 -0
- package/ccw/src/templates/assets/js/tailwind.js +83 -0
- package/ccw/src/templates/dashboard-css/01-base.css +11 -0
- package/ccw/src/templates/dashboard-css/02-session.css +22 -0
- package/ccw/src/templates/dashboard-css/04-lite-tasks.css +10 -0
- package/ccw/src/templates/dashboard-css/06-cards.css +10 -4
- package/ccw/src/templates/dashboard-css/07-managers.css +1178 -7
- package/ccw/src/templates/dashboard-css/09-explorer.css +23 -12
- package/ccw/src/templates/dashboard-css/10-cli-status.css +337 -0
- package/ccw/src/templates/dashboard-css/11-cli-history.css +271 -0
- package/ccw/src/templates/dashboard-css/12-cli-legacy.css +796 -0
- package/ccw/src/templates/dashboard-css/13-cli-ccw.css +199 -0
- package/ccw/src/templates/dashboard-css/14-cli-modals.css +258 -0
- package/ccw/src/templates/dashboard-css/15-cli-endpoints.css +305 -0
- package/ccw/src/templates/dashboard-css/16-cli-session.css +241 -0
- package/ccw/src/templates/dashboard-css/17-cli-conversation.css +283 -0
- package/ccw/src/templates/dashboard-css/18-cli-settings.css +160 -0
- package/ccw/src/templates/dashboard-css/19-cli-native-session.css +496 -0
- package/ccw/src/templates/dashboard-css/20-cli-taskqueue.css +188 -0
- package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +310 -0
- package/ccw/src/templates/dashboard-css/22-cli-semantic.css +240 -0
- package/ccw/src/templates/dashboard-css/23-memory.css +2390 -0
- package/ccw/src/templates/dashboard-css/24-prompt-history.css +1089 -0
- package/ccw/src/templates/dashboard-css/25-skills-rules.css +326 -0
- package/ccw/src/templates/dashboard-css/26-claude-manager.css +908 -0
- package/ccw/src/templates/dashboard-css/27-graph-explorer.css +1678 -0
- package/ccw/src/templates/dashboard-css/28-mcp-manager.css +748 -0
- package/ccw/src/templates/dashboard-css/29-help.css +264 -0
- package/ccw/src/templates/dashboard-css/30-core-memory.css +1700 -0
- package/ccw/src/templates/dashboard-js/api.js +162 -142
- package/ccw/src/templates/dashboard-js/components/carousel.js +4 -4
- package/ccw/src/templates/dashboard-js/components/cli-history.js +876 -0
- package/ccw/src/templates/dashboard-js/components/cli-status.js +978 -0
- package/ccw/src/templates/dashboard-js/components/global-notifications.js +508 -219
- package/ccw/src/templates/dashboard-js/components/hook-manager.js +1277 -282
- package/ccw/src/templates/dashboard-js/components/index-manager.js +302 -0
- package/ccw/src/templates/dashboard-js/components/mcp-manager.js +718 -27
- package/ccw/src/templates/dashboard-js/components/modals.js +66 -0
- package/ccw/src/templates/dashboard-js/components/navigation.js +80 -12
- package/ccw/src/templates/dashboard-js/components/notifications.js +758 -194
- package/ccw/src/templates/dashboard-js/components/storage-manager.js +478 -0
- package/ccw/src/templates/dashboard-js/components/tabs-other.js +157 -6
- package/ccw/src/templates/dashboard-js/components/task-queue-sidebar.js +716 -0
- package/ccw/src/templates/dashboard-js/help-i18n.js +272 -0
- package/ccw/src/templates/dashboard-js/i18n.js +2807 -0
- package/ccw/src/templates/dashboard-js/main.js +15 -0
- package/ccw/src/templates/dashboard-js/state.js +243 -42
- package/ccw/src/templates/dashboard-js/utils.js +47 -1
- package/ccw/src/templates/dashboard-js/views/claude-manager.js +912 -0
- package/ccw/src/templates/dashboard-js/views/cli-manager.js +2272 -0
- package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +964 -0
- package/ccw/src/templates/dashboard-js/views/core-memory-clusters.js +503 -0
- package/ccw/src/templates/dashboard-js/views/core-memory.js +782 -0
- package/ccw/src/templates/dashboard-js/views/explorer.js +888 -852
- package/ccw/src/templates/dashboard-js/views/graph-explorer.js +1157 -0
- package/ccw/src/templates/dashboard-js/views/help.js +856 -0
- package/ccw/src/templates/dashboard-js/views/history.js +337 -0
- package/ccw/src/templates/dashboard-js/views/home.js +61 -15
- package/ccw/src/templates/dashboard-js/views/hook-manager.js +311 -43
- package/ccw/src/templates/dashboard-js/views/lite-tasks.js +204 -28
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js +2187 -411
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js.backup +1729 -0
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js.new +928 -0
- package/ccw/src/templates/dashboard-js/views/memory.js +1221 -0
- package/ccw/src/templates/dashboard-js/views/prompt-history.js +713 -0
- package/ccw/src/templates/dashboard-js/views/rules-manager.js +828 -0
- package/ccw/src/templates/dashboard-js/views/session-detail.js +54 -53
- package/ccw/src/templates/dashboard-js/views/skills-manager.js +819 -0
- package/ccw/src/templates/dashboard.html +185 -85
- package/ccw/src/templates/hooks-config-example.json +60 -0
- package/ccw/src/tools/classify-folders.ts +245 -0
- package/ccw/src/tools/cli-config-manager.ts +268 -0
- package/ccw/src/tools/cli-executor.ts +2014 -0
- package/ccw/src/tools/cli-history-store.ts +1195 -0
- package/ccw/src/tools/codex-lens.ts +1141 -0
- package/ccw/src/tools/{convert-tokens-to-css.js → convert-tokens-to-css.ts} +73 -23
- package/ccw/src/tools/core-memory.ts +444 -0
- package/ccw/src/tools/detect-changed-modules.ts +325 -0
- package/ccw/src/tools/{discover-design-files.js → discover-design-files.ts} +74 -24
- package/ccw/src/tools/edit-file.ts +568 -0
- package/ccw/src/tools/{generate-module-docs.js → generate-module-docs.ts} +207 -185
- package/ccw/src/tools/{get-modules-by-depth.js → get-modules-by-depth.ts} +120 -79
- package/ccw/src/tools/index.ts +370 -0
- package/ccw/src/tools/native-session-discovery.ts +795 -0
- package/ccw/src/tools/notifier.ts +129 -0
- package/ccw/src/tools/read-file.ts +410 -0
- package/ccw/src/tools/resume-strategy.ts +345 -0
- package/ccw/src/tools/session-content-parser.ts +619 -0
- package/ccw/src/tools/session-manager.ts +1026 -0
- package/ccw/src/tools/smart-context.ts +228 -0
- package/ccw/src/tools/smart-search.ts +2065 -0
- package/ccw/src/tools/smart-search.ts.backup +1233 -0
- package/ccw/src/tools/storage-manager.ts +455 -0
- package/ccw/src/tools/write-file.ts +222 -0
- package/ccw/src/types/config.ts +11 -0
- package/ccw/src/types/index.ts +3 -0
- package/ccw/src/types/session.ts +25 -0
- package/ccw/src/types/tool.ts +41 -0
- package/ccw/src/utils/{browser-launcher.js → browser-launcher.ts} +10 -8
- package/ccw/src/utils/file-utils.ts +48 -0
- package/ccw/src/utils/{path-resolver.js → path-resolver.ts} +114 -78
- package/ccw/src/utils/path-validator.ts +153 -0
- package/ccw/src/utils/{ui.js → ui.ts} +32 -25
- package/codex-lens/pyproject.toml +48 -0
- package/codex-lens/src/codexlens/.workflow/.cli-history/history.db +0 -0
- package/codex-lens/src/codexlens/__init__.py +28 -0
- package/codex-lens/src/codexlens/__main__.py +14 -0
- package/codex-lens/src/codexlens/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/__main__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/errors.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__init__.py +27 -0
- package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/cli/commands.py +1931 -0
- package/codex-lens/src/codexlens/cli/embedding_manager.py +620 -0
- package/codex-lens/src/codexlens/cli/model_manager.py +289 -0
- package/codex-lens/src/codexlens/cli/output.py +124 -0
- package/codex-lens/src/codexlens/config.py +201 -0
- package/codex-lens/src/codexlens/entities.py +121 -0
- package/codex-lens/src/codexlens/errors.py +55 -0
- package/codex-lens/src/codexlens/indexing/README.md +77 -0
- package/codex-lens/src/codexlens/indexing/__init__.py +4 -0
- package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/indexing/__pycache__/symbol_extractor.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/indexing/symbol_extractor.py +243 -0
- package/codex-lens/src/codexlens/parsers/__init__.py +8 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/encoding.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/encoding.py +202 -0
- package/codex-lens/src/codexlens/parsers/factory.py +256 -0
- package/codex-lens/src/codexlens/parsers/tokenizer.py +98 -0
- package/codex-lens/src/codexlens/parsers/treesitter_parser.py +335 -0
- package/codex-lens/src/codexlens/search/__init__.py +15 -0
- package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/enrichment.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/query_parser.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/chain_search.py +647 -0
- package/codex-lens/src/codexlens/search/enrichment.py +150 -0
- package/codex-lens/src/codexlens/search/hybrid_search.py +313 -0
- package/codex-lens/src/codexlens/search/query_parser.py +242 -0
- package/codex-lens/src/codexlens/search/ranking.py +274 -0
- package/codex-lens/src/codexlens/semantic/__init__.py +39 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/code_extractor.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/graph_analyzer.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/llm_enhancer.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/ann_index.py +414 -0
- package/codex-lens/src/codexlens/semantic/chunker.py +448 -0
- package/codex-lens/src/codexlens/semantic/code_extractor.py +274 -0
- package/codex-lens/src/codexlens/semantic/embedder.py +185 -0
- package/codex-lens/src/codexlens/semantic/vector_store.py +955 -0
- package/codex-lens/src/codexlens/storage/__init__.py +29 -0
- package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/file_cache.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/migration_manager.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/dir_index.py +1850 -0
- package/codex-lens/src/codexlens/storage/file_cache.py +32 -0
- package/codex-lens/src/codexlens/storage/index_tree.py +776 -0
- package/codex-lens/src/codexlens/storage/migration_manager.py +154 -0
- package/codex-lens/src/codexlens/storage/migrations/__init__.py +1 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_001_normalize_keywords.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_002_add_token_metadata.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_003_code_relationships.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_004_dual_fts.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_005_cleanup_unused_fields.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_001_normalize_keywords.py +123 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_002_add_token_metadata.py +48 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_004_dual_fts.py +232 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_005_cleanup_unused_fields.py +196 -0
- package/codex-lens/src/codexlens/storage/path_mapper.py +274 -0
- package/codex-lens/src/codexlens/storage/registry.py +670 -0
- package/codex-lens/src/codexlens/storage/sqlite_store.py +576 -0
- package/codex-lens/src/codexlens/storage/sqlite_utils.py +64 -0
- package/package.json +4 -1
- package/.claude/commands/memory/tech-research.md +0 -477
- 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/workflows/context-search-strategy.md +0 -77
- package/.claude/workflows/intelligent-tools-strategy.md +0 -662
- package/ccw/src/cli.js +0 -119
- package/ccw/src/commands/install.js +0 -324
- package/ccw/src/commands/tool.js +0 -138
- package/ccw/src/core/data-aggregator.js +0 -409
- package/ccw/src/core/server.js +0 -2063
- package/ccw/src/core/session-scanner.js +0 -235
- package/ccw/src/tools/classify-folders.js +0 -204
- package/ccw/src/tools/detect-changed-modules.js +0 -288
- package/ccw/src/tools/edit-file.js +0 -266
- package/ccw/src/tools/index.js +0 -176
- package/ccw/src/utils/file-utils.js +0 -48
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"""Pydantic entity models for CodexLens."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from enum import Enum
|
|
6
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
7
|
+
|
|
8
|
+
from pydantic import BaseModel, Field, field_validator
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Symbol(BaseModel):
|
|
12
|
+
"""A code symbol discovered in a file."""
|
|
13
|
+
|
|
14
|
+
name: str = Field(..., min_length=1)
|
|
15
|
+
kind: str = Field(..., min_length=1)
|
|
16
|
+
range: Tuple[int, int] = Field(..., description="(start_line, end_line), 1-based inclusive")
|
|
17
|
+
file: Optional[str] = Field(default=None, description="Full path to the file containing this symbol")
|
|
18
|
+
|
|
19
|
+
@field_validator("range")
|
|
20
|
+
@classmethod
|
|
21
|
+
def validate_range(cls, value: Tuple[int, int]) -> Tuple[int, int]:
|
|
22
|
+
if len(value) != 2:
|
|
23
|
+
raise ValueError("range must be a (start_line, end_line) tuple")
|
|
24
|
+
start_line, end_line = value
|
|
25
|
+
if start_line < 1 or end_line < 1:
|
|
26
|
+
raise ValueError("range lines must be >= 1")
|
|
27
|
+
if end_line < start_line:
|
|
28
|
+
raise ValueError("end_line must be >= start_line")
|
|
29
|
+
return value
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
class SemanticChunk(BaseModel):
|
|
33
|
+
"""A semantically meaningful chunk of content, optionally embedded."""
|
|
34
|
+
|
|
35
|
+
content: str = Field(..., min_length=1)
|
|
36
|
+
embedding: Optional[List[float]] = Field(default=None, description="Vector embedding for semantic search")
|
|
37
|
+
metadata: Dict[str, Any] = Field(default_factory=dict)
|
|
38
|
+
|
|
39
|
+
@field_validator("embedding")
|
|
40
|
+
@classmethod
|
|
41
|
+
def validate_embedding(cls, value: Optional[List[float]]) -> Optional[List[float]]:
|
|
42
|
+
if value is None:
|
|
43
|
+
return value
|
|
44
|
+
if not value:
|
|
45
|
+
raise ValueError("embedding cannot be empty when provided")
|
|
46
|
+
return value
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class IndexedFile(BaseModel):
|
|
50
|
+
"""An indexed source file with symbols and optional semantic chunks."""
|
|
51
|
+
|
|
52
|
+
path: str = Field(..., min_length=1)
|
|
53
|
+
language: str = Field(..., min_length=1)
|
|
54
|
+
symbols: List[Symbol] = Field(default_factory=list)
|
|
55
|
+
chunks: List[SemanticChunk] = Field(default_factory=list)
|
|
56
|
+
|
|
57
|
+
@field_validator("path", "language")
|
|
58
|
+
@classmethod
|
|
59
|
+
def strip_and_validate_nonempty(cls, value: str) -> str:
|
|
60
|
+
cleaned = value.strip()
|
|
61
|
+
if not cleaned:
|
|
62
|
+
raise ValueError("value cannot be blank")
|
|
63
|
+
return cleaned
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class RelationshipType(str, Enum):
|
|
67
|
+
"""Types of code relationships."""
|
|
68
|
+
CALL = "call"
|
|
69
|
+
INHERITS = "inherits"
|
|
70
|
+
IMPORTS = "imports"
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class CodeRelationship(BaseModel):
|
|
74
|
+
"""A relationship between code symbols (e.g., function calls, inheritance)."""
|
|
75
|
+
|
|
76
|
+
source_symbol: str = Field(..., min_length=1, description="Name of source symbol")
|
|
77
|
+
target_symbol: str = Field(..., min_length=1, description="Name of target symbol")
|
|
78
|
+
relationship_type: RelationshipType = Field(..., description="Type of relationship (call, inherits, etc.)")
|
|
79
|
+
source_file: str = Field(..., min_length=1, description="File path containing source symbol")
|
|
80
|
+
target_file: Optional[str] = Field(default=None, description="File path containing target (None if same file)")
|
|
81
|
+
source_line: int = Field(..., ge=1, description="Line number where relationship occurs (1-based)")
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class AdditionalLocation(BaseModel):
|
|
85
|
+
"""A pointer to another location where a similar result was found.
|
|
86
|
+
|
|
87
|
+
Used for grouping search results with similar scores and content,
|
|
88
|
+
where the primary result is stored in SearchResult and secondary
|
|
89
|
+
locations are stored in this model.
|
|
90
|
+
"""
|
|
91
|
+
|
|
92
|
+
path: str = Field(..., min_length=1)
|
|
93
|
+
score: float = Field(..., ge=0.0)
|
|
94
|
+
start_line: Optional[int] = Field(default=None, description="Start line of the result (1-based)")
|
|
95
|
+
end_line: Optional[int] = Field(default=None, description="End line of the result (1-based)")
|
|
96
|
+
symbol_name: Optional[str] = Field(default=None, description="Name of matched symbol")
|
|
97
|
+
|
|
98
|
+
|
|
99
|
+
class SearchResult(BaseModel):
|
|
100
|
+
"""A unified search result for lexical or semantic search."""
|
|
101
|
+
|
|
102
|
+
path: str = Field(..., min_length=1)
|
|
103
|
+
score: float = Field(..., ge=0.0)
|
|
104
|
+
excerpt: Optional[str] = None
|
|
105
|
+
content: Optional[str] = Field(default=None, description="Full content of matched code block")
|
|
106
|
+
symbol: Optional[Symbol] = None
|
|
107
|
+
chunk: Optional[SemanticChunk] = None
|
|
108
|
+
metadata: Dict[str, Any] = Field(default_factory=dict)
|
|
109
|
+
|
|
110
|
+
# Additional context for complete code blocks
|
|
111
|
+
start_line: Optional[int] = Field(default=None, description="Start line of code block (1-based)")
|
|
112
|
+
end_line: Optional[int] = Field(default=None, description="End line of code block (1-based)")
|
|
113
|
+
symbol_name: Optional[str] = Field(default=None, description="Name of matched symbol/function/class")
|
|
114
|
+
symbol_kind: Optional[str] = Field(default=None, description="Kind of symbol (function/class/method)")
|
|
115
|
+
|
|
116
|
+
# Field for grouping similar results
|
|
117
|
+
additional_locations: List["AdditionalLocation"] = Field(
|
|
118
|
+
default_factory=list,
|
|
119
|
+
description="Other locations for grouped results with similar scores and content."
|
|
120
|
+
)
|
|
121
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
"""CodexLens exception hierarchy."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class CodexLensError(Exception):
|
|
7
|
+
"""Base class for all CodexLens errors."""
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ConfigError(CodexLensError):
|
|
11
|
+
"""Raised when configuration is invalid or cannot be loaded."""
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ParseError(CodexLensError):
|
|
15
|
+
"""Raised when parsing or indexing a file fails."""
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class StorageError(CodexLensError):
|
|
19
|
+
"""Raised when reading/writing index storage fails.
|
|
20
|
+
|
|
21
|
+
Attributes:
|
|
22
|
+
message: Human-readable error description
|
|
23
|
+
db_path: Path to the database file (if applicable)
|
|
24
|
+
operation: The operation that failed (e.g., 'query', 'initialize', 'migrate')
|
|
25
|
+
details: Additional context for debugging
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
def __init__(
|
|
29
|
+
self,
|
|
30
|
+
message: str,
|
|
31
|
+
db_path: str | None = None,
|
|
32
|
+
operation: str | None = None,
|
|
33
|
+
details: dict | None = None
|
|
34
|
+
) -> None:
|
|
35
|
+
super().__init__(message)
|
|
36
|
+
self.message = message
|
|
37
|
+
self.db_path = db_path
|
|
38
|
+
self.operation = operation
|
|
39
|
+
self.details = details or {}
|
|
40
|
+
|
|
41
|
+
def __str__(self) -> str:
|
|
42
|
+
parts = [self.message]
|
|
43
|
+
if self.db_path:
|
|
44
|
+
parts.append(f"[db: {self.db_path}]")
|
|
45
|
+
if self.operation:
|
|
46
|
+
parts.append(f"[op: {self.operation}]")
|
|
47
|
+
if self.details:
|
|
48
|
+
detail_str = ", ".join(f"{k}={v}" for k, v in self.details.items())
|
|
49
|
+
parts.append(f"[{detail_str}]")
|
|
50
|
+
return " ".join(parts)
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
class SearchError(CodexLensError):
|
|
54
|
+
"""Raised when a search operation fails."""
|
|
55
|
+
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# Symbol Extraction and Indexing
|
|
2
|
+
|
|
3
|
+
This module provides symbol extraction and relationship tracking for code graph enrichment.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The `SymbolExtractor` class extracts code symbols (functions, classes) and their relationships (calls, imports) from source files using regex-based pattern matching.
|
|
8
|
+
|
|
9
|
+
## Supported Languages
|
|
10
|
+
|
|
11
|
+
- Python (.py)
|
|
12
|
+
- TypeScript (.ts, .tsx)
|
|
13
|
+
- JavaScript (.js, .jsx)
|
|
14
|
+
|
|
15
|
+
## Database Schema
|
|
16
|
+
|
|
17
|
+
### Symbols Table
|
|
18
|
+
Stores code symbols with their location information:
|
|
19
|
+
- `id`: Primary key
|
|
20
|
+
- `qualified_name`: Fully qualified name (e.g., "module.ClassName")
|
|
21
|
+
- `name`: Symbol name
|
|
22
|
+
- `kind`: Symbol type (function, class)
|
|
23
|
+
- `file_path`: Path to source file
|
|
24
|
+
- `start_line`: Starting line number
|
|
25
|
+
- `end_line`: Ending line number
|
|
26
|
+
|
|
27
|
+
### Symbol Relationships Table
|
|
28
|
+
Stores relationships between symbols:
|
|
29
|
+
- `id`: Primary key
|
|
30
|
+
- `source_symbol_id`: Foreign key to symbols table
|
|
31
|
+
- `target_symbol_fqn`: Fully qualified name of target symbol
|
|
32
|
+
- `relationship_type`: Type of relationship (calls, imports)
|
|
33
|
+
- `file_path`: Path to source file
|
|
34
|
+
- `line`: Line number where relationship occurs
|
|
35
|
+
|
|
36
|
+
## Usage Example
|
|
37
|
+
|
|
38
|
+
```python
|
|
39
|
+
from pathlib import Path
|
|
40
|
+
from codexlens.indexing.symbol_extractor import SymbolExtractor
|
|
41
|
+
|
|
42
|
+
# Initialize extractor
|
|
43
|
+
db_path = Path("./code_index.db")
|
|
44
|
+
extractor = SymbolExtractor(db_path)
|
|
45
|
+
extractor.connect()
|
|
46
|
+
|
|
47
|
+
# Extract from file
|
|
48
|
+
file_path = Path("src/my_module.py")
|
|
49
|
+
with open(file_path) as f:
|
|
50
|
+
content = f.read()
|
|
51
|
+
|
|
52
|
+
symbols, relationships = extractor.extract_from_file(file_path, content)
|
|
53
|
+
|
|
54
|
+
# Save to database
|
|
55
|
+
name_to_id = extractor.save_symbols(symbols)
|
|
56
|
+
extractor.save_relationships(relationships, name_to_id)
|
|
57
|
+
|
|
58
|
+
# Clean up
|
|
59
|
+
extractor.close()
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Pattern Matching
|
|
63
|
+
|
|
64
|
+
The extractor uses regex patterns to identify:
|
|
65
|
+
|
|
66
|
+
- **Functions**: Function definitions (including async, export keywords)
|
|
67
|
+
- **Classes**: Class definitions (including export keyword)
|
|
68
|
+
- **Imports**: Import/require statements
|
|
69
|
+
- **Calls**: Function/method invocations
|
|
70
|
+
|
|
71
|
+
## Future Enhancements
|
|
72
|
+
|
|
73
|
+
- Tree-sitter integration for more accurate parsing
|
|
74
|
+
- Support for additional languages
|
|
75
|
+
- Method and variable extraction
|
|
76
|
+
- Enhanced scope tracking
|
|
77
|
+
- Relationship type expansion (inherits, implements, etc.)
|
|
Binary file
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
"""Symbol and relationship extraction from source code."""
|
|
2
|
+
import re
|
|
3
|
+
import sqlite3
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Any, Dict, List, Optional, Tuple
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class SymbolExtractor:
|
|
9
|
+
"""Extract symbols and relationships from source code using regex patterns."""
|
|
10
|
+
|
|
11
|
+
# Pattern definitions for different languages
|
|
12
|
+
PATTERNS = {
|
|
13
|
+
'python': {
|
|
14
|
+
'function': r'^(?:async\s+)?def\s+(\w+)\s*\(',
|
|
15
|
+
'class': r'^class\s+(\w+)\s*[:\(]',
|
|
16
|
+
'import': r'^(?:from\s+([\w.]+)\s+)?import\s+([\w.,\s]+)',
|
|
17
|
+
'call': r'(?<![.\w])(\w+)\s*\(',
|
|
18
|
+
},
|
|
19
|
+
'typescript': {
|
|
20
|
+
'function': r'(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*[<\(]',
|
|
21
|
+
'class': r'(?:export\s+)?class\s+(\w+)',
|
|
22
|
+
'import': r"import\s+.*\s+from\s+['\"]([^'\"]+)['\"]",
|
|
23
|
+
'call': r'(?<![.\w])(\w+)\s*[<\(]',
|
|
24
|
+
},
|
|
25
|
+
'javascript': {
|
|
26
|
+
'function': r'(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*\(',
|
|
27
|
+
'class': r'(?:export\s+)?class\s+(\w+)',
|
|
28
|
+
'import': r"(?:import|require)\s*\(?['\"]([^'\"]+)['\"]",
|
|
29
|
+
'call': r'(?<![.\w])(\w+)\s*\(',
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
LANGUAGE_MAP = {
|
|
34
|
+
'.py': 'python',
|
|
35
|
+
'.ts': 'typescript',
|
|
36
|
+
'.tsx': 'typescript',
|
|
37
|
+
'.js': 'javascript',
|
|
38
|
+
'.jsx': 'javascript',
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
def __init__(self, db_path: Path):
|
|
42
|
+
self.db_path = db_path
|
|
43
|
+
self.db_conn: Optional[sqlite3.Connection] = None
|
|
44
|
+
|
|
45
|
+
def connect(self) -> None:
|
|
46
|
+
"""Connect to database and ensure schema exists."""
|
|
47
|
+
self.db_conn = sqlite3.connect(str(self.db_path))
|
|
48
|
+
self._ensure_tables()
|
|
49
|
+
|
|
50
|
+
def __enter__(self) -> "SymbolExtractor":
|
|
51
|
+
"""Context manager entry: connect to database."""
|
|
52
|
+
self.connect()
|
|
53
|
+
return self
|
|
54
|
+
|
|
55
|
+
def __exit__(self, exc_type: Any, exc_val: Any, exc_tb: Any) -> None:
|
|
56
|
+
"""Context manager exit: close database connection."""
|
|
57
|
+
self.close()
|
|
58
|
+
|
|
59
|
+
def _ensure_tables(self) -> None:
|
|
60
|
+
"""Create symbols and relationships tables if they don't exist."""
|
|
61
|
+
if not self.db_conn:
|
|
62
|
+
return
|
|
63
|
+
cursor = self.db_conn.cursor()
|
|
64
|
+
|
|
65
|
+
# Create symbols table with qualified_name
|
|
66
|
+
cursor.execute('''
|
|
67
|
+
CREATE TABLE IF NOT EXISTS symbols (
|
|
68
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
69
|
+
qualified_name TEXT NOT NULL,
|
|
70
|
+
name TEXT NOT NULL,
|
|
71
|
+
kind TEXT NOT NULL,
|
|
72
|
+
file_path TEXT NOT NULL,
|
|
73
|
+
start_line INTEGER NOT NULL,
|
|
74
|
+
end_line INTEGER NOT NULL,
|
|
75
|
+
UNIQUE(file_path, name, start_line)
|
|
76
|
+
)
|
|
77
|
+
''')
|
|
78
|
+
|
|
79
|
+
# Create relationships table with target_symbol_fqn
|
|
80
|
+
cursor.execute('''
|
|
81
|
+
CREATE TABLE IF NOT EXISTS symbol_relationships (
|
|
82
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
83
|
+
source_symbol_id INTEGER NOT NULL,
|
|
84
|
+
target_symbol_fqn TEXT NOT NULL,
|
|
85
|
+
relationship_type TEXT NOT NULL,
|
|
86
|
+
file_path TEXT NOT NULL,
|
|
87
|
+
line INTEGER,
|
|
88
|
+
FOREIGN KEY (source_symbol_id) REFERENCES symbols(id) ON DELETE CASCADE
|
|
89
|
+
)
|
|
90
|
+
''')
|
|
91
|
+
|
|
92
|
+
# Create performance indexes
|
|
93
|
+
cursor.execute('CREATE INDEX IF NOT EXISTS idx_symbols_name ON symbols(name)')
|
|
94
|
+
cursor.execute('CREATE INDEX IF NOT EXISTS idx_symbols_file ON symbols(file_path)')
|
|
95
|
+
cursor.execute('CREATE INDEX IF NOT EXISTS idx_rel_source ON symbol_relationships(source_symbol_id)')
|
|
96
|
+
cursor.execute('CREATE INDEX IF NOT EXISTS idx_rel_target ON symbol_relationships(target_symbol_fqn)')
|
|
97
|
+
cursor.execute('CREATE INDEX IF NOT EXISTS idx_rel_type ON symbol_relationships(relationship_type)')
|
|
98
|
+
|
|
99
|
+
self.db_conn.commit()
|
|
100
|
+
|
|
101
|
+
def extract_from_file(self, file_path: Path, content: str) -> Tuple[List[Dict], List[Dict]]:
|
|
102
|
+
"""Extract symbols and relationships from file content.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
file_path: Path to the source file
|
|
106
|
+
content: File content as string
|
|
107
|
+
|
|
108
|
+
Returns:
|
|
109
|
+
Tuple of (symbols, relationships) where:
|
|
110
|
+
- symbols: List of symbol dicts with qualified_name, name, kind, file_path, start_line, end_line
|
|
111
|
+
- relationships: List of relationship dicts with source_scope, target, type, file_path, line
|
|
112
|
+
"""
|
|
113
|
+
ext = file_path.suffix.lower()
|
|
114
|
+
lang = self.LANGUAGE_MAP.get(ext)
|
|
115
|
+
|
|
116
|
+
if not lang or lang not in self.PATTERNS:
|
|
117
|
+
return [], []
|
|
118
|
+
|
|
119
|
+
patterns = self.PATTERNS[lang]
|
|
120
|
+
symbols = []
|
|
121
|
+
relationships = []
|
|
122
|
+
lines = content.split('\n')
|
|
123
|
+
|
|
124
|
+
current_scope = None
|
|
125
|
+
|
|
126
|
+
for line_num, line in enumerate(lines, 1):
|
|
127
|
+
# Extract function/class definitions
|
|
128
|
+
for kind in ['function', 'class']:
|
|
129
|
+
if kind in patterns:
|
|
130
|
+
match = re.search(patterns[kind], line)
|
|
131
|
+
if match:
|
|
132
|
+
name = match.group(1)
|
|
133
|
+
qualified_name = f"{file_path.stem}.{name}"
|
|
134
|
+
symbols.append({
|
|
135
|
+
'qualified_name': qualified_name,
|
|
136
|
+
'name': name,
|
|
137
|
+
'kind': kind,
|
|
138
|
+
'file_path': str(file_path),
|
|
139
|
+
'start_line': line_num,
|
|
140
|
+
'end_line': line_num, # Simplified - would need proper parsing for actual end
|
|
141
|
+
})
|
|
142
|
+
current_scope = name
|
|
143
|
+
|
|
144
|
+
# Extract imports
|
|
145
|
+
if 'import' in patterns:
|
|
146
|
+
match = re.search(patterns['import'], line)
|
|
147
|
+
if match:
|
|
148
|
+
import_target = match.group(1) or match.group(2) if match.lastindex >= 2 else match.group(1)
|
|
149
|
+
if import_target and current_scope:
|
|
150
|
+
relationships.append({
|
|
151
|
+
'source_scope': current_scope,
|
|
152
|
+
'target': import_target.strip(),
|
|
153
|
+
'type': 'imports',
|
|
154
|
+
'file_path': str(file_path),
|
|
155
|
+
'line': line_num,
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
# Extract function calls (simplified)
|
|
159
|
+
if 'call' in patterns and current_scope:
|
|
160
|
+
for match in re.finditer(patterns['call'], line):
|
|
161
|
+
call_name = match.group(1)
|
|
162
|
+
# Skip common keywords and the current function
|
|
163
|
+
if call_name not in ['if', 'for', 'while', 'return', 'print', 'len', 'str', 'int', 'float', 'list', 'dict', 'set', 'tuple', current_scope]:
|
|
164
|
+
relationships.append({
|
|
165
|
+
'source_scope': current_scope,
|
|
166
|
+
'target': call_name,
|
|
167
|
+
'type': 'calls',
|
|
168
|
+
'file_path': str(file_path),
|
|
169
|
+
'line': line_num,
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
return symbols, relationships
|
|
173
|
+
|
|
174
|
+
def save_symbols(self, symbols: List[Dict]) -> Dict[str, int]:
|
|
175
|
+
"""Save symbols to database and return name->id mapping.
|
|
176
|
+
|
|
177
|
+
Args:
|
|
178
|
+
symbols: List of symbol dicts with qualified_name, name, kind, file_path, start_line, end_line
|
|
179
|
+
|
|
180
|
+
Returns:
|
|
181
|
+
Dictionary mapping symbol name to database id
|
|
182
|
+
"""
|
|
183
|
+
if not self.db_conn or not symbols:
|
|
184
|
+
return {}
|
|
185
|
+
|
|
186
|
+
cursor = self.db_conn.cursor()
|
|
187
|
+
name_to_id = {}
|
|
188
|
+
|
|
189
|
+
for sym in symbols:
|
|
190
|
+
try:
|
|
191
|
+
cursor.execute('''
|
|
192
|
+
INSERT OR IGNORE INTO symbols
|
|
193
|
+
(qualified_name, name, kind, file_path, start_line, end_line)
|
|
194
|
+
VALUES (?, ?, ?, ?, ?, ?)
|
|
195
|
+
''', (sym['qualified_name'], sym['name'], sym['kind'],
|
|
196
|
+
sym['file_path'], sym['start_line'], sym['end_line']))
|
|
197
|
+
|
|
198
|
+
# Get the id
|
|
199
|
+
cursor.execute('''
|
|
200
|
+
SELECT id FROM symbols
|
|
201
|
+
WHERE file_path = ? AND name = ? AND start_line = ?
|
|
202
|
+
''', (sym['file_path'], sym['name'], sym['start_line']))
|
|
203
|
+
|
|
204
|
+
row = cursor.fetchone()
|
|
205
|
+
if row:
|
|
206
|
+
name_to_id[sym['name']] = row[0]
|
|
207
|
+
except sqlite3.Error:
|
|
208
|
+
continue
|
|
209
|
+
|
|
210
|
+
self.db_conn.commit()
|
|
211
|
+
return name_to_id
|
|
212
|
+
|
|
213
|
+
def save_relationships(self, relationships: List[Dict], name_to_id: Dict[str, int]) -> None:
|
|
214
|
+
"""Save relationships to database.
|
|
215
|
+
|
|
216
|
+
Args:
|
|
217
|
+
relationships: List of relationship dicts with source_scope, target, type, file_path, line
|
|
218
|
+
name_to_id: Dictionary mapping symbol names to database ids
|
|
219
|
+
"""
|
|
220
|
+
if not self.db_conn or not relationships:
|
|
221
|
+
return
|
|
222
|
+
|
|
223
|
+
cursor = self.db_conn.cursor()
|
|
224
|
+
|
|
225
|
+
for rel in relationships:
|
|
226
|
+
source_id = name_to_id.get(rel['source_scope'])
|
|
227
|
+
if source_id:
|
|
228
|
+
try:
|
|
229
|
+
cursor.execute('''
|
|
230
|
+
INSERT INTO symbol_relationships
|
|
231
|
+
(source_symbol_id, target_symbol_fqn, relationship_type, file_path, line)
|
|
232
|
+
VALUES (?, ?, ?, ?, ?)
|
|
233
|
+
''', (source_id, rel['target'], rel['type'], rel['file_path'], rel['line']))
|
|
234
|
+
except sqlite3.Error:
|
|
235
|
+
continue
|
|
236
|
+
|
|
237
|
+
self.db_conn.commit()
|
|
238
|
+
|
|
239
|
+
def close(self) -> None:
|
|
240
|
+
"""Close database connection."""
|
|
241
|
+
if self.db_conn:
|
|
242
|
+
self.db_conn.close()
|
|
243
|
+
self.db_conn = None
|