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
|
@@ -11,10 +11,11 @@ async function renderHookManager() {
|
|
|
11
11
|
if (statsGrid) statsGrid.style.display = 'none';
|
|
12
12
|
if (searchInput) searchInput.parentElement.style.display = 'none';
|
|
13
13
|
|
|
14
|
-
//
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
// Always reload hook config and available skills to get latest data
|
|
15
|
+
await Promise.all([
|
|
16
|
+
loadHookConfig(),
|
|
17
|
+
loadAvailableSkills()
|
|
18
|
+
]);
|
|
18
19
|
|
|
19
20
|
const globalHooks = hookConfig.global?.hooks || {};
|
|
20
21
|
const projectHooks = hookConfig.project?.hooks || {};
|
|
@@ -29,21 +30,21 @@ async function renderHookManager() {
|
|
|
29
30
|
<div class="hook-section mb-6">
|
|
30
31
|
<div class="flex items-center justify-between mb-4">
|
|
31
32
|
<div class="flex items-center gap-3">
|
|
32
|
-
<h3 class="text-lg font-semibold text-foreground"
|
|
33
|
-
<span class="badge px-2 py-0.5 text-xs font-semibold rounded-full bg-primary-light text-primary"
|
|
33
|
+
<h3 class="text-lg font-semibold text-foreground">${t('hook.projectHooks')}</h3>
|
|
34
|
+
<span class="badge px-2 py-0.5 text-xs font-semibold rounded-full bg-primary-light text-primary">${t('hook.projectFile')}</span>
|
|
34
35
|
<button class="px-3 py-1.5 text-sm bg-primary text-primary-foreground rounded-lg hover:opacity-90 transition-opacity flex items-center gap-1"
|
|
35
36
|
onclick="openHookCreateModal()">
|
|
36
|
-
<span>+</span>
|
|
37
|
+
<span>+</span> ${t('hook.newHook')}
|
|
37
38
|
</button>
|
|
38
39
|
</div>
|
|
39
|
-
<span class="text-sm text-muted-foreground">${projectHookCount}
|
|
40
|
+
<span class="text-sm text-muted-foreground">${projectHookCount} ${t('hook.hooksConfigured')}</span>
|
|
40
41
|
</div>
|
|
41
42
|
|
|
42
43
|
${projectHookCount === 0 ? `
|
|
43
44
|
<div class="hook-empty-state bg-card border border-border rounded-lg p-6 text-center">
|
|
44
45
|
<div class="text-muted-foreground mb-3"><i data-lucide="webhook" class="w-10 h-10 mx-auto"></i></div>
|
|
45
|
-
<p class="text-muted-foreground"
|
|
46
|
-
<p class="text-sm text-muted-foreground mt-1"
|
|
46
|
+
<p class="text-muted-foreground">${t('empty.noHooks')}</p>
|
|
47
|
+
<p class="text-sm text-muted-foreground mt-1">${t('empty.createHookHint')}</p>
|
|
47
48
|
</div>
|
|
48
49
|
` : `
|
|
49
50
|
<div class="hook-grid grid gap-3">
|
|
@@ -56,16 +57,16 @@ async function renderHookManager() {
|
|
|
56
57
|
<div class="hook-section mb-6">
|
|
57
58
|
<div class="flex items-center justify-between mb-4">
|
|
58
59
|
<div class="flex items-center gap-3">
|
|
59
|
-
<h3 class="text-lg font-semibold text-foreground"
|
|
60
|
-
<span class="badge px-2 py-0.5 text-xs font-semibold rounded-full bg-muted text-muted-foreground"
|
|
60
|
+
<h3 class="text-lg font-semibold text-foreground">${t('hook.globalHooks')}</h3>
|
|
61
|
+
<span class="badge px-2 py-0.5 text-xs font-semibold rounded-full bg-muted text-muted-foreground">${t('hook.globalFile')}</span>
|
|
61
62
|
</div>
|
|
62
|
-
<span class="text-sm text-muted-foreground">${globalHookCount}
|
|
63
|
+
<span class="text-sm text-muted-foreground">${globalHookCount} ${t('hook.hooksConfigured')}</span>
|
|
63
64
|
</div>
|
|
64
65
|
|
|
65
66
|
${globalHookCount === 0 ? `
|
|
66
67
|
<div class="hook-empty-state bg-card border border-border rounded-lg p-6 text-center">
|
|
67
|
-
<p class="text-muted-foreground"
|
|
68
|
-
<p class="text-sm text-muted-foreground mt-1"
|
|
68
|
+
<p class="text-muted-foreground">${t('empty.noGlobalHooks')}</p>
|
|
69
|
+
<p class="text-sm text-muted-foreground mt-1">${t('empty.globalHooksHint')}</p>
|
|
69
70
|
</div>
|
|
70
71
|
` : `
|
|
71
72
|
<div class="hook-grid grid gap-3">
|
|
@@ -74,25 +75,44 @@ async function renderHookManager() {
|
|
|
74
75
|
`}
|
|
75
76
|
</div>
|
|
76
77
|
|
|
78
|
+
<!-- Hook Wizards -->
|
|
79
|
+
<div class="hook-section mb-6">
|
|
80
|
+
<div class="flex items-center justify-between mb-4">
|
|
81
|
+
<div class="flex items-center gap-3">
|
|
82
|
+
<h3 class="text-lg font-semibold text-foreground">${t('hook.wizards')}</h3>
|
|
83
|
+
<span class="badge px-2 py-0.5 text-xs font-semibold rounded-full bg-success/20 text-success">${t('hook.guidedSetup')}</span>
|
|
84
|
+
</div>
|
|
85
|
+
<span class="text-sm text-muted-foreground">${t('hook.wizardsDesc')}</span>
|
|
86
|
+
</div>
|
|
87
|
+
|
|
88
|
+
<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
89
|
+
${renderWizardCard('memory-update')}
|
|
90
|
+
${renderWizardCard('memory-setup')}
|
|
91
|
+
${renderWizardCard('skill-context')}
|
|
92
|
+
</div>
|
|
93
|
+
</div>
|
|
94
|
+
|
|
77
95
|
<!-- Quick Install Templates -->
|
|
78
96
|
<div class="hook-section">
|
|
79
97
|
<div class="flex items-center justify-between mb-4">
|
|
80
|
-
<h3 class="text-lg font-semibold text-foreground"
|
|
81
|
-
<span class="text-sm text-muted-foreground"
|
|
98
|
+
<h3 class="text-lg font-semibold text-foreground">${t('hook.quickInstall')}</h3>
|
|
99
|
+
<span class="text-sm text-muted-foreground">${t('hook.oneClick')}</span>
|
|
82
100
|
</div>
|
|
83
101
|
|
|
84
102
|
<div class="hook-templates-grid grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
85
|
-
${renderQuickInstallCard('
|
|
86
|
-
${renderQuickInstallCard('
|
|
87
|
-
${renderQuickInstallCard('
|
|
88
|
-
${renderQuickInstallCard('
|
|
103
|
+
${renderQuickInstallCard('session-context', t('hook.tpl.sessionContext'), t('hook.tpl.sessionContextDesc'), 'UserPromptSubmit', '')}
|
|
104
|
+
${renderQuickInstallCard('codexlens-update', t('hook.tpl.codexlensSync'), t('hook.tpl.codexlensSyncDesc'), 'PostToolUse', 'Write|Edit')}
|
|
105
|
+
${renderQuickInstallCard('ccw-notify', t('hook.tpl.ccwDashboardNotify'), t('hook.tpl.ccwDashboardNotifyDesc'), 'PostToolUse', 'Write')}
|
|
106
|
+
${renderQuickInstallCard('log-tool', t('hook.tpl.toolLogger'), t('hook.tpl.toolLoggerDesc'), 'PostToolUse', 'All')}
|
|
107
|
+
${renderQuickInstallCard('lint-check', t('hook.tpl.autoLint'), t('hook.tpl.autoLintDesc'), 'PostToolUse', 'Write')}
|
|
108
|
+
${renderQuickInstallCard('git-add', t('hook.tpl.autoGitStage'), t('hook.tpl.autoGitStageDesc'), 'PostToolUse', 'Write')}
|
|
89
109
|
</div>
|
|
90
110
|
</div>
|
|
91
111
|
|
|
92
112
|
<!-- Hook Environment Variables Reference -->
|
|
93
113
|
<div class="hook-section mt-6">
|
|
94
114
|
<div class="flex items-center justify-between mb-4">
|
|
95
|
-
<h3 class="text-lg font-semibold text-foreground"
|
|
115
|
+
<h3 class="text-lg font-semibold text-foreground">${t('hook.envVarsRef')}</h3>
|
|
96
116
|
</div>
|
|
97
117
|
|
|
98
118
|
<div class="bg-card border border-border rounded-lg p-4">
|
|
@@ -100,29 +120,29 @@ async function renderHookManager() {
|
|
|
100
120
|
<div class="space-y-2">
|
|
101
121
|
<div class="flex items-start gap-2">
|
|
102
122
|
<code class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">$CLAUDE_FILE_PATHS</code>
|
|
103
|
-
<span class="text-muted-foreground"
|
|
123
|
+
<span class="text-muted-foreground">${t('hook.filePaths')}</span>
|
|
104
124
|
</div>
|
|
105
125
|
<div class="flex items-start gap-2">
|
|
106
126
|
<code class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">$CLAUDE_TOOL_NAME</code>
|
|
107
|
-
<span class="text-muted-foreground"
|
|
127
|
+
<span class="text-muted-foreground">${t('hook.toolName')}</span>
|
|
108
128
|
</div>
|
|
109
129
|
<div class="flex items-start gap-2">
|
|
110
130
|
<code class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">$CLAUDE_TOOL_INPUT</code>
|
|
111
|
-
<span class="text-muted-foreground"
|
|
131
|
+
<span class="text-muted-foreground">${t('hook.toolInput')}</span>
|
|
112
132
|
</div>
|
|
113
133
|
</div>
|
|
114
134
|
<div class="space-y-2">
|
|
115
135
|
<div class="flex items-start gap-2">
|
|
116
136
|
<code class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">$CLAUDE_SESSION_ID</code>
|
|
117
|
-
<span class="text-muted-foreground"
|
|
137
|
+
<span class="text-muted-foreground">${t('hook.sessionId')}</span>
|
|
118
138
|
</div>
|
|
119
139
|
<div class="flex items-start gap-2">
|
|
120
140
|
<code class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">$CLAUDE_PROJECT_DIR</code>
|
|
121
|
-
<span class="text-muted-foreground"
|
|
141
|
+
<span class="text-muted-foreground">${t('hook.projectDir')}</span>
|
|
122
142
|
</div>
|
|
123
143
|
<div class="flex items-start gap-2">
|
|
124
144
|
<code class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">$CLAUDE_WORKING_DIR</code>
|
|
125
|
-
<span class="text-muted-foreground"
|
|
145
|
+
<span class="text-muted-foreground">${t('hook.workingDir')}</span>
|
|
126
146
|
</div>
|
|
127
147
|
</div>
|
|
128
148
|
</div>
|
|
@@ -133,9 +153,164 @@ async function renderHookManager() {
|
|
|
133
153
|
|
|
134
154
|
// Attach event listeners
|
|
135
155
|
attachHookEventListeners();
|
|
136
|
-
|
|
156
|
+
|
|
137
157
|
// Initialize Lucide icons
|
|
138
158
|
if (typeof lucide !== 'undefined') lucide.createIcons();
|
|
159
|
+
|
|
160
|
+
// Load available SKILLs for skill-context wizard
|
|
161
|
+
loadAvailableSkills();
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Load available SKILLs for skill-context wizard
|
|
165
|
+
async function loadAvailableSkills() {
|
|
166
|
+
try {
|
|
167
|
+
const response = await fetch(`/api/skills?path=${encodeURIComponent(projectPath)}`);
|
|
168
|
+
if (!response.ok) throw new Error('Failed to load skills');
|
|
169
|
+
const data = await response.json();
|
|
170
|
+
|
|
171
|
+
const container = document.getElementById('skill-discovery-skill-context');
|
|
172
|
+
if (container && data.skills) {
|
|
173
|
+
if (data.skills.length === 0) {
|
|
174
|
+
container.innerHTML = `
|
|
175
|
+
<span class="font-mono bg-muted px-1.5 py-0.5 rounded">${t('hook.wizard.availableSkills')}</span>
|
|
176
|
+
<span class="text-muted-foreground ml-2">${t('hook.wizard.noSkillsFound').split('.')[0]}</span>
|
|
177
|
+
`;
|
|
178
|
+
} else {
|
|
179
|
+
const skillBadges = data.skills.map(skill => `
|
|
180
|
+
<span class="px-2 py-0.5 bg-emerald-500/10 text-emerald-500 rounded" title="${escapeHtml(skill.description)}">${escapeHtml(skill.name)}</span>
|
|
181
|
+
`).join('');
|
|
182
|
+
container.innerHTML = `
|
|
183
|
+
<span class="font-mono bg-muted px-1.5 py-0.5 rounded">${t('hook.wizard.availableSkills')}</span>
|
|
184
|
+
<div class="flex flex-wrap gap-1 mt-1">${skillBadges}</div>
|
|
185
|
+
`;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// Store skills for wizard use
|
|
190
|
+
window.availableSkills = data.skills || [];
|
|
191
|
+
} catch (err) {
|
|
192
|
+
console.error('Failed to load skills:', err);
|
|
193
|
+
const container = document.getElementById('skill-discovery-skill-context');
|
|
194
|
+
if (container) {
|
|
195
|
+
container.innerHTML = `
|
|
196
|
+
<span class="font-mono bg-muted px-1.5 py-0.5 rounded">${t('hook.wizard.availableSkills')}</span>
|
|
197
|
+
<span class="text-destructive ml-2">${t('toast.loadFailed', { error: err.message })}</span>
|
|
198
|
+
`;
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// Call loadAvailableSkills after rendering hook manager
|
|
204
|
+
const originalRenderHookManager = typeof renderHookManager === 'function' ? renderHookManager : null;
|
|
205
|
+
|
|
206
|
+
function renderWizardCard(wizardId) {
|
|
207
|
+
const wizard = WIZARD_TEMPLATES[wizardId];
|
|
208
|
+
if (!wizard) return '';
|
|
209
|
+
|
|
210
|
+
// Get translated wizard name and description
|
|
211
|
+
const wizardName = wizardId === 'memory-update' ? t('hook.wizard.memoryUpdate') :
|
|
212
|
+
wizardId === 'memory-setup' ? t('hook.wizard.memorySetup') :
|
|
213
|
+
wizardId === 'skill-context' ? t('hook.wizard.skillContext') : wizard.name;
|
|
214
|
+
const wizardDesc = wizardId === 'memory-update' ? t('hook.wizard.memoryUpdateDesc') :
|
|
215
|
+
wizardId === 'memory-setup' ? t('hook.wizard.memorySetupDesc') :
|
|
216
|
+
wizardId === 'skill-context' ? t('hook.wizard.skillContextDesc') : wizard.description;
|
|
217
|
+
|
|
218
|
+
// Translate options
|
|
219
|
+
const getOptionName = (wizardId, optId) => {
|
|
220
|
+
if (wizardId === 'memory-update') {
|
|
221
|
+
if (optId === 'on-stop') return t('hook.wizard.onSessionEnd');
|
|
222
|
+
if (optId === 'periodic') return t('hook.wizard.periodicUpdate');
|
|
223
|
+
if (optId === 'count-based') return t('hook.wizard.countBasedUpdate');
|
|
224
|
+
}
|
|
225
|
+
if (wizardId === 'memory-setup') {
|
|
226
|
+
if (optId === 'file-read') return t('hook.wizard.fileReadTracker');
|
|
227
|
+
if (optId === 'file-write') return t('hook.wizard.fileWriteTracker');
|
|
228
|
+
if (optId === 'prompts') return t('hook.wizard.promptTracker');
|
|
229
|
+
}
|
|
230
|
+
if (wizardId === 'skill-context') {
|
|
231
|
+
if (optId === 'keyword') return t('hook.wizard.keywordMatching');
|
|
232
|
+
if (optId === 'auto') return t('hook.wizard.autoDetection');
|
|
233
|
+
}
|
|
234
|
+
return wizard.options.find(o => o.id === optId)?.name || '';
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
const getOptionDesc = (wizardId, optId) => {
|
|
238
|
+
if (wizardId === 'memory-update') {
|
|
239
|
+
if (optId === 'on-stop') return t('hook.wizard.onSessionEndDesc');
|
|
240
|
+
if (optId === 'periodic') return t('hook.wizard.periodicUpdateDesc');
|
|
241
|
+
if (optId === 'count-based') return t('hook.wizard.countBasedUpdateDesc');
|
|
242
|
+
}
|
|
243
|
+
if (wizardId === 'memory-setup') {
|
|
244
|
+
if (optId === 'file-read') return t('hook.wizard.fileReadTrackerDesc');
|
|
245
|
+
if (optId === 'file-write') return t('hook.wizard.fileWriteTrackerDesc');
|
|
246
|
+
if (optId === 'prompts') return t('hook.wizard.promptTrackerDesc');
|
|
247
|
+
}
|
|
248
|
+
if (wizardId === 'skill-context') {
|
|
249
|
+
if (optId === 'keyword') return t('hook.wizard.keywordMatchingDesc');
|
|
250
|
+
if (optId === 'auto') return t('hook.wizard.autoDetectionDesc');
|
|
251
|
+
}
|
|
252
|
+
return wizard.options.find(o => o.id === optId)?.description || '';
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
// Determine what to show in the tools/skills section
|
|
256
|
+
let toolsSection = '';
|
|
257
|
+
if (wizard.requiresSkillDiscovery) {
|
|
258
|
+
toolsSection = `
|
|
259
|
+
<div class="flex items-center gap-2 text-xs text-muted-foreground mb-4">
|
|
260
|
+
<span class="font-mono bg-muted px-1.5 py-0.5 rounded">${t('hook.wizard.event')}</span>
|
|
261
|
+
<span class="px-2 py-0.5 bg-amber-500/10 text-amber-500 rounded">UserPromptSubmit</span>
|
|
262
|
+
</div>
|
|
263
|
+
<div id="skill-discovery-${wizardId}" class="text-xs text-muted-foreground mb-4">
|
|
264
|
+
<span class="font-mono bg-muted px-1.5 py-0.5 rounded">${t('hook.wizard.availableSkills')}</span>
|
|
265
|
+
<span class="text-muted-foreground ml-2">${t('hook.wizard.loading')}</span>
|
|
266
|
+
</div>
|
|
267
|
+
`;
|
|
268
|
+
} else if (wizard.multiSelect) {
|
|
269
|
+
// memory-setup: lightweight tracking, no CLI tools
|
|
270
|
+
toolsSection = '';
|
|
271
|
+
} else {
|
|
272
|
+
toolsSection = `
|
|
273
|
+
<div class="flex items-center gap-2 text-xs text-muted-foreground mb-4">
|
|
274
|
+
<span class="font-mono bg-muted px-1.5 py-0.5 rounded">${t('hook.wizard.cliTools')}</span>
|
|
275
|
+
<span class="px-2 py-0.5 bg-blue-500/10 text-blue-500 rounded">gemini</span>
|
|
276
|
+
<span class="px-2 py-0.5 bg-purple-500/10 text-purple-500 rounded">qwen</span>
|
|
277
|
+
<span class="px-2 py-0.5 bg-green-500/10 text-green-500 rounded">codex</span>
|
|
278
|
+
</div>
|
|
279
|
+
`;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
return `
|
|
283
|
+
<div class="hook-wizard-card bg-gradient-to-br from-primary/5 to-primary/10 border border-primary/20 rounded-lg p-5 hover:shadow-lg transition-all">
|
|
284
|
+
<div class="flex items-start justify-between mb-4">
|
|
285
|
+
<div class="flex items-center gap-3">
|
|
286
|
+
<div class="p-2.5 bg-primary/10 rounded-lg">
|
|
287
|
+
<i data-lucide="${wizard.icon}" class="w-6 h-6 text-primary"></i>
|
|
288
|
+
</div>
|
|
289
|
+
<div>
|
|
290
|
+
<h4 class="font-semibold text-foreground">${escapeHtml(wizardName)}</h4>
|
|
291
|
+
<p class="text-sm text-muted-foreground">${escapeHtml(wizardDesc)}</p>
|
|
292
|
+
</div>
|
|
293
|
+
</div>
|
|
294
|
+
</div>
|
|
295
|
+
|
|
296
|
+
<div class="space-y-2 mb-4">
|
|
297
|
+
${wizard.options.map(opt => `
|
|
298
|
+
<div class="flex items-center gap-2 text-sm text-muted-foreground">
|
|
299
|
+
<i data-lucide="check" class="w-4 h-4 text-success"></i>
|
|
300
|
+
<span>${escapeHtml(getOptionName(wizardId, opt.id))}: ${escapeHtml(getOptionDesc(wizardId, opt.id))}</span>
|
|
301
|
+
</div>
|
|
302
|
+
`).join('')}
|
|
303
|
+
</div>
|
|
304
|
+
|
|
305
|
+
${toolsSection}
|
|
306
|
+
|
|
307
|
+
<button class="w-full px-4 py-2.5 text-sm bg-primary text-primary-foreground rounded-lg hover:opacity-90 transition-opacity flex items-center justify-center gap-2"
|
|
308
|
+
onclick="openHookWizardModal('${wizardId}')">
|
|
309
|
+
<i data-lucide="wand-2" class="w-4 h-4"></i>
|
|
310
|
+
${t('hook.openWizard')}
|
|
311
|
+
</button>
|
|
312
|
+
</div>
|
|
313
|
+
`;
|
|
139
314
|
}
|
|
140
315
|
|
|
141
316
|
function countHooks(hooks) {
|
|
@@ -156,8 +331,10 @@ function renderHooksByEvent(hooks, scope) {
|
|
|
156
331
|
|
|
157
332
|
return hookList.map((hook, index) => {
|
|
158
333
|
const matcher = hook.matcher || 'All tools';
|
|
159
|
-
|
|
334
|
+
// Support both old format (hook.command) and new Claude Code format (hook.hooks[0].command)
|
|
335
|
+
const command = hook.hooks?.[0]?.command || hook.command || 'N/A';
|
|
160
336
|
const args = hook.args || [];
|
|
337
|
+
const timeout = hook.hooks?.[0]?.timeout || hook.timeout;
|
|
161
338
|
|
|
162
339
|
return `
|
|
163
340
|
<div class="hook-card bg-card border border-border rounded-lg p-4 hover:shadow-md transition-all">
|
|
@@ -194,9 +371,9 @@ function renderHooksByEvent(hooks, scope) {
|
|
|
194
371
|
<span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">matcher</span>
|
|
195
372
|
<span class="text-muted-foreground">${escapeHtml(matcher)}</span>
|
|
196
373
|
</div>
|
|
197
|
-
<div class="flex items-
|
|
374
|
+
<div class="flex items-start gap-2">
|
|
198
375
|
<span class="font-mono text-xs bg-muted px-1.5 py-0.5 rounded shrink-0">command</span>
|
|
199
|
-
<span class="font-mono text-xs text-foreground">${escapeHtml(command)}</span>
|
|
376
|
+
<span class="font-mono text-xs text-foreground break-all line-clamp-3 overflow-hidden" title="${escapeHtml(command)}">${escapeHtml(command)}</span>
|
|
200
377
|
</div>
|
|
201
378
|
${args.length > 0 ? `
|
|
202
379
|
<div class="flex items-start gap-2">
|
|
@@ -213,6 +390,9 @@ function renderHooksByEvent(hooks, scope) {
|
|
|
213
390
|
|
|
214
391
|
function renderQuickInstallCard(templateId, title, description, event, matcher) {
|
|
215
392
|
const isInstalled = isHookTemplateInstalled(templateId);
|
|
393
|
+
const template = HOOK_TEMPLATES[templateId];
|
|
394
|
+
const category = template?.category || 'general';
|
|
395
|
+
const categoryTranslated = t(`hook.category.${category}`) || category;
|
|
216
396
|
|
|
217
397
|
return `
|
|
218
398
|
<div class="hook-template-card bg-card border border-border rounded-lg p-4 hover:shadow-md transition-all ${isInstalled ? 'border-success bg-success-light/30' : ''}">
|
|
@@ -224,6 +404,11 @@ function renderQuickInstallCard(templateId, title, description, event, matcher)
|
|
|
224
404
|
<p class="text-xs text-muted-foreground">${escapeHtml(description)}</p>
|
|
225
405
|
</div>
|
|
226
406
|
</div>
|
|
407
|
+
<button class="p-1.5 text-muted-foreground hover:text-foreground hover:bg-hover rounded transition-colors"
|
|
408
|
+
onclick="viewTemplateDetails('${templateId}')"
|
|
409
|
+
title="${t('hook.viewDetails')}">
|
|
410
|
+
<i data-lucide="eye" class="w-4 h-4"></i>
|
|
411
|
+
</button>
|
|
227
412
|
</div>
|
|
228
413
|
|
|
229
414
|
<div class="hook-template-meta text-xs text-muted-foreground mb-3 flex items-center gap-3">
|
|
@@ -231,8 +416,9 @@ function renderQuickInstallCard(templateId, title, description, event, matcher)
|
|
|
231
416
|
<span class="font-mono bg-muted px-1 py-0.5 rounded">${event}</span>
|
|
232
417
|
</span>
|
|
233
418
|
<span class="flex items-center gap-1">
|
|
234
|
-
|
|
419
|
+
${t('hook.wizard.matches')} <span class="font-medium">${matcher}</span>
|
|
235
420
|
</span>
|
|
421
|
+
<span class="px-1.5 py-0.5 bg-primary/10 text-primary rounded text-xs">${categoryTranslated}</span>
|
|
236
422
|
</div>
|
|
237
423
|
|
|
238
424
|
<div class="flex items-center gap-2">
|
|
@@ -240,18 +426,18 @@ function renderQuickInstallCard(templateId, title, description, event, matcher)
|
|
|
240
426
|
<button class="flex-1 px-3 py-1.5 text-sm bg-destructive/10 text-destructive rounded hover:bg-destructive/20 transition-colors"
|
|
241
427
|
data-template="${templateId}"
|
|
242
428
|
data-action="uninstall">
|
|
243
|
-
|
|
429
|
+
${t('hook.uninstall')}
|
|
244
430
|
</button>
|
|
245
431
|
` : `
|
|
246
432
|
<button class="flex-1 px-3 py-1.5 text-sm bg-primary text-primary-foreground rounded hover:opacity-90 transition-opacity"
|
|
247
433
|
data-template="${templateId}"
|
|
248
434
|
data-action="install-project">
|
|
249
|
-
|
|
435
|
+
${t('hook.installProject')}
|
|
250
436
|
</button>
|
|
251
437
|
<button class="px-3 py-1.5 text-sm bg-muted text-foreground rounded hover:bg-hover transition-colors"
|
|
252
438
|
data-template="${templateId}"
|
|
253
439
|
data-action="install-global">
|
|
254
|
-
|
|
440
|
+
${t('hook.installGlobal')}
|
|
255
441
|
</button>
|
|
256
442
|
`}
|
|
257
443
|
</div>
|
|
@@ -263,18 +449,43 @@ function isHookTemplateInstalled(templateId) {
|
|
|
263
449
|
const template = HOOK_TEMPLATES[templateId];
|
|
264
450
|
if (!template) return false;
|
|
265
451
|
|
|
452
|
+
// Define unique patterns for each template type (more specific than just command)
|
|
453
|
+
const uniquePatterns = {
|
|
454
|
+
'session-context': 'hook session-context',
|
|
455
|
+
'codexlens-update': 'codexlens update',
|
|
456
|
+
'ccw-notify': 'api/hook',
|
|
457
|
+
'log-tool': 'tool-usage.log',
|
|
458
|
+
'lint-check': 'eslint',
|
|
459
|
+
'git-add': 'git add',
|
|
460
|
+
'memory-file-read': 'memory track --type file --action read',
|
|
461
|
+
'memory-file-write': 'memory track --type file --action write',
|
|
462
|
+
'memory-prompt-track': 'memory track --type topic',
|
|
463
|
+
'skill-context-auto': 'skill-context-auto'
|
|
464
|
+
};
|
|
465
|
+
|
|
466
|
+
// Use unique pattern if defined, otherwise fall back to command + args
|
|
467
|
+
const searchPattern = uniquePatterns[templateId] ||
|
|
468
|
+
(template.command + (template.args ? ' ' + template.args.join(' ') : ''));
|
|
469
|
+
|
|
266
470
|
// Check project hooks
|
|
267
471
|
const projectHooks = hookConfig.project?.hooks?.[template.event];
|
|
268
472
|
if (projectHooks) {
|
|
269
473
|
const hookList = Array.isArray(projectHooks) ? projectHooks : [projectHooks];
|
|
270
|
-
if (hookList.some(h =>
|
|
474
|
+
if (hookList.some(h => {
|
|
475
|
+
// Check both old format (h.command) and new format (h.hooks[0].command)
|
|
476
|
+
const cmd = h.hooks?.[0]?.command || h.command || '';
|
|
477
|
+
return cmd.includes(searchPattern);
|
|
478
|
+
})) return true;
|
|
271
479
|
}
|
|
272
480
|
|
|
273
481
|
// Check global hooks
|
|
274
482
|
const globalHooks = hookConfig.global?.hooks?.[template.event];
|
|
275
483
|
if (globalHooks) {
|
|
276
484
|
const hookList = Array.isArray(globalHooks) ? globalHooks : [globalHooks];
|
|
277
|
-
if (hookList.some(h =>
|
|
485
|
+
if (hookList.some(h => {
|
|
486
|
+
const cmd = h.hooks?.[0]?.command || h.command || '';
|
|
487
|
+
return cmd.includes(searchPattern);
|
|
488
|
+
})) return true;
|
|
278
489
|
}
|
|
279
490
|
|
|
280
491
|
return false;
|
|
@@ -287,6 +498,12 @@ async function installHookTemplate(templateId, scope) {
|
|
|
287
498
|
return;
|
|
288
499
|
}
|
|
289
500
|
|
|
501
|
+
// Check if already installed
|
|
502
|
+
if (isHookTemplateInstalled(templateId)) {
|
|
503
|
+
showRefreshToast('Hook already installed', 'info');
|
|
504
|
+
return;
|
|
505
|
+
}
|
|
506
|
+
|
|
290
507
|
const hookData = {
|
|
291
508
|
command: template.command,
|
|
292
509
|
args: template.args
|
|
@@ -303,11 +520,37 @@ async function uninstallHookTemplate(templateId) {
|
|
|
303
520
|
const template = HOOK_TEMPLATES[templateId];
|
|
304
521
|
if (!template) return;
|
|
305
522
|
|
|
523
|
+
// Extract unique identifier from template args for matching
|
|
524
|
+
// Template args format: ['-c', 'actual command...']
|
|
525
|
+
const templateArgs = template.args || [];
|
|
526
|
+
const templateFullCmd = templateArgs.length > 0 ? templateArgs.join(' ') : '';
|
|
527
|
+
|
|
528
|
+
// Define unique patterns for each template type
|
|
529
|
+
const uniquePatterns = {
|
|
530
|
+
'session-context': 'hook session-context',
|
|
531
|
+
'codexlens-update': 'codexlens update',
|
|
532
|
+
'ccw-notify': 'api/hook',
|
|
533
|
+
'log-tool': 'tool-usage.log',
|
|
534
|
+
'lint-check': 'eslint',
|
|
535
|
+
'git-add': 'git add',
|
|
536
|
+
'memory-file-read': 'memory track',
|
|
537
|
+
'memory-file-write': 'memory track',
|
|
538
|
+
'memory-prompt-track': 'memory track'
|
|
539
|
+
};
|
|
540
|
+
|
|
541
|
+
const uniquePattern = uniquePatterns[templateId] || template.command;
|
|
542
|
+
|
|
543
|
+
// Helper to check if a hook matches the template
|
|
544
|
+
const matchesTemplate = (h) => {
|
|
545
|
+
const hookCmd = h.hooks?.[0]?.command || h.command || '';
|
|
546
|
+
return hookCmd.includes(uniquePattern);
|
|
547
|
+
};
|
|
548
|
+
|
|
306
549
|
// Find and remove from project hooks
|
|
307
550
|
const projectHooks = hookConfig.project?.hooks?.[template.event];
|
|
308
551
|
if (projectHooks) {
|
|
309
552
|
const hookList = Array.isArray(projectHooks) ? projectHooks : [projectHooks];
|
|
310
|
-
const index = hookList.findIndex(
|
|
553
|
+
const index = hookList.findIndex(matchesTemplate);
|
|
311
554
|
if (index !== -1) {
|
|
312
555
|
await removeHook('project', template.event, index);
|
|
313
556
|
return;
|
|
@@ -318,12 +561,14 @@ async function uninstallHookTemplate(templateId) {
|
|
|
318
561
|
const globalHooks = hookConfig.global?.hooks?.[template.event];
|
|
319
562
|
if (globalHooks) {
|
|
320
563
|
const hookList = Array.isArray(globalHooks) ? globalHooks : [globalHooks];
|
|
321
|
-
const index = hookList.findIndex(
|
|
564
|
+
const index = hookList.findIndex(matchesTemplate);
|
|
322
565
|
if (index !== -1) {
|
|
323
566
|
await removeHook('global', template.event, index);
|
|
324
567
|
return;
|
|
325
568
|
}
|
|
326
569
|
}
|
|
570
|
+
|
|
571
|
+
showRefreshToast('Hook not found', 'error');
|
|
327
572
|
}
|
|
328
573
|
|
|
329
574
|
function attachHookEventListeners() {
|
|
@@ -340,13 +585,36 @@ function attachHookEventListeners() {
|
|
|
340
585
|
const hook = hookList[index];
|
|
341
586
|
|
|
342
587
|
if (hook) {
|
|
588
|
+
// Support both Claude Code format (hooks[0].command) and legacy format (command + args)
|
|
589
|
+
let command = '';
|
|
590
|
+
let args = [];
|
|
591
|
+
|
|
592
|
+
if (hook.hooks && hook.hooks[0]) {
|
|
593
|
+
// Claude Code format: { hooks: [{ type: "command", command: "bash -c '...'" }] }
|
|
594
|
+
const fullCommand = hook.hooks[0].command || '';
|
|
595
|
+
// Try to split command and args for bash -c commands
|
|
596
|
+
const bashMatch = fullCommand.match(/^(bash|sh|cmd)\s+(-c)\s+(.+)$/s);
|
|
597
|
+
if (bashMatch) {
|
|
598
|
+
command = bashMatch[1];
|
|
599
|
+
args = [bashMatch[2], bashMatch[3]];
|
|
600
|
+
} else {
|
|
601
|
+
// For other commands, put the whole thing as command
|
|
602
|
+
command = fullCommand;
|
|
603
|
+
args = [];
|
|
604
|
+
}
|
|
605
|
+
} else {
|
|
606
|
+
// Legacy format: { command: "bash", args: ["-c", "..."] }
|
|
607
|
+
command = hook.command || '';
|
|
608
|
+
args = hook.args || [];
|
|
609
|
+
}
|
|
610
|
+
|
|
343
611
|
openHookCreateModal({
|
|
344
612
|
scope: scope,
|
|
345
613
|
event: event,
|
|
346
614
|
index: index,
|
|
347
615
|
matcher: hook.matcher || '',
|
|
348
|
-
command:
|
|
349
|
-
args:
|
|
616
|
+
command: command,
|
|
617
|
+
args: args
|
|
350
618
|
});
|
|
351
619
|
}
|
|
352
620
|
});
|
|
@@ -360,7 +628,7 @@ function attachHookEventListeners() {
|
|
|
360
628
|
const event = button.dataset.event;
|
|
361
629
|
const index = parseInt(button.dataset.index);
|
|
362
630
|
|
|
363
|
-
if (confirm(
|
|
631
|
+
if (confirm(t('hook.deleteConfirm', { event: event }))) {
|
|
364
632
|
await removeHook(scope, event, index);
|
|
365
633
|
}
|
|
366
634
|
});
|