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,584 @@
|
|
|
1
|
+
import { glob } from 'glob';
|
|
2
|
+
import { readFileSync, existsSync } from 'fs';
|
|
3
|
+
import { join, basename } from 'path';
|
|
4
|
+
import { scanLiteTasks } from './lite-scanner.js';
|
|
5
|
+
import { createDashboardCache } from './cache-manager.js';
|
|
6
|
+
|
|
7
|
+
interface SessionData {
|
|
8
|
+
session_id: string;
|
|
9
|
+
project: string;
|
|
10
|
+
status: string;
|
|
11
|
+
type: string;
|
|
12
|
+
workflow_type: string | null;
|
|
13
|
+
created_at: string | null;
|
|
14
|
+
archived_at: string | null;
|
|
15
|
+
path: string;
|
|
16
|
+
tasks: TaskData[];
|
|
17
|
+
taskCount: number;
|
|
18
|
+
hasReview: boolean;
|
|
19
|
+
reviewSummary: ReviewSummary | null;
|
|
20
|
+
reviewDimensions: DimensionData[];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
interface TaskData {
|
|
24
|
+
task_id: string;
|
|
25
|
+
title: string;
|
|
26
|
+
status: string;
|
|
27
|
+
type: string;
|
|
28
|
+
meta?: Record<string, unknown>;
|
|
29
|
+
context?: Record<string, unknown>;
|
|
30
|
+
flow_control?: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
interface ReviewSummary {
|
|
34
|
+
phase: string;
|
|
35
|
+
severityDistribution: Record<string, number>;
|
|
36
|
+
criticalFiles: string[];
|
|
37
|
+
status: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface DimensionData {
|
|
41
|
+
name: string;
|
|
42
|
+
findings: Finding[];
|
|
43
|
+
summary: unknown | null;
|
|
44
|
+
status: string;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
interface Finding {
|
|
48
|
+
severity?: string;
|
|
49
|
+
[key: string]: unknown;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
interface SessionInput {
|
|
53
|
+
session_id?: string;
|
|
54
|
+
id?: string;
|
|
55
|
+
project?: string;
|
|
56
|
+
description?: string;
|
|
57
|
+
status?: string;
|
|
58
|
+
type?: string;
|
|
59
|
+
workflow_type?: string | null;
|
|
60
|
+
created_at?: string | null; // For backward compatibility
|
|
61
|
+
created?: string; // From SessionMetadata
|
|
62
|
+
updated?: string; // From SessionMetadata
|
|
63
|
+
archived_at?: string | null;
|
|
64
|
+
path: string;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
interface ScanSessionsResult {
|
|
68
|
+
active: SessionInput[];
|
|
69
|
+
archived: SessionInput[];
|
|
70
|
+
hasReviewData: boolean;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
interface DashboardData {
|
|
74
|
+
generatedAt: string;
|
|
75
|
+
activeSessions: SessionData[];
|
|
76
|
+
archivedSessions: SessionData[];
|
|
77
|
+
liteTasks: {
|
|
78
|
+
litePlan: unknown[];
|
|
79
|
+
liteFix: unknown[];
|
|
80
|
+
};
|
|
81
|
+
reviewData: ReviewData | null;
|
|
82
|
+
projectOverview: ProjectOverview | null;
|
|
83
|
+
statistics: {
|
|
84
|
+
totalSessions: number;
|
|
85
|
+
activeSessions: number;
|
|
86
|
+
totalTasks: number;
|
|
87
|
+
completedTasks: number;
|
|
88
|
+
reviewFindings: number;
|
|
89
|
+
litePlanCount: number;
|
|
90
|
+
liteFixCount: number;
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
interface ReviewData {
|
|
95
|
+
totalFindings: number;
|
|
96
|
+
severityDistribution: {
|
|
97
|
+
critical: number;
|
|
98
|
+
high: number;
|
|
99
|
+
medium: number;
|
|
100
|
+
low: number;
|
|
101
|
+
};
|
|
102
|
+
dimensionSummary: Record<string, { count: number; sessions: string[] }>;
|
|
103
|
+
sessions: SessionReviewData[];
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
interface SessionReviewData {
|
|
107
|
+
session_id: string;
|
|
108
|
+
progress: unknown | null;
|
|
109
|
+
dimensions: DimensionData[];
|
|
110
|
+
findings: Array<Finding & { dimension: string }>;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
interface ProjectOverview {
|
|
114
|
+
projectName: string;
|
|
115
|
+
description: string;
|
|
116
|
+
initializedAt: string | null;
|
|
117
|
+
technologyStack: {
|
|
118
|
+
languages: string[];
|
|
119
|
+
frameworks: string[];
|
|
120
|
+
build_tools: string[];
|
|
121
|
+
test_frameworks: string[];
|
|
122
|
+
};
|
|
123
|
+
architecture: {
|
|
124
|
+
style: string;
|
|
125
|
+
layers: string[];
|
|
126
|
+
patterns: string[];
|
|
127
|
+
};
|
|
128
|
+
keyComponents: string[];
|
|
129
|
+
features: unknown[];
|
|
130
|
+
developmentIndex: {
|
|
131
|
+
feature: unknown[];
|
|
132
|
+
enhancement: unknown[];
|
|
133
|
+
bugfix: unknown[];
|
|
134
|
+
refactor: unknown[];
|
|
135
|
+
docs: unknown[];
|
|
136
|
+
};
|
|
137
|
+
statistics: {
|
|
138
|
+
total_features: number;
|
|
139
|
+
total_sessions: number;
|
|
140
|
+
last_updated: string | null;
|
|
141
|
+
};
|
|
142
|
+
metadata: {
|
|
143
|
+
initialized_by: string;
|
|
144
|
+
analysis_timestamp: string | null;
|
|
145
|
+
analysis_mode: string;
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Aggregate all data for dashboard rendering (with caching)
|
|
151
|
+
* @param sessions - Scanned sessions from session-scanner
|
|
152
|
+
* @param workflowDir - Path to .workflow directory
|
|
153
|
+
* @returns Aggregated dashboard data
|
|
154
|
+
*/
|
|
155
|
+
export async function aggregateData(sessions: ScanSessionsResult, workflowDir: string): Promise<DashboardData> {
|
|
156
|
+
// Initialize cache manager
|
|
157
|
+
const cache = createDashboardCache(workflowDir);
|
|
158
|
+
|
|
159
|
+
// Prepare paths to watch for changes
|
|
160
|
+
const watchPaths = [
|
|
161
|
+
join(workflowDir, 'active'),
|
|
162
|
+
join(workflowDir, 'archives'),
|
|
163
|
+
join(workflowDir, 'project.json'),
|
|
164
|
+
...sessions.active.map(s => s.path),
|
|
165
|
+
...sessions.archived.map(s => s.path)
|
|
166
|
+
];
|
|
167
|
+
|
|
168
|
+
// Check cache first
|
|
169
|
+
const cachedData = cache.get(watchPaths);
|
|
170
|
+
if (cachedData !== null) {
|
|
171
|
+
console.log('Using cached dashboard data');
|
|
172
|
+
return cachedData;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
console.log('Cache miss - regenerating dashboard data');
|
|
176
|
+
|
|
177
|
+
const data: DashboardData = {
|
|
178
|
+
generatedAt: new Date().toISOString(),
|
|
179
|
+
activeSessions: [],
|
|
180
|
+
archivedSessions: [],
|
|
181
|
+
liteTasks: {
|
|
182
|
+
litePlan: [],
|
|
183
|
+
liteFix: []
|
|
184
|
+
},
|
|
185
|
+
reviewData: null,
|
|
186
|
+
projectOverview: null,
|
|
187
|
+
statistics: {
|
|
188
|
+
totalSessions: 0,
|
|
189
|
+
activeSessions: 0,
|
|
190
|
+
totalTasks: 0,
|
|
191
|
+
completedTasks: 0,
|
|
192
|
+
reviewFindings: 0,
|
|
193
|
+
litePlanCount: 0,
|
|
194
|
+
liteFixCount: 0
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
// Process active sessions
|
|
199
|
+
for (const session of sessions.active) {
|
|
200
|
+
const sessionData = await processSession(session, true);
|
|
201
|
+
data.activeSessions.push(sessionData);
|
|
202
|
+
data.statistics.totalTasks += sessionData.tasks.length;
|
|
203
|
+
data.statistics.completedTasks += sessionData.tasks.filter(t => t.status === 'completed').length;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
// Process archived sessions
|
|
207
|
+
for (const session of sessions.archived) {
|
|
208
|
+
const sessionData = await processSession(session, false);
|
|
209
|
+
data.archivedSessions.push(sessionData);
|
|
210
|
+
data.statistics.totalTasks += sessionData.taskCount || 0;
|
|
211
|
+
data.statistics.completedTasks += sessionData.taskCount || 0;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Aggregate review data if present
|
|
215
|
+
if (sessions.hasReviewData) {
|
|
216
|
+
data.reviewData = await aggregateReviewData(sessions.active);
|
|
217
|
+
data.statistics.reviewFindings = data.reviewData.totalFindings;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
data.statistics.totalSessions = sessions.active.length + sessions.archived.length;
|
|
221
|
+
data.statistics.activeSessions = sessions.active.length;
|
|
222
|
+
|
|
223
|
+
// Scan and include lite tasks
|
|
224
|
+
try {
|
|
225
|
+
const liteTasks = await scanLiteTasks(workflowDir);
|
|
226
|
+
data.liteTasks = liteTasks;
|
|
227
|
+
data.statistics.litePlanCount = liteTasks.litePlan.length;
|
|
228
|
+
data.statistics.liteFixCount = liteTasks.liteFix.length;
|
|
229
|
+
} catch (err) {
|
|
230
|
+
console.error('Error scanning lite tasks:', (err as Error).message);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
// Load project overview from project.json
|
|
234
|
+
try {
|
|
235
|
+
data.projectOverview = loadProjectOverview(workflowDir);
|
|
236
|
+
} catch (err) {
|
|
237
|
+
console.error('Error loading project overview:', (err as Error).message);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
// Store in cache before returning
|
|
241
|
+
cache.set(data, watchPaths);
|
|
242
|
+
|
|
243
|
+
return data;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Process a single session, loading tasks and review info
|
|
248
|
+
* @param session - Session object from scanner
|
|
249
|
+
* @param isActive - Whether session is active
|
|
250
|
+
* @returns Processed session data
|
|
251
|
+
*/
|
|
252
|
+
async function processSession(session: SessionInput, isActive: boolean): Promise<SessionData> {
|
|
253
|
+
const result: SessionData = {
|
|
254
|
+
session_id: session.session_id || session.id || '',
|
|
255
|
+
project: session.project || session.description || session.session_id || session.id || '',
|
|
256
|
+
status: session.status || (isActive ? 'active' : 'archived'),
|
|
257
|
+
type: session.type || 'workflow', // Session type (workflow, review, test, docs)
|
|
258
|
+
workflow_type: session.workflow_type || null, // Original workflow_type for reference
|
|
259
|
+
created_at: session.created || session.created_at || null, // Prefer 'created' from SessionMetadata, fallback to 'created_at'
|
|
260
|
+
archived_at: session.archived_at || null, // Raw ISO string - let frontend format
|
|
261
|
+
path: session.path,
|
|
262
|
+
tasks: [],
|
|
263
|
+
taskCount: 0,
|
|
264
|
+
hasReview: false,
|
|
265
|
+
reviewSummary: null,
|
|
266
|
+
reviewDimensions: []
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
// Load tasks for active sessions (full details)
|
|
270
|
+
if (isActive) {
|
|
271
|
+
const taskDir = join(session.path, '.task');
|
|
272
|
+
if (existsSync(taskDir)) {
|
|
273
|
+
const taskFiles = await safeGlob('IMPL-*.json', taskDir);
|
|
274
|
+
for (const taskFile of taskFiles) {
|
|
275
|
+
try {
|
|
276
|
+
const taskData = JSON.parse(readFileSync(join(taskDir, taskFile), 'utf8')) as Record<string, unknown>;
|
|
277
|
+
result.tasks.push({
|
|
278
|
+
task_id: (taskData.id as string) || basename(taskFile, '.json'),
|
|
279
|
+
title: (taskData.title as string) || 'Untitled Task',
|
|
280
|
+
status: (taskData.status as string) || 'pending',
|
|
281
|
+
type: ((taskData.meta as Record<string, unknown>)?.type as string) || 'task',
|
|
282
|
+
meta: (taskData.meta as Record<string, unknown>) || {},
|
|
283
|
+
context: (taskData.context as Record<string, unknown>) || {},
|
|
284
|
+
flow_control: (taskData.flow_control as Record<string, unknown>) || {}
|
|
285
|
+
});
|
|
286
|
+
} catch {
|
|
287
|
+
// Skip invalid task files
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// Sort tasks by ID
|
|
291
|
+
result.tasks.sort((a, b) => sortTaskIds(a.task_id, b.task_id));
|
|
292
|
+
}
|
|
293
|
+
result.taskCount = result.tasks.length;
|
|
294
|
+
|
|
295
|
+
// Check for review data
|
|
296
|
+
const reviewDir = join(session.path, '.review');
|
|
297
|
+
if (existsSync(reviewDir)) {
|
|
298
|
+
result.hasReview = true;
|
|
299
|
+
result.reviewSummary = loadReviewSummary(reviewDir);
|
|
300
|
+
// Load dimension data for review sessions
|
|
301
|
+
if (session.type === 'review') {
|
|
302
|
+
result.reviewDimensions = await loadDimensionData(reviewDir);
|
|
303
|
+
}
|
|
304
|
+
}
|
|
305
|
+
} else {
|
|
306
|
+
// For archived, also load tasks (same as active)
|
|
307
|
+
const taskDir = join(session.path, '.task');
|
|
308
|
+
if (existsSync(taskDir)) {
|
|
309
|
+
const taskFiles = await safeGlob('IMPL-*.json', taskDir);
|
|
310
|
+
for (const taskFile of taskFiles) {
|
|
311
|
+
try {
|
|
312
|
+
const taskData = JSON.parse(readFileSync(join(taskDir, taskFile), 'utf8')) as Record<string, unknown>;
|
|
313
|
+
result.tasks.push({
|
|
314
|
+
task_id: (taskData.id as string) || basename(taskFile, '.json'),
|
|
315
|
+
title: (taskData.title as string) || 'Untitled Task',
|
|
316
|
+
status: (taskData.status as string) || 'completed', // Archived tasks are usually completed
|
|
317
|
+
type: ((taskData.meta as Record<string, unknown>)?.type as string) || 'task'
|
|
318
|
+
});
|
|
319
|
+
} catch {
|
|
320
|
+
// Skip invalid task files
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// Sort tasks by ID
|
|
324
|
+
result.tasks.sort((a, b) => sortTaskIds(a.task_id, b.task_id));
|
|
325
|
+
result.taskCount = result.tasks.length;
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Check for review data in archived sessions too
|
|
329
|
+
const reviewDir = join(session.path, '.review');
|
|
330
|
+
if (existsSync(reviewDir)) {
|
|
331
|
+
result.hasReview = true;
|
|
332
|
+
result.reviewSummary = loadReviewSummary(reviewDir);
|
|
333
|
+
// Load dimension data for review sessions
|
|
334
|
+
if (session.type === 'review') {
|
|
335
|
+
result.reviewDimensions = await loadDimensionData(reviewDir);
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
return result;
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Aggregate review data from all active sessions with reviews
|
|
345
|
+
* @param activeSessions - Active session objects
|
|
346
|
+
* @returns Aggregated review data
|
|
347
|
+
*/
|
|
348
|
+
async function aggregateReviewData(activeSessions: SessionInput[]): Promise<ReviewData> {
|
|
349
|
+
const reviewData: ReviewData = {
|
|
350
|
+
totalFindings: 0,
|
|
351
|
+
severityDistribution: { critical: 0, high: 0, medium: 0, low: 0 },
|
|
352
|
+
dimensionSummary: {},
|
|
353
|
+
sessions: []
|
|
354
|
+
};
|
|
355
|
+
|
|
356
|
+
for (const session of activeSessions) {
|
|
357
|
+
const reviewDir = join(session.path, '.review');
|
|
358
|
+
if (!existsSync(reviewDir)) continue;
|
|
359
|
+
|
|
360
|
+
const reviewProgress = loadReviewProgress(reviewDir);
|
|
361
|
+
const dimensionData = await loadDimensionData(reviewDir);
|
|
362
|
+
|
|
363
|
+
if (reviewProgress || dimensionData.length > 0) {
|
|
364
|
+
const sessionReview: SessionReviewData = {
|
|
365
|
+
session_id: session.session_id || session.id || '',
|
|
366
|
+
progress: reviewProgress,
|
|
367
|
+
dimensions: dimensionData,
|
|
368
|
+
findings: []
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
// Collect and count findings
|
|
372
|
+
for (const dim of dimensionData) {
|
|
373
|
+
if (dim.findings && Array.isArray(dim.findings)) {
|
|
374
|
+
for (const finding of dim.findings) {
|
|
375
|
+
const severity = (finding.severity || 'low').toLowerCase();
|
|
376
|
+
if (reviewData.severityDistribution.hasOwnProperty(severity)) {
|
|
377
|
+
reviewData.severityDistribution[severity as keyof typeof reviewData.severityDistribution]++;
|
|
378
|
+
}
|
|
379
|
+
reviewData.totalFindings++;
|
|
380
|
+
sessionReview.findings.push({
|
|
381
|
+
...finding,
|
|
382
|
+
dimension: dim.name
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
// Track dimension summary
|
|
388
|
+
if (!reviewData.dimensionSummary[dim.name]) {
|
|
389
|
+
reviewData.dimensionSummary[dim.name] = { count: 0, sessions: [] };
|
|
390
|
+
}
|
|
391
|
+
reviewData.dimensionSummary[dim.name].count += dim.findings?.length || 0;
|
|
392
|
+
reviewData.dimensionSummary[dim.name].sessions.push(session.session_id || session.id || '');
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
reviewData.sessions.push(sessionReview);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
return reviewData;
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Load review progress from review-progress.json
|
|
404
|
+
* @param reviewDir - Path to .review directory
|
|
405
|
+
* @returns Review progress data or null
|
|
406
|
+
*/
|
|
407
|
+
function loadReviewProgress(reviewDir: string): unknown | null {
|
|
408
|
+
const progressFile = join(reviewDir, 'review-progress.json');
|
|
409
|
+
if (!existsSync(progressFile)) return null;
|
|
410
|
+
try {
|
|
411
|
+
return JSON.parse(readFileSync(progressFile, 'utf8'));
|
|
412
|
+
} catch {
|
|
413
|
+
return null;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
/**
|
|
418
|
+
* Load review summary from review-state.json
|
|
419
|
+
* @param reviewDir - Path to .review directory
|
|
420
|
+
* @returns Review summary or null
|
|
421
|
+
*/
|
|
422
|
+
function loadReviewSummary(reviewDir: string): ReviewSummary | null {
|
|
423
|
+
const stateFile = join(reviewDir, 'review-state.json');
|
|
424
|
+
if (!existsSync(stateFile)) return null;
|
|
425
|
+
try {
|
|
426
|
+
const state = JSON.parse(readFileSync(stateFile, 'utf8')) as Record<string, unknown>;
|
|
427
|
+
return {
|
|
428
|
+
phase: (state.phase as string) || 'unknown',
|
|
429
|
+
severityDistribution: (state.severity_distribution as Record<string, number>) || {},
|
|
430
|
+
criticalFiles: ((state.critical_files as string[]) || []).slice(0, 3),
|
|
431
|
+
status: (state.status as string) || 'in_progress'
|
|
432
|
+
};
|
|
433
|
+
} catch {
|
|
434
|
+
return null;
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Load dimension data from .review/dimensions/
|
|
440
|
+
* @param reviewDir - Path to .review directory
|
|
441
|
+
* @returns Array of dimension data
|
|
442
|
+
*/
|
|
443
|
+
async function loadDimensionData(reviewDir: string): Promise<DimensionData[]> {
|
|
444
|
+
const dimensionsDir = join(reviewDir, 'dimensions');
|
|
445
|
+
if (!existsSync(dimensionsDir)) return [];
|
|
446
|
+
|
|
447
|
+
const dimensions: DimensionData[] = [];
|
|
448
|
+
const dimFiles = await safeGlob('*.json', dimensionsDir);
|
|
449
|
+
|
|
450
|
+
for (const file of dimFiles) {
|
|
451
|
+
try {
|
|
452
|
+
const data = JSON.parse(readFileSync(join(dimensionsDir, file), 'utf8'));
|
|
453
|
+
// Handle array structure: [ { findings: [...], summary: {...} } ]
|
|
454
|
+
let findings: Finding[] = [];
|
|
455
|
+
let summary: unknown | null = null;
|
|
456
|
+
let status = 'completed';
|
|
457
|
+
|
|
458
|
+
if (Array.isArray(data) && data.length > 0) {
|
|
459
|
+
const dimData = data[0] as Record<string, unknown>;
|
|
460
|
+
findings = (dimData.findings as Finding[]) || [];
|
|
461
|
+
summary = dimData.summary || null;
|
|
462
|
+
status = (dimData.status as string) || 'completed';
|
|
463
|
+
} else if ((data as Record<string, unknown>).findings) {
|
|
464
|
+
const dataObj = data as Record<string, unknown>;
|
|
465
|
+
findings = (dataObj.findings as Finding[]) || [];
|
|
466
|
+
summary = dataObj.summary || null;
|
|
467
|
+
status = (dataObj.status as string) || 'completed';
|
|
468
|
+
}
|
|
469
|
+
|
|
470
|
+
dimensions.push({
|
|
471
|
+
name: basename(file, '.json'),
|
|
472
|
+
findings: findings,
|
|
473
|
+
summary: summary,
|
|
474
|
+
status: status
|
|
475
|
+
});
|
|
476
|
+
} catch {
|
|
477
|
+
// Skip invalid dimension files
|
|
478
|
+
}
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
return dimensions;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
/**
|
|
485
|
+
* Safe glob wrapper that returns empty array on error
|
|
486
|
+
* @param pattern - Glob pattern
|
|
487
|
+
* @param cwd - Current working directory
|
|
488
|
+
* @returns Array of matching file names
|
|
489
|
+
*/
|
|
490
|
+
async function safeGlob(pattern: string, cwd: string): Promise<string[]> {
|
|
491
|
+
try {
|
|
492
|
+
return await glob(pattern, { cwd, absolute: false });
|
|
493
|
+
} catch {
|
|
494
|
+
return [];
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
// formatDate removed - dates are now passed as raw ISO strings
|
|
499
|
+
// Frontend (dashboard.js) handles all date formatting
|
|
500
|
+
|
|
501
|
+
/**
|
|
502
|
+
* Sort task IDs numerically (IMPL-1, IMPL-2, IMPL-1.1, etc.)
|
|
503
|
+
* @param a - First task ID
|
|
504
|
+
* @param b - Second task ID
|
|
505
|
+
* @returns Comparison result
|
|
506
|
+
*/
|
|
507
|
+
function sortTaskIds(a: string, b: string): number {
|
|
508
|
+
const parseId = (id: string): [number, number] => {
|
|
509
|
+
const match = id.match(/IMPL-(\d+)(?:\.(\d+))?/);
|
|
510
|
+
if (!match) return [0, 0];
|
|
511
|
+
return [parseInt(match[1]), parseInt(match[2] || '0')];
|
|
512
|
+
};
|
|
513
|
+
const [a1, a2] = parseId(a);
|
|
514
|
+
const [b1, b2] = parseId(b);
|
|
515
|
+
return a1 - b1 || a2 - b2;
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
/**
|
|
519
|
+
* Load project overview from project.json
|
|
520
|
+
* @param workflowDir - Path to .workflow directory
|
|
521
|
+
* @returns Project overview data or null if not found
|
|
522
|
+
*/
|
|
523
|
+
function loadProjectOverview(workflowDir: string): ProjectOverview | null {
|
|
524
|
+
const projectFile = join(workflowDir, 'project.json');
|
|
525
|
+
|
|
526
|
+
if (!existsSync(projectFile)) {
|
|
527
|
+
console.log(`Project file not found at: ${projectFile}`);
|
|
528
|
+
return null;
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
try {
|
|
532
|
+
const fileContent = readFileSync(projectFile, 'utf8');
|
|
533
|
+
const projectData = JSON.parse(fileContent) as Record<string, unknown>;
|
|
534
|
+
|
|
535
|
+
console.log(`Successfully loaded project overview: ${projectData.project_name || 'Unknown'}`);
|
|
536
|
+
|
|
537
|
+
const overview = projectData.overview as Record<string, unknown> | undefined;
|
|
538
|
+
const technologyStack = overview?.technology_stack as Record<string, unknown[]> | undefined;
|
|
539
|
+
const architecture = overview?.architecture as Record<string, unknown> | undefined;
|
|
540
|
+
const developmentIndex = projectData.development_index as Record<string, unknown[]> | undefined;
|
|
541
|
+
const statistics = projectData.statistics as Record<string, unknown> | undefined;
|
|
542
|
+
const metadata = projectData._metadata as Record<string, unknown> | undefined;
|
|
543
|
+
|
|
544
|
+
return {
|
|
545
|
+
projectName: (projectData.project_name as string) || 'Unknown',
|
|
546
|
+
description: (overview?.description as string) || '',
|
|
547
|
+
initializedAt: (projectData.initialized_at as string) || null,
|
|
548
|
+
technologyStack: {
|
|
549
|
+
languages: (technologyStack?.languages as string[]) || [],
|
|
550
|
+
frameworks: (technologyStack?.frameworks as string[]) || [],
|
|
551
|
+
build_tools: (technologyStack?.build_tools as string[]) || [],
|
|
552
|
+
test_frameworks: (technologyStack?.test_frameworks as string[]) || []
|
|
553
|
+
},
|
|
554
|
+
architecture: {
|
|
555
|
+
style: (architecture?.style as string) || 'Unknown',
|
|
556
|
+
layers: (architecture?.layers as string[]) || [],
|
|
557
|
+
patterns: (architecture?.patterns as string[]) || []
|
|
558
|
+
},
|
|
559
|
+
keyComponents: (overview?.key_components as string[]) || [],
|
|
560
|
+
features: (projectData.features as unknown[]) || [],
|
|
561
|
+
developmentIndex: {
|
|
562
|
+
feature: (developmentIndex?.feature as unknown[]) || [],
|
|
563
|
+
enhancement: (developmentIndex?.enhancement as unknown[]) || [],
|
|
564
|
+
bugfix: (developmentIndex?.bugfix as unknown[]) || [],
|
|
565
|
+
refactor: (developmentIndex?.refactor as unknown[]) || [],
|
|
566
|
+
docs: (developmentIndex?.docs as unknown[]) || []
|
|
567
|
+
},
|
|
568
|
+
statistics: {
|
|
569
|
+
total_features: (statistics?.total_features as number) || 0,
|
|
570
|
+
total_sessions: (statistics?.total_sessions as number) || 0,
|
|
571
|
+
last_updated: (statistics?.last_updated as string) || null
|
|
572
|
+
},
|
|
573
|
+
metadata: {
|
|
574
|
+
initialized_by: (metadata?.initialized_by as string) || 'unknown',
|
|
575
|
+
analysis_timestamp: (metadata?.analysis_timestamp as string) || null,
|
|
576
|
+
analysis_mode: (metadata?.analysis_mode as string) || 'unknown'
|
|
577
|
+
}
|
|
578
|
+
};
|
|
579
|
+
} catch (err) {
|
|
580
|
+
console.error(`Failed to parse project.json at ${projectFile}:`, (err as Error).message);
|
|
581
|
+
console.error('Error stack:', (err as Error).stack);
|
|
582
|
+
return null;
|
|
583
|
+
}
|
|
584
|
+
}
|