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,478 @@
|
|
|
1
|
+
// ==========================================
|
|
2
|
+
// STORAGE MANAGER COMPONENT
|
|
3
|
+
// ==========================================
|
|
4
|
+
// Manages CCW centralized storage (~/.ccw/)
|
|
5
|
+
|
|
6
|
+
// State
|
|
7
|
+
let storageData = null;
|
|
8
|
+
let storageLoading = false;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Initialize storage manager
|
|
12
|
+
*/
|
|
13
|
+
async function initStorageManager() {
|
|
14
|
+
await loadStorageStats();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Load storage statistics from API
|
|
19
|
+
*/
|
|
20
|
+
async function loadStorageStats() {
|
|
21
|
+
if (storageLoading) return;
|
|
22
|
+
storageLoading = true;
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
const res = await fetch('/api/storage/stats');
|
|
26
|
+
if (!res.ok) throw new Error('Failed to load storage stats');
|
|
27
|
+
storageData = await res.json();
|
|
28
|
+
renderStorageCard();
|
|
29
|
+
} catch (err) {
|
|
30
|
+
console.error('Failed to load storage stats:', err);
|
|
31
|
+
renderStorageCardError(err.message);
|
|
32
|
+
} finally {
|
|
33
|
+
storageLoading = false;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Render storage card in the dashboard
|
|
39
|
+
*/
|
|
40
|
+
function renderStorageCard() {
|
|
41
|
+
const container = document.getElementById('storageCard');
|
|
42
|
+
if (!container || !storageData) return;
|
|
43
|
+
|
|
44
|
+
const { location, totalSizeFormatted, projectCount, projects } = storageData;
|
|
45
|
+
|
|
46
|
+
// Format relative time
|
|
47
|
+
const formatTimeAgo = (isoString) => {
|
|
48
|
+
if (!isoString) return 'Never';
|
|
49
|
+
const date = new Date(isoString);
|
|
50
|
+
const now = new Date();
|
|
51
|
+
const diffMs = now - date;
|
|
52
|
+
const diffMins = Math.floor(diffMs / 60000);
|
|
53
|
+
const diffHours = Math.floor(diffMins / 60);
|
|
54
|
+
const diffDays = Math.floor(diffHours / 24);
|
|
55
|
+
if (diffMins < 1) return 'Just now';
|
|
56
|
+
if (diffMins < 60) return diffMins + 'm ago';
|
|
57
|
+
if (diffHours < 24) return diffHours + 'h ago';
|
|
58
|
+
if (diffDays < 30) return diffDays + 'd ago';
|
|
59
|
+
return date.toLocaleDateString();
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// Build project tree (hierarchical view)
|
|
63
|
+
let projectRows = '';
|
|
64
|
+
if (projects && projects.length > 0) {
|
|
65
|
+
const tree = buildProjectTree(projects);
|
|
66
|
+
projectRows = renderProjectTree(tree, 0, formatTimeAgo);
|
|
67
|
+
|
|
68
|
+
// Initially hide all child rows (level > 0)
|
|
69
|
+
setTimeout(() => {
|
|
70
|
+
const allRows = document.querySelectorAll('.project-row');
|
|
71
|
+
allRows.forEach(row => {
|
|
72
|
+
const level = parseInt(row.getAttribute('data-level'));
|
|
73
|
+
if (level > 0) {
|
|
74
|
+
row.style.display = 'none';
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
}, 0);
|
|
78
|
+
} else {
|
|
79
|
+
projectRows = '\
|
|
80
|
+
<tr>\
|
|
81
|
+
<td colspan="5" class="py-4 text-center text-muted-foreground text-sm">No storage data yet</td>\
|
|
82
|
+
</tr>\
|
|
83
|
+
';
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
container.innerHTML = '\
|
|
87
|
+
<div class="bg-card border border-border rounded-lg overflow-hidden">\
|
|
88
|
+
<div class="bg-muted/30 border-b border-border px-4 py-3 flex items-center justify-between">\
|
|
89
|
+
<div class="flex items-center gap-2">\
|
|
90
|
+
<i data-lucide="hard-drive" class="w-4 h-4 text-primary"></i>\
|
|
91
|
+
<span class="font-medium text-foreground">Storage Manager</span>\
|
|
92
|
+
<span class="text-xs px-2 py-0.5 bg-muted rounded-full text-muted-foreground">' + totalSizeFormatted + '</span>\
|
|
93
|
+
</div>\
|
|
94
|
+
<div class="flex items-center gap-2">\
|
|
95
|
+
<button onclick="loadStorageStats()" class="text-xs px-2 py-1 text-muted-foreground hover:text-foreground hover:bg-muted rounded transition-colors" title="Refresh">\
|
|
96
|
+
<i data-lucide="refresh-cw" class="w-3.5 h-3.5"></i>\
|
|
97
|
+
</button>\
|
|
98
|
+
<button onclick="showStorageConfig()" class="text-xs px-2 py-1 text-muted-foreground hover:text-foreground hover:bg-muted rounded transition-colors" title="Settings">\
|
|
99
|
+
<i data-lucide="settings" class="w-3.5 h-3.5"></i>\
|
|
100
|
+
</button>\
|
|
101
|
+
</div>\
|
|
102
|
+
</div>\
|
|
103
|
+
<div class="p-4">\
|
|
104
|
+
<div class="flex items-center gap-2 mb-3 text-xs text-muted-foreground">\
|
|
105
|
+
<i data-lucide="folder" class="w-3.5 h-3.5"></i>\
|
|
106
|
+
<span class="font-mono truncate" title="' + escapeHtml(location) + '">' + escapeHtml(location) + '</span>\
|
|
107
|
+
</div>\
|
|
108
|
+
<div class="grid grid-cols-3 gap-3 mb-4">\
|
|
109
|
+
<div class="bg-muted/30 rounded-lg p-3 text-center">\
|
|
110
|
+
<div class="text-lg font-semibold text-foreground">' + projectCount + '</div>\
|
|
111
|
+
<div class="text-xs text-muted-foreground">Projects</div>\
|
|
112
|
+
</div>\
|
|
113
|
+
<div class="bg-muted/30 rounded-lg p-3 text-center">\
|
|
114
|
+
<div class="text-lg font-semibold text-foreground">' + totalSizeFormatted + '</div>\
|
|
115
|
+
<div class="text-xs text-muted-foreground">Total Size</div>\
|
|
116
|
+
</div>\
|
|
117
|
+
<div class="bg-muted/30 rounded-lg p-3 text-center">\
|
|
118
|
+
<div class="text-lg font-semibold text-foreground">' + getTotalRecords() + '</div>\
|
|
119
|
+
<div class="text-xs text-muted-foreground">Records</div>\
|
|
120
|
+
</div>\
|
|
121
|
+
</div>\
|
|
122
|
+
<div class="border border-border rounded-lg overflow-hidden">\
|
|
123
|
+
<table class="w-full text-sm">\
|
|
124
|
+
<thead class="bg-muted/50">\
|
|
125
|
+
<tr class="text-xs text-muted-foreground">\
|
|
126
|
+
<th class="py-2 px-2 text-left font-medium">Project ID</th>\
|
|
127
|
+
<th class="py-2 px-2 text-right font-medium">Size</th>\
|
|
128
|
+
<th class="py-2 px-2 text-center font-medium">History</th>\
|
|
129
|
+
<th class="py-2 px-2 text-right font-medium">Last Used</th>\
|
|
130
|
+
<th class="py-2 px-1 w-8"></th>\
|
|
131
|
+
</tr>\
|
|
132
|
+
</thead>\
|
|
133
|
+
<tbody>\
|
|
134
|
+
' + projectRows + '\
|
|
135
|
+
</tbody>\
|
|
136
|
+
</table>\
|
|
137
|
+
</div>\
|
|
138
|
+
<div class="mt-4 flex justify-end gap-2">\
|
|
139
|
+
<button onclick="cleanAllStorageConfirm()" \
|
|
140
|
+
class="text-xs px-3 py-1.5 bg-destructive/10 text-destructive hover:bg-destructive/20 rounded transition-colors flex items-center gap-1.5">\
|
|
141
|
+
<i data-lucide="trash" class="w-3.5 h-3.5"></i>\
|
|
142
|
+
Clean All\
|
|
143
|
+
</button>\
|
|
144
|
+
</div>\
|
|
145
|
+
</div>\
|
|
146
|
+
</div>\
|
|
147
|
+
';
|
|
148
|
+
|
|
149
|
+
// Reinitialize Lucide icons
|
|
150
|
+
if (typeof lucide !== 'undefined') {
|
|
151
|
+
lucide.createIcons();
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Get total records across all projects
|
|
157
|
+
*/
|
|
158
|
+
function getTotalRecords() {
|
|
159
|
+
if (!storageData || !storageData.projects) return 0;
|
|
160
|
+
return storageData.projects.reduce((sum, p) => sum + (p.historyRecords || 0), 0);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
/**
|
|
164
|
+
* Build project tree from flat list
|
|
165
|
+
* Converts flat project list to hierarchical tree structure
|
|
166
|
+
*/
|
|
167
|
+
function buildProjectTree(projects) {
|
|
168
|
+
const tree = [];
|
|
169
|
+
const map = new Map();
|
|
170
|
+
|
|
171
|
+
// Sort by path depth (shallowest first)
|
|
172
|
+
const sorted = projects.slice().sort((a, b) => {
|
|
173
|
+
const depthA = (a.id.match(/\//g) || []).length;
|
|
174
|
+
const depthB = (b.id.match(/\//g) || []).length;
|
|
175
|
+
return depthA - depthB;
|
|
176
|
+
});
|
|
177
|
+
|
|
178
|
+
for (const project of sorted) {
|
|
179
|
+
const segments = project.id.split('/');
|
|
180
|
+
|
|
181
|
+
if (segments.length === 1) {
|
|
182
|
+
// Root level project
|
|
183
|
+
const node = {
|
|
184
|
+
...project,
|
|
185
|
+
children: [],
|
|
186
|
+
isExpanded: false
|
|
187
|
+
};
|
|
188
|
+
tree.push(node);
|
|
189
|
+
map.set(project.id, node);
|
|
190
|
+
} else {
|
|
191
|
+
// Sub-project
|
|
192
|
+
const parentId = segments.slice(0, -1).join('/');
|
|
193
|
+
const parent = map.get(parentId);
|
|
194
|
+
|
|
195
|
+
if (parent) {
|
|
196
|
+
const node = {
|
|
197
|
+
...project,
|
|
198
|
+
children: [],
|
|
199
|
+
isExpanded: false
|
|
200
|
+
};
|
|
201
|
+
parent.children.push(node);
|
|
202
|
+
map.set(project.id, node);
|
|
203
|
+
} else {
|
|
204
|
+
// Orphaned project (parent not found) - add to root
|
|
205
|
+
const node = {
|
|
206
|
+
...project,
|
|
207
|
+
children: [],
|
|
208
|
+
isExpanded: false
|
|
209
|
+
};
|
|
210
|
+
tree.push(node);
|
|
211
|
+
map.set(project.id, node);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
return tree;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Render project tree recursively
|
|
221
|
+
*/
|
|
222
|
+
function renderProjectTree(tree, level = 0, formatTimeAgo) {
|
|
223
|
+
if (!tree || tree.length === 0) return '';
|
|
224
|
+
|
|
225
|
+
let html = '';
|
|
226
|
+
|
|
227
|
+
for (const node of tree) {
|
|
228
|
+
const hasChildren = node.children && node.children.length > 0;
|
|
229
|
+
const indent = level * 20;
|
|
230
|
+
const projectName = node.id.split('/').pop();
|
|
231
|
+
|
|
232
|
+
const historyBadge = node.historyRecords > 0
|
|
233
|
+
? '<span class="text-xs px-1.5 py-0.5 bg-primary/10 text-primary rounded">' + node.historyRecords + '</span>'
|
|
234
|
+
: '<span class="text-xs text-muted-foreground">-</span>';
|
|
235
|
+
|
|
236
|
+
const toggleIcon = hasChildren
|
|
237
|
+
? '<i data-lucide="chevron-right" class="w-3 h-3 transition-transform duration-200 toggle-icon"></i>'
|
|
238
|
+
: '<span class="w-3 h-3 inline-block"></span>';
|
|
239
|
+
|
|
240
|
+
html += '\
|
|
241
|
+
<tr class="border-b border-border/50 hover:bg-muted/30 project-row" data-project-id="' + escapeHtml(node.id) + '" data-level="' + level + '">\
|
|
242
|
+
<td class="py-2 px-2 font-mono text-xs text-muted-foreground">\
|
|
243
|
+
<div class="flex items-center gap-1" style="padding-left: ' + indent + 'px">\
|
|
244
|
+
' + (hasChildren ? '<button class="toggle-btn hover:bg-muted/50 rounded p-0.5" onclick="toggleProjectNode(\'' + escapeHtml(node.id) + '\')">' + toggleIcon + '</button>' : '<span class="w-3 h-3 inline-block"></span>') + '\
|
|
245
|
+
<span class="truncate max-w-[150px]" title="' + escapeHtml(node.id) + '">' + escapeHtml(projectName) + '</span>\
|
|
246
|
+
</div>\
|
|
247
|
+
</td>\
|
|
248
|
+
<td class="py-2 px-2 text-sm text-right">' + escapeHtml(node.totalSizeFormatted) + '</td>\
|
|
249
|
+
<td class="py-2 px-2 text-center">' + historyBadge + '</td>\
|
|
250
|
+
<td class="py-2 px-2 text-xs text-muted-foreground text-right">' + formatTimeAgo(node.lastModified) + '</td>\
|
|
251
|
+
<td class="py-2 px-1 text-right">\
|
|
252
|
+
<button onclick="cleanProjectStorage(\'' + escapeHtml(node.id) + '\')" \
|
|
253
|
+
class="text-xs px-2 py-1 text-destructive hover:bg-destructive/10 rounded transition-colors" \
|
|
254
|
+
title="Clean this project storage">\
|
|
255
|
+
<i data-lucide="trash-2" class="w-3 h-3"></i>\
|
|
256
|
+
</button>\
|
|
257
|
+
</td>\
|
|
258
|
+
</tr>\
|
|
259
|
+
';
|
|
260
|
+
|
|
261
|
+
// Render children (initially hidden)
|
|
262
|
+
if (hasChildren) {
|
|
263
|
+
html += renderProjectTree(node.children, level + 1, formatTimeAgo);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return html;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Toggle project node expansion
|
|
272
|
+
*/
|
|
273
|
+
function toggleProjectNode(projectId) {
|
|
274
|
+
const row = document.querySelector('[data-project-id="' + projectId + '"]');
|
|
275
|
+
if (!row) return;
|
|
276
|
+
|
|
277
|
+
const icon = row.querySelector('.toggle-icon');
|
|
278
|
+
const level = parseInt(row.getAttribute('data-level'));
|
|
279
|
+
|
|
280
|
+
// Find all child rows
|
|
281
|
+
let nextRow = row.nextElementSibling;
|
|
282
|
+
const childRows = [];
|
|
283
|
+
|
|
284
|
+
while (nextRow && nextRow.classList.contains('project-row')) {
|
|
285
|
+
const nextLevel = parseInt(nextRow.getAttribute('data-level'));
|
|
286
|
+
if (nextLevel <= level) break;
|
|
287
|
+
childRows.push(nextRow);
|
|
288
|
+
nextRow = nextRow.nextElementSibling;
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
// Toggle visibility
|
|
292
|
+
const isExpanded = row.classList.contains('expanded');
|
|
293
|
+
|
|
294
|
+
if (isExpanded) {
|
|
295
|
+
// Collapse
|
|
296
|
+
row.classList.remove('expanded');
|
|
297
|
+
if (icon) icon.style.transform = 'rotate(0deg)';
|
|
298
|
+
childRows.forEach(child => {
|
|
299
|
+
child.style.display = 'none';
|
|
300
|
+
});
|
|
301
|
+
} else {
|
|
302
|
+
// Expand (only immediate children)
|
|
303
|
+
row.classList.add('expanded');
|
|
304
|
+
if (icon) icon.style.transform = 'rotate(90deg)';
|
|
305
|
+
childRows.forEach(child => {
|
|
306
|
+
const childLevel = parseInt(child.getAttribute('data-level'));
|
|
307
|
+
if (childLevel === level + 1) {
|
|
308
|
+
child.style.display = '';
|
|
309
|
+
}
|
|
310
|
+
});
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
// Reinitialize Lucide icons
|
|
314
|
+
if (typeof lucide !== 'undefined') {
|
|
315
|
+
lucide.createIcons();
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
/**
|
|
320
|
+
* Render error state for storage card
|
|
321
|
+
*/
|
|
322
|
+
function renderStorageCardError(message) {
|
|
323
|
+
const container = document.getElementById('storageCard');
|
|
324
|
+
if (!container) return;
|
|
325
|
+
|
|
326
|
+
container.innerHTML = '\
|
|
327
|
+
<div class="bg-card border border-border rounded-lg overflow-hidden">\
|
|
328
|
+
<div class="bg-muted/30 border-b border-border px-4 py-3 flex items-center gap-2">\
|
|
329
|
+
<i data-lucide="hard-drive" class="w-4 h-4 text-primary"></i>\
|
|
330
|
+
<span class="font-medium text-foreground">Storage Manager</span>\
|
|
331
|
+
</div>\
|
|
332
|
+
<div class="p-4 text-center">\
|
|
333
|
+
<div class="text-destructive mb-2">\
|
|
334
|
+
<i data-lucide="alert-circle" class="w-8 h-8 mx-auto"></i>\
|
|
335
|
+
</div>\
|
|
336
|
+
<p class="text-sm text-muted-foreground mb-3">' + escapeHtml(message) + '</p>\
|
|
337
|
+
<button onclick="loadStorageStats()" class="text-xs px-3 py-1.5 bg-primary/10 text-primary hover:bg-primary/20 rounded transition-colors">\
|
|
338
|
+
Retry\
|
|
339
|
+
</button>\
|
|
340
|
+
</div>\
|
|
341
|
+
</div>\
|
|
342
|
+
';
|
|
343
|
+
|
|
344
|
+
if (typeof lucide !== 'undefined') {
|
|
345
|
+
lucide.createIcons();
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Show storage configuration modal
|
|
351
|
+
*/
|
|
352
|
+
function showStorageConfig() {
|
|
353
|
+
const content = '\
|
|
354
|
+
# Storage Configuration\n\
|
|
355
|
+
\n\
|
|
356
|
+
## Current Location\n\
|
|
357
|
+
\n\
|
|
358
|
+
```\n\
|
|
359
|
+
' + (storageData?.location || '~/.ccw') + '\n\
|
|
360
|
+
```\n\
|
|
361
|
+
\n\
|
|
362
|
+
## Change Storage Location\n\
|
|
363
|
+
\n\
|
|
364
|
+
Set the `CCW_DATA_DIR` environment variable to change the storage location:\n\
|
|
365
|
+
\n\
|
|
366
|
+
### Windows (PowerShell)\n\
|
|
367
|
+
```powershell\n\
|
|
368
|
+
$env:CCW_DATA_DIR = "D:\\custom\\ccw-data"\n\
|
|
369
|
+
```\n\
|
|
370
|
+
\n\
|
|
371
|
+
### Windows (Command Prompt)\n\
|
|
372
|
+
```cmd\n\
|
|
373
|
+
set CCW_DATA_DIR=D:\\custom\\ccw-data\n\
|
|
374
|
+
```\n\
|
|
375
|
+
\n\
|
|
376
|
+
### Linux/macOS\n\
|
|
377
|
+
```bash\n\
|
|
378
|
+
export CCW_DATA_DIR="/custom/ccw-data"\n\
|
|
379
|
+
```\n\
|
|
380
|
+
\n\
|
|
381
|
+
### Permanent (add to shell profile)\n\
|
|
382
|
+
```bash\n\
|
|
383
|
+
echo \'export CCW_DATA_DIR="/custom/ccw-data"\' >> ~/.bashrc\n\
|
|
384
|
+
```\n\
|
|
385
|
+
\n\
|
|
386
|
+
> **Note:** Existing data will NOT be migrated automatically.\n\
|
|
387
|
+
> Manually copy the contents of the old directory to the new location.\n\
|
|
388
|
+
\n\
|
|
389
|
+
## CLI Commands\n\
|
|
390
|
+
\n\
|
|
391
|
+
```bash\n\
|
|
392
|
+
# Show storage info\n\
|
|
393
|
+
ccw cli storage\n\
|
|
394
|
+
\n\
|
|
395
|
+
# Clean all storage\n\
|
|
396
|
+
ccw cli storage clean --force\n\
|
|
397
|
+
\n\
|
|
398
|
+
# Clean specific project\n\
|
|
399
|
+
ccw cli storage clean --project . --force\n\
|
|
400
|
+
```\n\
|
|
401
|
+
';
|
|
402
|
+
|
|
403
|
+
openMarkdownModal('Storage Configuration', content, 'markdown');
|
|
404
|
+
}
|
|
405
|
+
|
|
406
|
+
/**
|
|
407
|
+
* Clean storage for a specific project
|
|
408
|
+
*/
|
|
409
|
+
async function cleanProjectStorage(projectId) {
|
|
410
|
+
const project = storageData?.projects?.find(p => p.id === projectId);
|
|
411
|
+
const sizeInfo = project ? ' (' + project.totalSizeFormatted + ')' : '';
|
|
412
|
+
|
|
413
|
+
if (!confirm('Delete storage for project ' + projectId.substring(0, 8) + '...' + sizeInfo + '?\n\nThis will remove CLI history, memory, and cache for this project.')) {
|
|
414
|
+
return;
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
try {
|
|
418
|
+
const res = await fetch('/api/storage/clean', {
|
|
419
|
+
method: 'POST',
|
|
420
|
+
headers: { 'Content-Type': 'application/json' },
|
|
421
|
+
body: JSON.stringify({ projectId })
|
|
422
|
+
});
|
|
423
|
+
|
|
424
|
+
const result = await res.json();
|
|
425
|
+
|
|
426
|
+
if (result.success) {
|
|
427
|
+
addGlobalNotification('success', 'Storage Cleaned', 'Freed ' + result.freedFormatted, 'storage');
|
|
428
|
+
await loadStorageStats();
|
|
429
|
+
} else {
|
|
430
|
+
throw new Error(result.error || 'Failed to clean storage');
|
|
431
|
+
}
|
|
432
|
+
} catch (err) {
|
|
433
|
+
addGlobalNotification('error', 'Clean Failed', err.message, 'storage');
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
/**
|
|
438
|
+
* Confirm and clean all storage
|
|
439
|
+
*/
|
|
440
|
+
async function cleanAllStorageConfirm() {
|
|
441
|
+
const totalSize = storageData?.totalSizeFormatted || 'unknown';
|
|
442
|
+
const projectCount = storageData?.projectCount || 0;
|
|
443
|
+
|
|
444
|
+
if (!confirm('Delete ALL CCW storage?\n\nThis will remove:\n- ' + projectCount + ' projects\n- ' + totalSize + ' of data\n\nThis action cannot be undone!')) {
|
|
445
|
+
return;
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
// Double confirm for safety
|
|
449
|
+
if (!confirm('Are you SURE? This will delete all CLI history, memory stores, and caches.')) {
|
|
450
|
+
return;
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
try {
|
|
454
|
+
const res = await fetch('/api/storage/clean', {
|
|
455
|
+
method: 'POST',
|
|
456
|
+
headers: { 'Content-Type': 'application/json' },
|
|
457
|
+
body: JSON.stringify({ all: true })
|
|
458
|
+
});
|
|
459
|
+
|
|
460
|
+
const result = await res.json();
|
|
461
|
+
|
|
462
|
+
if (result.success) {
|
|
463
|
+
addGlobalNotification('success', 'All Storage Cleaned', 'Cleaned ' + result.projectsCleaned + ' projects, freed ' + result.freedFormatted, 'storage');
|
|
464
|
+
await loadStorageStats();
|
|
465
|
+
} else {
|
|
466
|
+
throw new Error(result.error || 'Failed to clean storage');
|
|
467
|
+
}
|
|
468
|
+
} catch (err) {
|
|
469
|
+
addGlobalNotification('error', 'Clean Failed', err.message, 'storage');
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* Get storage data (for external use)
|
|
475
|
+
*/
|
|
476
|
+
function getStorageData() {
|
|
477
|
+
return storageData;
|
|
478
|
+
}
|
|
@@ -96,7 +96,7 @@ function renderImplPlanContent(implPlan) {
|
|
|
96
96
|
// Lite Context Tab Rendering
|
|
97
97
|
// ==========================================
|
|
98
98
|
|
|
99
|
-
function renderLiteContextContent(context, explorations, session) {
|
|
99
|
+
function renderLiteContextContent(context, explorations, session, diagnoses) {
|
|
100
100
|
const plan = session.plan || {};
|
|
101
101
|
let sections = [];
|
|
102
102
|
|
|
@@ -105,6 +105,11 @@ function renderLiteContextContent(context, explorations, session) {
|
|
|
105
105
|
sections.push(renderExplorationContext(explorations));
|
|
106
106
|
}
|
|
107
107
|
|
|
108
|
+
// Render diagnoses if available (from diagnosis-*.json files)
|
|
109
|
+
if (diagnoses && diagnoses.manifest) {
|
|
110
|
+
sections.push(renderDiagnosisContext(diagnoses));
|
|
111
|
+
}
|
|
112
|
+
|
|
108
113
|
// If we have context from context-package.json
|
|
109
114
|
if (context) {
|
|
110
115
|
sections.push(`
|
|
@@ -153,7 +158,7 @@ function renderLiteContextContent(context, explorations, session) {
|
|
|
153
158
|
<div class="tab-empty-state">
|
|
154
159
|
<div class="empty-icon"><i data-lucide="package" class="w-12 h-12"></i></div>
|
|
155
160
|
<div class="empty-title">No Context Data</div>
|
|
156
|
-
<div class="empty-text">No context-package.json or
|
|
161
|
+
<div class="empty-text">No context-package.json, exploration files, or diagnosis files found for this session.</div>
|
|
157
162
|
</div>
|
|
158
163
|
`;
|
|
159
164
|
}
|
|
@@ -185,15 +190,19 @@ function renderExplorationContext(explorations) {
|
|
|
185
190
|
`);
|
|
186
191
|
|
|
187
192
|
// Render each exploration angle as collapsible section
|
|
188
|
-
const explorationOrder = ['architecture', 'dependencies', 'patterns', 'integration-points'];
|
|
193
|
+
const explorationOrder = ['architecture', 'dependencies', 'patterns', 'integration-points', 'testing'];
|
|
189
194
|
const explorationTitles = {
|
|
190
195
|
'architecture': '<i data-lucide="blocks" class="w-4 h-4 inline mr-1"></i>Architecture',
|
|
191
196
|
'dependencies': '<i data-lucide="package" class="w-4 h-4 inline mr-1"></i>Dependencies',
|
|
192
197
|
'patterns': '<i data-lucide="git-branch" class="w-4 h-4 inline mr-1"></i>Patterns',
|
|
193
|
-
'integration-points': '<i data-lucide="plug" class="w-4 h-4 inline mr-1"></i>Integration Points'
|
|
198
|
+
'integration-points': '<i data-lucide="plug" class="w-4 h-4 inline mr-1"></i>Integration Points',
|
|
199
|
+
'testing': '<i data-lucide="flask-conical" class="w-4 h-4 inline mr-1"></i>Testing'
|
|
194
200
|
};
|
|
195
201
|
|
|
196
|
-
|
|
202
|
+
// Collect all angles from data (in case there are exploration angles not in our predefined list)
|
|
203
|
+
const allAngles = [...new Set([...explorationOrder, ...Object.keys(data)])];
|
|
204
|
+
|
|
205
|
+
for (const angle of allAngles) {
|
|
197
206
|
const expData = data[angle];
|
|
198
207
|
if (!expData) {
|
|
199
208
|
continue;
|
|
@@ -205,7 +214,7 @@ function renderExplorationContext(explorations) {
|
|
|
205
214
|
<div class="exploration-section collapsible-section">
|
|
206
215
|
<div class="collapsible-header">
|
|
207
216
|
<span class="collapse-icon">▶</span>
|
|
208
|
-
<span class="section-label">${explorationTitles[angle] || angle}</span>
|
|
217
|
+
<span class="section-label">${explorationTitles[angle] || ('<i data-lucide="file-search" class="w-4 h-4 inline mr-1"></i>' + escapeHtml(angle.toUpperCase()))}</span>
|
|
209
218
|
</div>
|
|
210
219
|
<div class="collapsible-content collapsed">
|
|
211
220
|
${angleContent}
|
|
@@ -271,3 +280,145 @@ function renderExplorationAngle(angle, data) {
|
|
|
271
280
|
|
|
272
281
|
return content.join('') || '<p>No data available</p>';
|
|
273
282
|
}
|
|
283
|
+
|
|
284
|
+
// ==========================================
|
|
285
|
+
// Diagnosis Context Rendering
|
|
286
|
+
// ==========================================
|
|
287
|
+
|
|
288
|
+
function renderDiagnosisContext(diagnoses) {
|
|
289
|
+
if (!diagnoses || !diagnoses.manifest) {
|
|
290
|
+
return '';
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
const manifest = diagnoses.manifest;
|
|
294
|
+
const data = diagnoses.data || {};
|
|
295
|
+
|
|
296
|
+
let sections = [];
|
|
297
|
+
|
|
298
|
+
// Header with manifest info
|
|
299
|
+
sections.push(`
|
|
300
|
+
<div class="diagnosis-header">
|
|
301
|
+
<h4><i data-lucide="stethoscope" class="w-4 h-4 inline mr-1"></i> ${escapeHtml(manifest.task_description || 'Diagnosis Context')}</h4>
|
|
302
|
+
<div class="diagnosis-meta">
|
|
303
|
+
<span class="meta-item">Diagnoses: <strong>${manifest.diagnosis_count || 0}</strong></span>
|
|
304
|
+
</div>
|
|
305
|
+
</div>
|
|
306
|
+
`);
|
|
307
|
+
|
|
308
|
+
// Render each diagnosis angle as collapsible section
|
|
309
|
+
const diagnosisOrder = ['root-cause', 'api-contracts', 'dataflow', 'performance', 'security', 'error-handling'];
|
|
310
|
+
const diagnosisTitles = {
|
|
311
|
+
'root-cause': '<i data-lucide="search" class="w-4 h-4 inline mr-1"></i>Root Cause',
|
|
312
|
+
'api-contracts': '<i data-lucide="plug" class="w-4 h-4 inline mr-1"></i>API Contracts',
|
|
313
|
+
'dataflow': '<i data-lucide="git-merge" class="w-4 h-4 inline mr-1"></i>Data Flow',
|
|
314
|
+
'performance': '<i data-lucide="zap" class="w-4 h-4 inline mr-1"></i>Performance',
|
|
315
|
+
'security': '<i data-lucide="shield" class="w-4 h-4 inline mr-1"></i>Security',
|
|
316
|
+
'error-handling': '<i data-lucide="alert-circle" class="w-4 h-4 inline mr-1"></i>Error Handling'
|
|
317
|
+
};
|
|
318
|
+
|
|
319
|
+
// Collect all angles from data (in case there are diagnosis angles not in our predefined list)
|
|
320
|
+
const allAngles = [...new Set([...diagnosisOrder, ...Object.keys(data)])];
|
|
321
|
+
|
|
322
|
+
for (const angle of allAngles) {
|
|
323
|
+
const diagData = data[angle];
|
|
324
|
+
if (!diagData) {
|
|
325
|
+
continue;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
const angleContent = renderDiagnosisAngle(angle, diagData);
|
|
329
|
+
|
|
330
|
+
sections.push(`
|
|
331
|
+
<div class="diagnosis-section collapsible-section">
|
|
332
|
+
<div class="collapsible-header">
|
|
333
|
+
<span class="collapse-icon">▶</span>
|
|
334
|
+
<span class="section-label">${diagnosisTitles[angle] || ('<i data-lucide="file-search" class="w-4 h-4 inline mr-1"></i>' + angle)}</span>
|
|
335
|
+
</div>
|
|
336
|
+
<div class="collapsible-content collapsed">
|
|
337
|
+
${angleContent}
|
|
338
|
+
</div>
|
|
339
|
+
</div>
|
|
340
|
+
`);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
return `<div class="diagnosis-context">${sections.join('')}</div>`;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
function renderDiagnosisAngle(angle, data) {
|
|
347
|
+
let content = [];
|
|
348
|
+
|
|
349
|
+
// Summary/Overview
|
|
350
|
+
if (data.summary || data.overview) {
|
|
351
|
+
content.push(renderExpField('Summary', data.summary || data.overview));
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
// Root cause analysis
|
|
355
|
+
if (data.root_cause || data.root_cause_analysis) {
|
|
356
|
+
content.push(renderExpField('Root Cause', data.root_cause || data.root_cause_analysis));
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
// Issues/Findings
|
|
360
|
+
if (data.issues && Array.isArray(data.issues)) {
|
|
361
|
+
content.push(`
|
|
362
|
+
<div class="exp-field">
|
|
363
|
+
<label>Issues Found (${data.issues.length})</label>
|
|
364
|
+
<div class="issues-list">
|
|
365
|
+
${data.issues.map(issue => {
|
|
366
|
+
if (typeof issue === 'string') {
|
|
367
|
+
return `<div class="issue-item">${escapeHtml(issue)}</div>`;
|
|
368
|
+
} else {
|
|
369
|
+
return `
|
|
370
|
+
<div class="issue-item">
|
|
371
|
+
<div class="issue-title">${escapeHtml(issue.title || issue.description || 'Unknown')}</div>
|
|
372
|
+
${issue.location ? `<div class="issue-location"><code>${escapeHtml(issue.location)}</code></div>` : ''}
|
|
373
|
+
${issue.severity ? `<span class="severity-badge ${escapeHtml(issue.severity)}">${escapeHtml(issue.severity)}</span>` : ''}
|
|
374
|
+
</div>
|
|
375
|
+
`;
|
|
376
|
+
}
|
|
377
|
+
}).join('')}
|
|
378
|
+
</div>
|
|
379
|
+
</div>
|
|
380
|
+
`);
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
// Affected files
|
|
384
|
+
if (data.affected_files && Array.isArray(data.affected_files)) {
|
|
385
|
+
content.push(`
|
|
386
|
+
<div class="exp-field">
|
|
387
|
+
<label>Affected Files (${data.affected_files.length})</label>
|
|
388
|
+
<div class="path-tags">
|
|
389
|
+
${data.affected_files.map(f => {
|
|
390
|
+
const filePath = typeof f === 'string' ? f : (f.path || f.file || '');
|
|
391
|
+
return `<span class="path-tag">${escapeHtml(filePath)}</span>`;
|
|
392
|
+
}).join('')}
|
|
393
|
+
</div>
|
|
394
|
+
</div>
|
|
395
|
+
`);
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// Recommendations
|
|
399
|
+
if (data.recommendations && Array.isArray(data.recommendations)) {
|
|
400
|
+
content.push(`
|
|
401
|
+
<div class="exp-field">
|
|
402
|
+
<label>Recommendations</label>
|
|
403
|
+
<ol class="recommendations-list">
|
|
404
|
+
${data.recommendations.map(rec => {
|
|
405
|
+
const recText = typeof rec === 'string' ? rec : (rec.description || rec.action || '');
|
|
406
|
+
return `<li>${escapeHtml(recText)}</li>`;
|
|
407
|
+
}).join('')}
|
|
408
|
+
</ol>
|
|
409
|
+
</div>
|
|
410
|
+
`);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// API Contracts (specific to api-contracts diagnosis)
|
|
414
|
+
if (data.contracts && Array.isArray(data.contracts)) {
|
|
415
|
+
content.push(renderExpField('API Contracts', data.contracts));
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// Data flow (specific to dataflow diagnosis)
|
|
419
|
+
if (data.dataflow || data.data_flow) {
|
|
420
|
+
content.push(renderExpField('Data Flow', data.dataflow || data.data_flow));
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
return content.join('') || '<p>No diagnosis data available</p>';
|
|
424
|
+
}
|