claude-code-workflow 6.3.18 → 6.3.19
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 +8 -5
- package/.claude/agents/action-planning-agent.md +26 -2
- package/.claude/agents/code-developer.md +132 -43
- package/.claude/agents/debug-explore-agent.md +434 -0
- package/.claude/agents/test-fix-agent.md +14 -0
- package/.claude/commands/issue/discover.md +41 -0
- package/.claude/commands/issue/execute.md +200 -19
- package/.claude/commands/issue/new.md +1 -1
- package/.claude/commands/issue/plan.md +6 -1
- package/.claude/commands/issue/queue.md +94 -39
- package/.claude/commands/memory/swagger-docs.md +773 -0
- package/.claude/commands/workflow/brainstorm/auto-parallel.md +21 -21
- package/.claude/commands/workflow/execute.md +54 -34
- package/.claude/commands/workflow/lite-execute.md +48 -164
- package/.claude/commands/workflow/lite-fix.md +4 -4
- package/.claude/commands/workflow/lite-plan.md +5 -5
- package/.claude/commands/workflow/plan.md +27 -27
- package/.claude/commands/workflow/review.md +42 -17
- package/.claude/commands/workflow/tdd-plan.md +25 -25
- package/.claude/commands/workflow/test-fix-gen.md +10 -10
- package/.claude/commands/workflow/test-gen.md +14 -14
- package/.claude/commands/workflow/ui-design/explore-auto.md +21 -21
- package/.claude/commands/workflow/ui-design/imitate-auto.md +24 -24
- package/.claude/skills/_shared/SKILL-DESIGN-SPEC.md +693 -0
- package/.claude/skills/ccw/SKILL.md +462 -0
- package/.claude/skills/ccw/index/command-capabilities.json +127 -0
- package/.claude/skills/ccw/index/intent-rules.json +136 -0
- package/.claude/skills/ccw/index/workflow-chains.json +451 -0
- package/.claude/skills/ccw/phases/actions/bugfix.md +218 -0
- package/.claude/skills/ccw/phases/actions/coupled.md +194 -0
- package/.claude/skills/ccw/phases/actions/docs.md +93 -0
- package/.claude/skills/ccw/phases/actions/full.md +154 -0
- package/.claude/skills/ccw/phases/actions/issue.md +201 -0
- package/.claude/skills/ccw/phases/actions/rapid.md +104 -0
- package/.claude/skills/ccw/phases/actions/review-fix.md +84 -0
- package/.claude/skills/ccw/phases/actions/tdd.md +66 -0
- package/.claude/skills/ccw/phases/actions/ui.md +79 -0
- package/.claude/skills/ccw/phases/orchestrator.md +435 -0
- package/.claude/skills/ccw/specs/intent-classification.md +336 -0
- package/.claude/skills/ccw-help/SKILL.md +177 -0
- package/.claude/skills/ccw-help/index/all-agents.json +82 -0
- package/.claude/skills/{command-guide → ccw-help}/index/all-commands.json +183 -73
- package/.claude/skills/{command-guide → ccw-help}/index/by-category.json +187 -73
- package/.claude/skills/{command-guide → ccw-help}/index/by-use-case.json +295 -185
- package/.claude/skills/{command-guide → ccw-help}/index/command-relationships.json +19 -166
- package/.claude/skills/{command-guide → ccw-help}/index/essential-commands.json +10 -10
- package/.claude/skills/ccw-help/scripts/analyze_commands.py +337 -0
- package/.claude/skills/code-reviewer/README.md +340 -0
- package/.claude/skills/code-reviewer/SKILL.md +308 -0
- package/.claude/skills/code-reviewer/phases/01-code-discovery.md +246 -0
- package/.claude/skills/code-reviewer/phases/02-security-analysis.md +442 -0
- package/.claude/skills/code-reviewer/phases/03-best-practices-review.md +36 -0
- package/.claude/skills/code-reviewer/phases/04-report-generation.md +278 -0
- package/.claude/skills/code-reviewer/specs/best-practices-requirements.md +346 -0
- package/.claude/skills/code-reviewer/specs/quality-standards.md +252 -0
- package/.claude/skills/code-reviewer/specs/security-requirements.md +243 -0
- package/.claude/skills/code-reviewer/templates/best-practice-finding.md +234 -0
- package/.claude/skills/code-reviewer/templates/report-template.md +316 -0
- package/.claude/skills/code-reviewer/templates/security-finding.md +161 -0
- package/.claude/skills/skill-generator/SKILL.md +187 -0
- package/.claude/skills/skill-generator/phases/01-requirements-discovery.md +239 -0
- package/.claude/skills/skill-generator/phases/02-structure-generation.md +207 -0
- package/.claude/skills/skill-generator/phases/03-phase-generation.md +802 -0
- package/.claude/skills/skill-generator/phases/04-specs-templates.md +328 -0
- package/.claude/skills/skill-generator/phases/05-validation.md +334 -0
- package/.claude/skills/skill-generator/specs/cli-integration.md +448 -0
- package/.claude/skills/skill-generator/specs/execution-modes.md +396 -0
- package/.claude/skills/skill-generator/specs/scripting-integration.md +265 -0
- package/.claude/skills/skill-generator/specs/skill-requirements.md +466 -0
- package/.claude/skills/skill-generator/templates/autonomous-action.md +517 -0
- package/.claude/skills/skill-generator/templates/autonomous-orchestrator.md +276 -0
- package/.claude/skills/skill-generator/templates/code-analysis-action.md +503 -0
- package/.claude/skills/skill-generator/templates/llm-action.md +355 -0
- package/.claude/skills/skill-generator/templates/script-bash.md +277 -0
- package/.claude/skills/skill-generator/templates/script-python.md +198 -0
- package/.claude/skills/skill-generator/templates/sequential-phase.md +441 -0
- package/.claude/skills/skill-generator/templates/skill-md.md +156 -0
- package/.claude/workflows/chinese-response.md +15 -28
- package/.claude/workflows/cli-templates/prompts/documentation/swagger-api.txt +266 -0
- package/.claude/workflows/cli-tools-usage.md +221 -177
- package/.claude/workflows/windows-platform.md +13 -10
- package/.codex/prompts/issue-execute.md +305 -82
- package/.codex/prompts/issue-queue.md +22 -0
- package/.codex/prompts/lite-execute.md +36 -11
- package/README.md +309 -305
- package/ccw/README.md +10 -4
- package/ccw/dist/cli.d.ts.map +1 -1
- package/ccw/dist/cli.js +4 -1
- package/ccw/dist/cli.js.map +1 -1
- package/ccw/dist/commands/cli.d.ts.map +1 -1
- package/ccw/dist/commands/cli.js +131 -34
- package/ccw/dist/commands/cli.js.map +1 -1
- package/ccw/dist/commands/issue.d.ts +152 -0
- package/ccw/dist/commands/issue.d.ts.map +1 -1
- package/ccw/dist/commands/issue.js +550 -85
- package/ccw/dist/commands/issue.js.map +1 -1
- package/ccw/dist/commands/serve.d.ts +1 -0
- package/ccw/dist/commands/serve.d.ts.map +1 -1
- package/ccw/dist/commands/serve.js +12 -5
- package/ccw/dist/commands/serve.js.map +1 -1
- package/ccw/dist/commands/stop.d.ts.map +1 -1
- package/ccw/dist/commands/stop.js +29 -5
- package/ccw/dist/commands/stop.js.map +1 -1
- package/ccw/dist/commands/tool.d.ts.map +1 -1
- package/ccw/dist/commands/tool.js +19 -2
- package/ccw/dist/commands/tool.js.map +1 -1
- package/ccw/dist/commands/view.d.ts +1 -0
- package/ccw/dist/commands/view.d.ts.map +1 -1
- package/ccw/dist/commands/view.js +10 -3
- package/ccw/dist/commands/view.js.map +1 -1
- package/ccw/dist/config/cli-settings-manager.d.ts +86 -0
- package/ccw/dist/config/cli-settings-manager.d.ts.map +1 -0
- package/ccw/dist/config/cli-settings-manager.js +392 -0
- package/ccw/dist/config/cli-settings-manager.js.map +1 -0
- package/ccw/dist/config/litellm-api-config-manager.d.ts +71 -5
- package/ccw/dist/config/litellm-api-config-manager.d.ts.map +1 -1
- package/ccw/dist/config/litellm-api-config-manager.js +290 -20
- package/ccw/dist/config/litellm-api-config-manager.js.map +1 -1
- package/ccw/dist/core/auth/csrf-manager.d.ts +18 -0
- package/ccw/dist/core/auth/csrf-manager.d.ts.map +1 -0
- package/ccw/dist/core/auth/csrf-manager.js +80 -0
- package/ccw/dist/core/auth/csrf-manager.js.map +1 -0
- package/ccw/dist/core/auth/csrf-middleware.d.ts +8 -0
- package/ccw/dist/core/auth/csrf-middleware.d.ts.map +1 -0
- package/ccw/dist/core/auth/csrf-middleware.js +141 -0
- package/ccw/dist/core/auth/csrf-middleware.js.map +1 -0
- package/ccw/dist/core/auth/middleware.d.ts +15 -0
- package/ccw/dist/core/auth/middleware.d.ts.map +1 -0
- package/ccw/dist/core/auth/middleware.js +76 -0
- package/ccw/dist/core/auth/middleware.js.map +1 -0
- package/ccw/dist/core/auth/token-manager.d.ts +41 -0
- package/ccw/dist/core/auth/token-manager.d.ts.map +1 -0
- package/ccw/dist/core/auth/token-manager.js +171 -0
- package/ccw/dist/core/auth/token-manager.js.map +1 -0
- package/ccw/dist/core/cache-manager.d.ts +6 -6
- package/ccw/dist/core/cache-manager.d.ts.map +1 -1
- package/ccw/dist/core/cache-manager.js +70 -48
- package/ccw/dist/core/cache-manager.js.map +1 -1
- package/ccw/dist/core/claude-freshness.d.ts.map +1 -1
- package/ccw/dist/core/claude-freshness.js +23 -3
- package/ccw/dist/core/claude-freshness.js.map +1 -1
- package/ccw/dist/core/core-memory-store.d.ts.map +1 -1
- package/ccw/dist/core/core-memory-store.js +2 -1
- package/ccw/dist/core/core-memory-store.js.map +1 -1
- package/ccw/dist/core/cors.d.ts +3 -0
- package/ccw/dist/core/cors.d.ts.map +1 -0
- package/ccw/dist/core/cors.js +10 -0
- package/ccw/dist/core/cors.js.map +1 -0
- package/ccw/dist/core/dashboard-generator-patch.js +0 -1
- package/ccw/dist/core/dashboard-generator-patch.js.map +1 -1
- package/ccw/dist/core/dashboard-generator.d.ts.map +1 -1
- package/ccw/dist/core/dashboard-generator.js +417 -416
- package/ccw/dist/core/dashboard-generator.js.map +1 -1
- package/ccw/dist/core/data-aggregator.js +2 -2
- package/ccw/dist/core/data-aggregator.js.map +1 -1
- package/ccw/dist/core/lite-scanner.d.ts +1 -1
- package/ccw/dist/core/lite-scanner.d.ts.map +1 -1
- package/ccw/dist/core/lite-scanner.js +130 -127
- package/ccw/dist/core/lite-scanner.js.map +1 -1
- package/ccw/dist/core/routes/auth-routes.d.ts +12 -0
- package/ccw/dist/core/routes/auth-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/auth-routes.js +80 -0
- package/ccw/dist/core/routes/auth-routes.js.map +1 -0
- package/ccw/dist/core/routes/ccw-routes.d.ts +1 -14
- package/ccw/dist/core/routes/ccw-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/ccw-routes.js +9 -4
- package/ccw/dist/core/routes/ccw-routes.js.map +1 -1
- package/ccw/dist/core/routes/claude-routes.d.ts +1 -14
- package/ccw/dist/core/routes/claude-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/claude-routes.js +98 -39
- package/ccw/dist/core/routes/claude-routes.js.map +1 -1
- package/ccw/dist/core/routes/cli-routes.d.ts +14 -12
- package/ccw/dist/core/routes/cli-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/cli-routes.js +122 -43
- package/ccw/dist/core/routes/cli-routes.js.map +1 -1
- package/ccw/dist/core/routes/cli-settings-routes.d.ts +11 -0
- package/ccw/dist/core/routes/cli-settings-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/cli-settings-routes.js +204 -0
- package/ccw/dist/core/routes/cli-settings-routes.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/config-handlers.d.ts +6 -0
- package/ccw/dist/core/routes/codexlens/config-handlers.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/config-handlers.js +1195 -0
- package/ccw/dist/core/routes/codexlens/config-handlers.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/index-handlers.d.ts +10 -0
- package/ccw/dist/core/routes/codexlens/index-handlers.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/index-handlers.js +322 -0
- package/ccw/dist/core/routes/codexlens/index-handlers.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts +6 -0
- package/ccw/dist/core/routes/codexlens/semantic-handlers.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/semantic-handlers.js +865 -0
- package/ccw/dist/core/routes/codexlens/semantic-handlers.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/utils.d.ts +23 -0
- package/ccw/dist/core/routes/codexlens/utils.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/utils.js +85 -0
- package/ccw/dist/core/routes/codexlens/utils.js.map +1 -0
- package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts +13 -0
- package/ccw/dist/core/routes/codexlens/watcher-handlers.d.ts.map +1 -0
- package/ccw/dist/core/routes/codexlens/watcher-handlers.js +235 -0
- package/ccw/dist/core/routes/codexlens/watcher-handlers.js.map +1 -0
- package/ccw/dist/core/routes/codexlens-routes.d.ts +2 -11
- package/ccw/dist/core/routes/codexlens-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/codexlens-routes.js +10 -981
- package/ccw/dist/core/routes/codexlens-routes.js.map +1 -1
- package/ccw/dist/core/routes/discovery-routes.d.ts +1 -35
- package/ccw/dist/core/routes/discovery-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/discovery-routes.js +25 -0
- package/ccw/dist/core/routes/discovery-routes.js.map +1 -1
- package/ccw/dist/core/routes/files-routes.d.ts +1 -14
- package/ccw/dist/core/routes/files-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/files-routes.js +57 -14
- package/ccw/dist/core/routes/files-routes.js.map +1 -1
- package/ccw/dist/core/routes/graph-routes.d.ts +1 -14
- package/ccw/dist/core/routes/graph-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/graph-routes.js +36 -37
- package/ccw/dist/core/routes/graph-routes.js.map +1 -1
- package/ccw/dist/core/routes/help-routes.d.ts +1 -14
- package/ccw/dist/core/routes/help-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/help-routes.js +5 -0
- package/ccw/dist/core/routes/help-routes.js.map +1 -1
- package/ccw/dist/core/routes/hooks-routes.d.ts +4 -14
- package/ccw/dist/core/routes/hooks-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/hooks-routes.js +43 -21
- package/ccw/dist/core/routes/hooks-routes.js.map +1 -1
- package/ccw/dist/core/routes/issue-routes.d.ts +1 -34
- package/ccw/dist/core/routes/issue-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/issue-routes.js +24 -0
- package/ccw/dist/core/routes/issue-routes.js.map +1 -1
- package/ccw/dist/core/routes/litellm-api-routes.d.ts +1 -14
- package/ccw/dist/core/routes/litellm-api-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/litellm-api-routes.js +505 -48
- package/ccw/dist/core/routes/litellm-api-routes.js.map +1 -1
- package/ccw/dist/core/routes/litellm-routes.d.ts +1 -14
- package/ccw/dist/core/routes/litellm-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/litellm-routes.js +28 -11
- package/ccw/dist/core/routes/litellm-routes.js.map +1 -1
- package/ccw/dist/core/routes/mcp-routes.d.ts +1 -14
- package/ccw/dist/core/routes/mcp-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/mcp-routes.js +99 -30
- package/ccw/dist/core/routes/mcp-routes.js.map +1 -1
- package/ccw/dist/core/routes/mcp-templates-db.d.ts.map +1 -1
- package/ccw/dist/core/routes/mcp-templates-db.js +30 -31
- package/ccw/dist/core/routes/mcp-templates-db.js.map +1 -1
- package/ccw/dist/core/routes/memory-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/memory-routes.js +74 -24
- package/ccw/dist/core/routes/memory-routes.js.map +1 -1
- package/ccw/dist/core/routes/nav-status-routes.d.ts +3 -0
- package/ccw/dist/core/routes/nav-status-routes.d.ts.map +1 -0
- package/ccw/dist/core/routes/nav-status-routes.js +217 -0
- package/ccw/dist/core/routes/nav-status-routes.js.map +1 -0
- package/ccw/dist/core/routes/rules-routes.d.ts +1 -14
- package/ccw/dist/core/routes/rules-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/rules-routes.js +481 -58
- package/ccw/dist/core/routes/rules-routes.js.map +1 -1
- package/ccw/dist/core/routes/session-routes.d.ts +1 -14
- package/ccw/dist/core/routes/session-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/session-routes.js +15 -3
- package/ccw/dist/core/routes/session-routes.js.map +1 -1
- package/ccw/dist/core/routes/skills-routes.d.ts +1 -14
- package/ccw/dist/core/routes/skills-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/skills-routes.js +394 -112
- package/ccw/dist/core/routes/skills-routes.js.map +1 -1
- package/ccw/dist/core/routes/status-routes.d.ts +1 -14
- package/ccw/dist/core/routes/status-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/status-routes.js +4 -0
- package/ccw/dist/core/routes/status-routes.js.map +1 -1
- package/ccw/dist/core/routes/system-routes.d.ts +4 -10
- package/ccw/dist/core/routes/system-routes.d.ts.map +1 -1
- package/ccw/dist/core/routes/system-routes.js +6 -4
- package/ccw/dist/core/routes/system-routes.js.map +1 -1
- package/ccw/dist/core/routes/types.d.ts +19 -0
- package/ccw/dist/core/routes/types.d.ts.map +1 -0
- package/ccw/dist/core/routes/types.js +2 -0
- package/ccw/dist/core/routes/types.js.map +1 -0
- package/ccw/dist/core/server.d.ts.map +1 -1
- package/ccw/dist/core/server.js +201 -29
- package/ccw/dist/core/server.js.map +1 -1
- package/ccw/dist/core/services/api-key-tester.d.ts +31 -0
- package/ccw/dist/core/services/api-key-tester.d.ts.map +1 -0
- package/ccw/dist/core/services/api-key-tester.js +106 -0
- package/ccw/dist/core/services/api-key-tester.js.map +1 -0
- package/ccw/dist/core/services/health-check-service.d.ts +82 -0
- package/ccw/dist/core/services/health-check-service.d.ts.map +1 -0
- package/ccw/dist/core/services/health-check-service.js +271 -0
- package/ccw/dist/core/services/health-check-service.js.map +1 -0
- package/ccw/dist/core/websocket.d.ts +9 -7
- package/ccw/dist/core/websocket.d.ts.map +1 -1
- package/ccw/dist/core/websocket.js +9 -4
- package/ccw/dist/core/websocket.js.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.d.ts +152 -28
- package/ccw/dist/tools/claude-cli-tools.d.ts.map +1 -1
- package/ccw/dist/tools/claude-cli-tools.js +490 -100
- package/ccw/dist/tools/claude-cli-tools.js.map +1 -1
- package/ccw/dist/tools/cli-config-manager.d.ts +24 -8
- package/ccw/dist/tools/cli-config-manager.d.ts.map +1 -1
- package/ccw/dist/tools/cli-config-manager.js +76 -156
- package/ccw/dist/tools/cli-config-manager.js.map +1 -1
- package/ccw/dist/tools/cli-executor-core.d.ts +85 -0
- package/ccw/dist/tools/cli-executor-core.d.ts.map +1 -0
- package/ccw/dist/tools/cli-executor-core.js +1310 -0
- package/ccw/dist/tools/cli-executor-core.js.map +1 -0
- package/ccw/dist/tools/cli-executor-state.d.ts +241 -0
- package/ccw/dist/tools/cli-executor-state.d.ts.map +1 -0
- package/ccw/dist/tools/cli-executor-state.js +392 -0
- package/ccw/dist/tools/cli-executor-state.js.map +1 -0
- package/ccw/dist/tools/cli-executor-utils.d.ts +36 -0
- package/ccw/dist/tools/cli-executor-utils.d.ts.map +1 -0
- package/ccw/dist/tools/cli-executor-utils.js +298 -0
- package/ccw/dist/tools/cli-executor-utils.js.map +1 -0
- package/ccw/dist/tools/cli-executor.d.ts +3 -377
- package/ccw/dist/tools/cli-executor.d.ts.map +1 -1
- package/ccw/dist/tools/cli-executor.js +3 -1884
- package/ccw/dist/tools/cli-executor.js.map +1 -1
- package/ccw/dist/tools/cli-history-store.d.ts +2 -0
- package/ccw/dist/tools/cli-history-store.d.ts.map +1 -1
- package/ccw/dist/tools/cli-history-store.js.map +1 -1
- package/ccw/dist/tools/cli-output-converter.d.ts +192 -0
- package/ccw/dist/tools/cli-output-converter.d.ts.map +1 -0
- package/ccw/dist/tools/cli-output-converter.js +1047 -0
- package/ccw/dist/tools/cli-output-converter.js.map +1 -0
- package/ccw/dist/tools/cli-prompt-builder.d.ts +113 -0
- package/ccw/dist/tools/cli-prompt-builder.d.ts.map +1 -0
- package/ccw/dist/tools/cli-prompt-builder.js +363 -0
- package/ccw/dist/tools/cli-prompt-builder.js.map +1 -0
- package/ccw/dist/tools/codex-lens.d.ts +15 -1
- package/ccw/dist/tools/codex-lens.d.ts.map +1 -1
- package/ccw/dist/tools/codex-lens.js +289 -55
- package/ccw/dist/tools/codex-lens.js.map +1 -1
- package/ccw/dist/tools/detect-changed-modules.d.ts.map +1 -1
- package/ccw/dist/tools/detect-changed-modules.js +22 -4
- package/ccw/dist/tools/detect-changed-modules.js.map +1 -1
- package/ccw/dist/tools/index.d.ts.map +1 -1
- package/ccw/dist/tools/index.js +2 -0
- package/ccw/dist/tools/index.js.map +1 -1
- package/ccw/dist/tools/litellm-client.d.ts.map +1 -1
- package/ccw/dist/tools/litellm-client.js +10 -4
- package/ccw/dist/tools/litellm-client.js.map +1 -1
- package/ccw/dist/tools/litellm-executor.d.ts +2 -4
- package/ccw/dist/tools/litellm-executor.d.ts.map +1 -1
- package/ccw/dist/tools/litellm-executor.js +39 -8
- package/ccw/dist/tools/litellm-executor.js.map +1 -1
- package/ccw/dist/tools/native-session-discovery.d.ts +2 -0
- package/ccw/dist/tools/native-session-discovery.d.ts.map +1 -1
- package/ccw/dist/tools/native-session-discovery.js +197 -1
- package/ccw/dist/tools/native-session-discovery.js.map +1 -1
- package/ccw/dist/tools/session-manager.d.ts.map +1 -1
- package/ccw/dist/tools/session-manager.js +79 -0
- package/ccw/dist/tools/session-manager.js.map +1 -1
- package/ccw/dist/tools/skill-context-loader.d.ts +15 -0
- package/ccw/dist/tools/skill-context-loader.d.ts.map +1 -0
- package/ccw/dist/tools/skill-context-loader.js +198 -0
- package/ccw/dist/tools/skill-context-loader.js.map +1 -0
- package/ccw/dist/tools/smart-search.d.ts +8 -3
- package/ccw/dist/tools/smart-search.d.ts.map +1 -1
- package/ccw/dist/tools/smart-search.js +378 -75
- package/ccw/dist/tools/smart-search.js.map +1 -1
- package/ccw/dist/types/cli-settings.d.ts +86 -0
- package/ccw/dist/types/cli-settings.d.ts.map +1 -0
- package/ccw/dist/types/cli-settings.js +54 -0
- package/ccw/dist/types/cli-settings.js.map +1 -0
- package/ccw/dist/types/litellm-api-config.d.ts +40 -1
- package/ccw/dist/types/litellm-api-config.d.ts.map +1 -1
- package/ccw/dist/utils/exec-constants.d.ts +25 -0
- package/ccw/dist/utils/exec-constants.d.ts.map +1 -0
- package/ccw/dist/utils/exec-constants.js +25 -0
- package/ccw/dist/utils/exec-constants.js.map +1 -0
- package/ccw/dist/utils/path-resolver.d.ts +1 -0
- package/ccw/dist/utils/path-resolver.d.ts.map +1 -1
- package/ccw/dist/utils/path-resolver.js +48 -3
- package/ccw/dist/utils/path-resolver.js.map +1 -1
- package/ccw/dist/utils/path-validator.d.ts.map +1 -1
- package/ccw/dist/utils/path-validator.js +25 -6
- package/ccw/dist/utils/path-validator.js.map +1 -1
- package/ccw/dist/utils/python-utils.d.ts.map +1 -1
- package/ccw/dist/utils/python-utils.js +27 -7
- package/ccw/dist/utils/python-utils.js.map +1 -1
- package/ccw/dist/utils/shell-escape.d.ts +8 -0
- package/ccw/dist/utils/shell-escape.d.ts.map +1 -0
- package/ccw/dist/utils/shell-escape.js +24 -0
- package/ccw/dist/utils/shell-escape.js.map +1 -0
- package/ccw/dist/utils/uv-manager.d.ts +167 -0
- package/ccw/dist/utils/uv-manager.d.ts.map +1 -0
- package/ccw/dist/utils/uv-manager.js +644 -0
- package/ccw/dist/utils/uv-manager.js.map +1 -0
- package/ccw/src/cli.ts +4 -1
- package/ccw/src/commands/cli.ts +132 -34
- package/ccw/src/commands/issue.ts +605 -91
- package/ccw/src/commands/serve.ts +15 -5
- package/ccw/src/commands/stop.ts +32 -5
- package/ccw/src/commands/tool.ts +17 -2
- package/ccw/src/commands/view.ts +13 -3
- package/ccw/src/config/cli-settings-manager.ts +460 -0
- package/ccw/src/config/litellm-api-config-manager.ts +392 -57
- package/ccw/src/core/auth/csrf-manager.ts +104 -0
- package/ccw/src/core/auth/csrf-middleware.ts +159 -0
- package/ccw/src/core/auth/middleware.ts +94 -0
- package/ccw/src/core/auth/token-manager.ts +219 -0
- package/ccw/src/core/cache-manager.ts +64 -52
- package/ccw/src/core/claude-freshness.ts +26 -6
- package/ccw/src/core/core-memory-store.ts +2 -1
- package/ccw/src/core/cors.ts +10 -0
- package/ccw/src/core/dashboard-generator-patch.ts +47 -48
- package/ccw/src/core/dashboard-generator.ts +797 -744
- package/ccw/src/core/data-aggregator.ts +667 -667
- package/ccw/src/core/lite-scanner.ts +156 -140
- package/ccw/src/core/routes/auth-routes.ts +98 -0
- package/ccw/src/core/routes/ccw-routes.ts +10 -20
- package/ccw/src/core/routes/claude-routes.ts +101 -51
- package/ccw/src/core/routes/cli-routes.ts +152 -55
- package/ccw/src/core/routes/cli-settings-routes.ts +232 -0
- package/ccw/src/core/routes/codexlens/README.md +37 -0
- package/ccw/src/core/routes/codexlens/config-handlers.ts +1269 -0
- package/ccw/src/core/routes/codexlens/index-handlers.ts +354 -0
- package/ccw/src/core/routes/codexlens/semantic-handlers.ts +931 -0
- package/ccw/src/core/routes/codexlens/utils.ts +96 -0
- package/ccw/src/core/routes/codexlens/watcher-handlers.ts +265 -0
- package/ccw/src/core/routes/codexlens-routes.ts +11 -1044
- package/ccw/src/core/routes/discovery-routes.ts +1 -12
- package/ccw/src/core/routes/files-routes.ts +112 -40
- package/ccw/src/core/routes/graph-routes.ts +39 -46
- package/ccw/src/core/routes/help-routes.ts +2 -12
- package/ccw/src/core/routes/hooks-routes.ts +83 -44
- package/ccw/src/core/routes/issue-routes.ts +1 -12
- package/ccw/src/core/routes/litellm-api-routes.ts +566 -60
- package/ccw/src/core/routes/litellm-routes.ts +35 -27
- package/ccw/src/core/routes/mcp-routes.ts +157 -60
- package/ccw/src/core/routes/mcp-routes.ts.backup +549 -550
- package/ccw/src/core/routes/mcp-templates-db.ts +267 -268
- package/ccw/src/core/routes/memory-routes.ts +76 -22
- package/ccw/src/core/routes/nav-status-routes.ts +231 -0
- package/ccw/src/core/routes/rules-routes.ts +600 -81
- package/ccw/src/core/routes/session-routes.ts +28 -22
- package/ccw/src/core/routes/skills-routes.ts +452 -132
- package/ccw/src/core/routes/status-routes.ts +1 -12
- package/ccw/src/core/routes/system-routes.ts +15 -22
- package/ccw/src/core/routes/types.ts +25 -0
- package/ccw/src/core/server.ts +651 -468
- package/ccw/src/core/services/api-key-tester.ts +137 -0
- package/ccw/src/core/services/health-check-service.ts +340 -0
- package/ccw/src/core/websocket.ts +20 -12
- package/ccw/src/templates/dashboard-css/01-base.css +109 -0
- package/ccw/src/templates/dashboard-css/10-cli-status.css +202 -0
- package/ccw/src/templates/dashboard-css/21-cli-toolmgmt.css +308 -0
- package/ccw/src/templates/dashboard-css/30-core-memory.css +20 -0
- package/ccw/src/templates/dashboard-css/31-api-settings.css +751 -14
- package/ccw/src/templates/dashboard-css/33-cli-stream-viewer.css +230 -2
- package/ccw/src/templates/dashboard-js/api.js +5 -0
- package/ccw/src/templates/dashboard-js/components/cli-status.js +279 -107
- package/ccw/src/templates/dashboard-js/components/cli-stream-viewer.js +262 -20
- package/ccw/src/templates/dashboard-js/components/hook-manager.js +105 -5
- package/ccw/src/templates/dashboard-js/components/mcp-manager.js +317 -0
- package/ccw/src/templates/dashboard-js/components/navigation.js +45 -0
- package/ccw/src/templates/dashboard-js/components/notifications.js +128 -0
- package/ccw/src/templates/dashboard-js/i18n.js +4438 -3983
- package/ccw/src/templates/dashboard-js/main.js +71 -0
- package/ccw/src/templates/dashboard-js/services.js +289 -0
- package/ccw/src/templates/dashboard-js/views/api-settings.js +5613 -3361
- package/ccw/src/templates/dashboard-js/views/claude-manager.js +1 -7
- package/ccw/src/templates/dashboard-js/views/cli-manager.js +581 -87
- package/ccw/src/templates/dashboard-js/views/codexlens-manager.js +6091 -1965
- package/ccw/src/templates/dashboard-js/views/core-memory.js +129 -20
- package/ccw/src/templates/dashboard-js/views/hook-manager.js +17 -3
- package/ccw/src/templates/dashboard-js/views/mcp-manager.js +63 -0
- package/ccw/src/templates/dashboard-js/views/project-overview.js +182 -37
- package/ccw/src/templates/dashboard-js/views/rules-manager.js +26 -3
- package/ccw/src/templates/dashboard-js/views/skills-manager.js +2 -42
- package/ccw/src/templates/dashboard.html +6 -0
- package/ccw/src/tools/README.md +29 -0
- package/ccw/src/tools/claude-cli-tools.ts +640 -125
- package/ccw/src/tools/cli-config-manager.ts +102 -172
- package/ccw/src/tools/cli-executor-core.ts +1533 -0
- package/ccw/src/tools/cli-executor-state.ts +560 -0
- package/ccw/src/tools/cli-executor-utils.ts +349 -0
- package/ccw/src/tools/cli-executor.ts +3 -2309
- package/ccw/src/tools/cli-history-store.ts +2 -0
- package/ccw/src/tools/cli-output-converter.ts +1237 -0
- package/ccw/src/tools/cli-prompt-builder.ts +487 -0
- package/ccw/src/tools/codex-lens.ts +324 -59
- package/ccw/src/tools/detect-changed-modules.ts +24 -6
- package/ccw/src/tools/index.ts +2 -0
- package/ccw/src/tools/litellm-client.ts +10 -4
- package/ccw/src/tools/litellm-executor.ts +146 -114
- package/ccw/src/tools/native-session-discovery.ts +209 -1
- package/ccw/src/tools/session-manager.ts +88 -0
- package/ccw/src/tools/skill-context-loader.ts +213 -0
- package/ccw/src/tools/smart-search.ts +427 -76
- package/ccw/src/types/cli-settings.ts +137 -0
- package/ccw/src/types/litellm-api-config.ts +55 -1
- package/ccw/src/utils/exec-constants.ts +24 -0
- package/ccw/src/utils/path-resolver.ts +49 -3
- package/ccw/src/utils/path-validator.ts +28 -6
- package/ccw/src/utils/python-utils.ts +140 -121
- package/ccw/src/utils/shell-escape.ts +30 -0
- package/ccw/src/utils/uv-manager.ts +796 -0
- package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/__pycache__/__init__.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/__init__.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/__pycache__/litellm_llm.cpython-313.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/clients/litellm_embedder.py +270 -251
- package/ccw-litellm/src/ccw_litellm/clients/litellm_llm.py +33 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/__init__.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/loader.cpython-313.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/__pycache__/models.cpython-313.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/config/loader.py +343 -316
- package/ccw-litellm/src/ccw_litellm/config/models.py +162 -130
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/__init__.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/embedder.cpython-312.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-310.pyc +0 -0
- package/ccw-litellm/src/ccw_litellm/interfaces/__pycache__/llm.cpython-312.pyc +0 -0
- package/codex-lens/pyproject.toml +43 -0
- package/codex-lens/src/codexlens/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/__main__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/__main__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/config.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/config.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/config.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/entities.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/entities.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/entities.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/env_config.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/env_config.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/env_config.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/errors.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/__pycache__/errors.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/commands.cpython-312.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-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/embedding_manager.cpython-312.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-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/model_manager.cpython-312.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-310.pyc +0 -0
- package/codex-lens/src/codexlens/cli/__pycache__/output.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/cli/commands.py +4416 -2295
- package/codex-lens/src/codexlens/cli/embedding_manager.py +767 -14
- package/codex-lens/src/codexlens/cli/model_manager.py +676 -0
- package/codex-lens/src/codexlens/config.py +321 -12
- package/codex-lens/src/codexlens/entities.py +4 -1
- package/codex-lens/src/codexlens/env_config.py +298 -0
- package/codex-lens/src/codexlens/indexing/__init__.py +23 -1
- package/codex-lens/src/codexlens/indexing/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/indexing/__pycache__/embedding.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/embedding.py +582 -0
- package/codex-lens/src/codexlens/indexing/symbol_extractor.py +62 -28
- package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/factory.cpython-312.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-310.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/tokenizer.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/__pycache__/treesitter_parser.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/parsers/factory.py +139 -10
- package/codex-lens/src/codexlens/parsers/treesitter_parser.py +487 -13
- package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/binary_searcher.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/chain_search.cpython-312.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__/graph_expander.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/hybrid_search.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/search/__pycache__/ranking.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/search/binary_searcher.py +277 -0
- package/codex-lens/src/codexlens/search/chain_search.py +1642 -8
- package/codex-lens/src/codexlens/search/enrichment.py +21 -0
- package/codex-lens/src/codexlens/search/graph_expander.py +264 -0
- package/codex-lens/src/codexlens/search/hybrid_search.py +772 -37
- package/codex-lens/src/codexlens/search/ranking.py +347 -8
- package/codex-lens/src/codexlens/semantic/SPLADE_IMPLEMENTATION.md +225 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/ann_index.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/base.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/chunker.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/embedder.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/factory.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/gpu_support.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/litellm_embedder.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/splade_encoder.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/__pycache__/vector_store.cpython-312.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 +654 -0
- package/codex-lens/src/codexlens/semantic/factory.py +63 -3
- package/codex-lens/src/codexlens/semantic/gpu_support.py +19 -2
- package/codex-lens/src/codexlens/semantic/litellm_embedder.py +144 -144
- package/codex-lens/src/codexlens/semantic/reranker/__init__.py +25 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/api_reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/base.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/factory.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/fastembed_reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/legacy.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/litellm_reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/__pycache__/onnx_reranker.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/semantic/reranker/api_reranker.py +403 -0
- package/codex-lens/src/codexlens/semantic/reranker/base.py +46 -0
- package/codex-lens/src/codexlens/semantic/reranker/factory.py +159 -0
- package/codex-lens/src/codexlens/semantic/reranker/fastembed_reranker.py +257 -0
- package/codex-lens/src/codexlens/semantic/reranker/legacy.py +91 -0
- package/codex-lens/src/codexlens/semantic/reranker/litellm_reranker.py +214 -0
- package/codex-lens/src/codexlens/semantic/reranker/onnx_reranker.py +268 -0
- package/codex-lens/src/codexlens/semantic/splade_encoder.py +567 -0
- package/codex-lens/src/codexlens/semantic/vector_store.py +472 -352
- package/codex-lens/src/codexlens/storage/__init__.py +3 -0
- package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/dir_index.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/global_index.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/index_tree.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/merkle_tree.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/path_mapper.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/registry.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/splade_index.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_store.cpython-312.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-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/sqlite_utils.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/__pycache__/vector_meta_store.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/dir_index.py +310 -12
- package/codex-lens/src/codexlens/storage/index_tree.py +194 -23
- package/codex-lens/src/codexlens/storage/merkle_tree.py +136 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_006_enhance_relationships.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_007_add_graph_neighbors.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_008_add_merkle_hashes.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_009_add_splade.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/__pycache__/migration_010_add_multi_vector_chunks.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_006_enhance_relationships.py +37 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_007_add_graph_neighbors.py +47 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_008_add_merkle_hashes.py +81 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_009_add_splade.py +103 -0
- package/codex-lens/src/codexlens/storage/migrations/migration_010_add_multi_vector_chunks.py +162 -0
- package/codex-lens/src/codexlens/storage/splade_index.py +578 -0
- package/codex-lens/src/codexlens/storage/sqlite_store.py +508 -184
- package/codex-lens/src/codexlens/storage/vector_meta_store.py +415 -0
- package/codex-lens/src/codexlens/watcher/__init__.py +17 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/__init__.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/events.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/file_watcher.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/incremental_indexer.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-310.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-312.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/__pycache__/manager.cpython-313.pyc +0 -0
- package/codex-lens/src/codexlens/watcher/events.py +82 -0
- package/codex-lens/src/codexlens/watcher/file_watcher.py +347 -0
- package/codex-lens/src/codexlens/watcher/incremental_indexer.py +369 -0
- package/codex-lens/src/codexlens/watcher/manager.py +255 -0
- package/package.json +4 -1
- package/.claude/commands/workflow/docs/analyze.md +0 -1467
- package/.claude/commands/workflow/docs/copyright.md +0 -1265
- package/.claude/skills/command-guide/SKILL.md +0 -388
- package/.claude/skills/command-guide/UPDATE-GUIDELINE.md +0 -592
- package/.claude/skills/command-guide/guides/cli-tools-guide.md +0 -410
- package/.claude/skills/command-guide/guides/examples.md +0 -537
- package/.claude/skills/command-guide/guides/getting-started.md +0 -242
- package/.claude/skills/command-guide/guides/implementation-details.md +0 -1010
- package/.claude/skills/command-guide/guides/index-structure.md +0 -326
- package/.claude/skills/command-guide/guides/troubleshooting.md +0 -92
- package/.claude/skills/command-guide/guides/ui-design-workflow-guide.md +0 -316
- package/.claude/skills/command-guide/guides/workflow-patterns.md +0 -662
- package/.claude/skills/command-guide/reference/agents/action-planning-agent.md +0 -855
- package/.claude/skills/command-guide/reference/agents/cli-execution-agent.md +0 -267
- package/.claude/skills/command-guide/reference/agents/cli-explore-agent.md +0 -182
- package/.claude/skills/command-guide/reference/agents/cli-lite-planning-agent.md +0 -446
- package/.claude/skills/command-guide/reference/agents/cli-planning-agent.md +0 -558
- package/.claude/skills/command-guide/reference/agents/code-developer.md +0 -311
- package/.claude/skills/command-guide/reference/agents/conceptual-planning-agent.md +0 -308
- package/.claude/skills/command-guide/reference/agents/context-search-agent.md +0 -581
- package/.claude/skills/command-guide/reference/agents/doc-generator.md +0 -330
- package/.claude/skills/command-guide/reference/agents/memory-bridge.md +0 -94
- package/.claude/skills/command-guide/reference/agents/test-context-search-agent.md +0 -400
- package/.claude/skills/command-guide/reference/agents/test-fix-agent.md +0 -344
- package/.claude/skills/command-guide/reference/agents/ui-design-agent.md +0 -593
- package/.claude/skills/command-guide/reference/agents/universal-executor.md +0 -131
- package/.claude/skills/command-guide/reference/commands/cli/cli-init.md +0 -440
- package/.claude/skills/command-guide/reference/commands/enhance-prompt.md +0 -93
- package/.claude/skills/command-guide/reference/commands/memory/code-map-memory.md +0 -687
- package/.claude/skills/command-guide/reference/commands/memory/docs-full-cli.md +0 -471
- package/.claude/skills/command-guide/reference/commands/memory/docs-related-cli.md +0 -386
- package/.claude/skills/command-guide/reference/commands/memory/docs.md +0 -616
- package/.claude/skills/command-guide/reference/commands/memory/load-skill-memory.md +0 -182
- package/.claude/skills/command-guide/reference/commands/memory/load.md +0 -240
- package/.claude/skills/command-guide/reference/commands/memory/skill-memory.md +0 -525
- package/.claude/skills/command-guide/reference/commands/memory/style-skill-memory.md +0 -396
- package/.claude/skills/command-guide/reference/commands/memory/tech-research.md +0 -314
- package/.claude/skills/command-guide/reference/commands/memory/update-full.md +0 -332
- package/.claude/skills/command-guide/reference/commands/memory/update-related.md +0 -332
- package/.claude/skills/command-guide/reference/commands/memory/workflow-skill-memory.md +0 -517
- package/.claude/skills/command-guide/reference/commands/task/breakdown.md +0 -204
- package/.claude/skills/command-guide/reference/commands/task/create.md +0 -152
- package/.claude/skills/command-guide/reference/commands/task/execute.md +0 -270
- package/.claude/skills/command-guide/reference/commands/task/replan.md +0 -437
- package/.claude/skills/command-guide/reference/commands/version.md +0 -254
- package/.claude/skills/command-guide/reference/commands/workflow/action-plan-verify.md +0 -447
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/api-designer.md +0 -585
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/artifacts.md +0 -452
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/auto-parallel.md +0 -443
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/data-architect.md +0 -220
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-manager.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/product-owner.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/scrum-master.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/subject-matter-expert.md +0 -200
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/synthesis.md +0 -398
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/system-architect.md +0 -387
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ui-designer.md +0 -221
- package/.claude/skills/command-guide/reference/commands/workflow/brainstorm/ux-expert.md +0 -221
- package/.claude/skills/command-guide/reference/commands/workflow/execute.md +0 -465
- package/.claude/skills/command-guide/reference/commands/workflow/init.md +0 -164
- package/.claude/skills/command-guide/reference/commands/workflow/lite-execute.md +0 -748
- package/.claude/skills/command-guide/reference/commands/workflow/lite-fix.md +0 -664
- package/.claude/skills/command-guide/reference/commands/workflow/lite-plan.md +0 -645
- package/.claude/skills/command-guide/reference/commands/workflow/plan.md +0 -551
- package/.claude/skills/command-guide/reference/commands/workflow/replan.md +0 -515
- package/.claude/skills/command-guide/reference/commands/workflow/review-fix.md +0 -606
- package/.claude/skills/command-guide/reference/commands/workflow/review-module-cycle.md +0 -765
- package/.claude/skills/command-guide/reference/commands/workflow/review-session-cycle.md +0 -776
- package/.claude/skills/command-guide/reference/commands/workflow/review.md +0 -298
- package/.claude/skills/command-guide/reference/commands/workflow/session/complete.md +0 -547
- package/.claude/skills/command-guide/reference/commands/workflow/session/list.md +0 -114
- package/.claude/skills/command-guide/reference/commands/workflow/session/resume.md +0 -77
- package/.claude/skills/command-guide/reference/commands/workflow/session/start.md +0 -257
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-plan.md +0 -460
- package/.claude/skills/command-guide/reference/commands/workflow/tdd-verify.md +0 -400
- package/.claude/skills/command-guide/reference/commands/workflow/test-cycle-execute.md +0 -498
- package/.claude/skills/command-guide/reference/commands/workflow/test-fix-gen.md +0 -699
- package/.claude/skills/command-guide/reference/commands/workflow/test-gen.md +0 -529
- package/.claude/skills/command-guide/reference/commands/workflow/tools/conflict-resolution.md +0 -766
- package/.claude/skills/command-guide/reference/commands/workflow/tools/context-gather.md +0 -433
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-agent.md +0 -487
- package/.claude/skills/command-guide/reference/commands/workflow/tools/task-generate-tdd.md +0 -518
- package/.claude/skills/command-guide/reference/commands/workflow/tools/tdd-coverage-analysis.md +0 -309
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-concept-enhanced.md +0 -163
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-context-gather.md +0 -232
- package/.claude/skills/command-guide/reference/commands/workflow/tools/test-task-generate.md +0 -254
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/animation-extract.md +0 -1150
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/codify-style.md +0 -652
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/design-sync.md +0 -454
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/explore-auto.md +0 -678
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/generate.md +0 -504
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/imitate-auto.md +0 -745
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/import-from-code.md +0 -537
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/layout-extract.md +0 -788
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/reference-page-generator.md +0 -356
- package/.claude/skills/command-guide/reference/commands/workflow/ui-design/style-extract.md +0 -773
- package/.claude/skills/command-guide/scripts/analyze_commands.py +0 -502
- package/.claude/skills/command-guide/scripts/update-index.sh +0 -130
- package/.claude/skills/command-guide/templates/issue-bug.md +0 -104
- package/.claude/skills/command-guide/templates/issue-diagnosis.md +0 -275
- package/.claude/skills/command-guide/templates/issue-feature.md +0 -97
- package/.claude/skills/command-guide/templates/issue-question.md +0 -141
|
@@ -1,7 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rules Routes Module
|
|
3
|
+
* Handles all Rules-related API endpoints
|
|
4
|
+
*/
|
|
1
5
|
import { readFileSync, existsSync, readdirSync, unlinkSync, promises as fsPromises } from 'fs';
|
|
2
6
|
import { join } from 'path';
|
|
3
7
|
import { homedir } from 'os';
|
|
4
8
|
import { executeCliTool } from '../../tools/cli-executor.js';
|
|
9
|
+
import { SmartContentFormatter } from '../../tools/cli-output-converter.js';
|
|
5
10
|
/**
|
|
6
11
|
* Parse rule frontmatter
|
|
7
12
|
* @param {string} content
|
|
@@ -148,18 +153,26 @@ function getRuleDetail(ruleName, location, projectPath) {
|
|
|
148
153
|
}
|
|
149
154
|
const content = readFileSync(rulePath, 'utf8');
|
|
150
155
|
const parsed = parseRuleFrontmatter(content);
|
|
156
|
+
const normalizedBaseDir = baseDir.replace(/\\/g, '/').replace(/\/+$/, '');
|
|
157
|
+
const normalizedRulePath = rulePath.replace(/\\/g, '/');
|
|
158
|
+
const relativePath = normalizedRulePath.startsWith(`${normalizedBaseDir}/`)
|
|
159
|
+
? normalizedRulePath.slice(normalizedBaseDir.length + 1)
|
|
160
|
+
: ruleName;
|
|
161
|
+
const relativeParts = relativePath.split('/');
|
|
162
|
+
const subdirectory = relativeParts.length > 1 ? relativeParts.slice(0, -1).join('/') : null;
|
|
151
163
|
return {
|
|
152
164
|
rule: {
|
|
153
165
|
name: ruleName,
|
|
154
166
|
paths: parsed.paths,
|
|
155
167
|
content: parsed.content,
|
|
156
168
|
location,
|
|
157
|
-
path: rulePath
|
|
169
|
+
path: rulePath,
|
|
170
|
+
subdirectory
|
|
158
171
|
}
|
|
159
172
|
};
|
|
160
173
|
}
|
|
161
174
|
catch (error) {
|
|
162
|
-
return { error: error.message };
|
|
175
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
163
176
|
}
|
|
164
177
|
}
|
|
165
178
|
/**
|
|
@@ -182,8 +195,277 @@ function deleteRule(ruleName, location, projectPath) {
|
|
|
182
195
|
return { success: true, ruleName, location };
|
|
183
196
|
}
|
|
184
197
|
catch (error) {
|
|
185
|
-
return { error: error.message };
|
|
198
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Infer rule context from file name and subdirectory for better prompt generation
|
|
203
|
+
* @param {string} fileName - Rule file name
|
|
204
|
+
* @param {string} subdirectory - Optional subdirectory path
|
|
205
|
+
* @param {string} location - 'project' or 'user'
|
|
206
|
+
* @returns {Object} Inferred context
|
|
207
|
+
*/
|
|
208
|
+
function inferRuleContext(fileName, subdirectory, location) {
|
|
209
|
+
const normalizedName = fileName.replace(/\.md$/i, '').toLowerCase();
|
|
210
|
+
const normalizedSubdir = (subdirectory || '').toLowerCase();
|
|
211
|
+
// Rule category inference from file name and subdirectory
|
|
212
|
+
const categories = {
|
|
213
|
+
coding: ['coding', 'code', 'style', 'format', 'lint', 'convention'],
|
|
214
|
+
testing: ['test', 'spec', 'jest', 'vitest', 'mocha', 'coverage'],
|
|
215
|
+
security: ['security', 'auth', 'permission', 'access', 'secret', 'credential'],
|
|
216
|
+
architecture: ['arch', 'design', 'pattern', 'structure', 'module', 'layer'],
|
|
217
|
+
documentation: ['doc', 'comment', 'readme', 'jsdoc', 'api-doc'],
|
|
218
|
+
performance: ['perf', 'performance', 'optimize', 'cache', 'memory'],
|
|
219
|
+
workflow: ['workflow', 'ci', 'cd', 'deploy', 'build', 'release'],
|
|
220
|
+
tooling: ['tool', 'cli', 'script', 'npm', 'yarn', 'pnpm'],
|
|
221
|
+
error: ['error', 'exception', 'handling', 'logging', 'debug']
|
|
222
|
+
};
|
|
223
|
+
let inferredCategory = 'general';
|
|
224
|
+
let inferredKeywords = [];
|
|
225
|
+
for (const [category, keywords] of Object.entries(categories)) {
|
|
226
|
+
for (const keyword of keywords) {
|
|
227
|
+
if (normalizedName.includes(keyword) || normalizedSubdir.includes(keyword)) {
|
|
228
|
+
inferredCategory = category;
|
|
229
|
+
inferredKeywords = keywords;
|
|
230
|
+
break;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
if (inferredCategory !== 'general')
|
|
234
|
+
break;
|
|
186
235
|
}
|
|
236
|
+
// Scope inference from location
|
|
237
|
+
const scopeHint = location === 'project'
|
|
238
|
+
? 'This rule applies to the current project only'
|
|
239
|
+
: 'This rule applies globally to all projects';
|
|
240
|
+
// Technology hints from file name
|
|
241
|
+
const techPatterns = {
|
|
242
|
+
typescript: ['ts', 'typescript', 'tsc'],
|
|
243
|
+
javascript: ['js', 'javascript', 'node'],
|
|
244
|
+
react: ['react', 'jsx', 'tsx', 'component'],
|
|
245
|
+
vue: ['vue', 'vuex', 'pinia'],
|
|
246
|
+
python: ['python', 'py', 'pip', 'poetry'],
|
|
247
|
+
rust: ['rust', 'cargo', 'rs'],
|
|
248
|
+
go: ['go', 'golang', 'mod'],
|
|
249
|
+
java: ['java', 'maven', 'gradle', 'spring']
|
|
250
|
+
};
|
|
251
|
+
let inferredTech = null;
|
|
252
|
+
for (const [tech, patterns] of Object.entries(techPatterns)) {
|
|
253
|
+
if (patterns.some(p => normalizedName.includes(p) || normalizedSubdir.includes(p))) {
|
|
254
|
+
inferredTech = tech;
|
|
255
|
+
break;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
category: inferredCategory,
|
|
260
|
+
keywords: inferredKeywords,
|
|
261
|
+
scopeHint,
|
|
262
|
+
technology: inferredTech,
|
|
263
|
+
isConditional: normalizedSubdir.length > 0
|
|
264
|
+
};
|
|
265
|
+
}
|
|
266
|
+
/**
|
|
267
|
+
* Build structured prompt for rule generation
|
|
268
|
+
* @param {Object} params
|
|
269
|
+
* @returns {string} Structured prompt
|
|
270
|
+
*/
|
|
271
|
+
function buildStructuredRulePrompt(params) {
|
|
272
|
+
const { description, fileName, subdirectory, location, context, enableReview } = params;
|
|
273
|
+
// Build category-specific guidance
|
|
274
|
+
const categoryGuidance = {
|
|
275
|
+
coding: 'Focus on code style, naming conventions, and formatting rules. Include specific examples of correct and incorrect patterns.',
|
|
276
|
+
testing: 'Emphasize test structure, coverage expectations, mocking strategies, and assertion patterns.',
|
|
277
|
+
security: 'Highlight security best practices, input validation, authentication requirements, and sensitive data handling.',
|
|
278
|
+
architecture: 'Define module boundaries, dependency rules, layer responsibilities, and design pattern usage.',
|
|
279
|
+
documentation: 'Specify documentation requirements, comment styles, and API documentation standards.',
|
|
280
|
+
performance: 'Address caching strategies, optimization guidelines, resource management, and performance metrics.',
|
|
281
|
+
workflow: 'Define CI/CD requirements, deployment procedures, and release management rules.',
|
|
282
|
+
tooling: 'Specify tool configurations, script conventions, and dependency management rules.',
|
|
283
|
+
error: 'Define error handling patterns, logging requirements, and exception management.',
|
|
284
|
+
general: 'Provide clear, actionable guidelines that Claude can follow consistently.'
|
|
285
|
+
};
|
|
286
|
+
const guidance = categoryGuidance[context.category] || categoryGuidance.general;
|
|
287
|
+
// Build technology-specific hint
|
|
288
|
+
const techHint = context.technology
|
|
289
|
+
? `\nTECHNOLOGY CONTEXT: This rule is for ${context.technology} development. Use ${context.technology}-specific best practices and terminology.`
|
|
290
|
+
: '';
|
|
291
|
+
// Build subdirectory context
|
|
292
|
+
const subdirHint = subdirectory
|
|
293
|
+
? `\nORGANIZATION: This rule will be placed in the "${subdirectory}" subdirectory, indicating its category/scope.`
|
|
294
|
+
: '';
|
|
295
|
+
// Build review instruction if enabled
|
|
296
|
+
const reviewInstruction = enableReview
|
|
297
|
+
? `\n\nAFTER GENERATION:
|
|
298
|
+
- Verify the rule is specific and actionable
|
|
299
|
+
- Check for ambiguous language that could be misinterpreted
|
|
300
|
+
- Ensure examples are clear and relevant
|
|
301
|
+
- Validate markdown formatting is correct`
|
|
302
|
+
: '';
|
|
303
|
+
return `PURPOSE: Generate a high-quality Claude Code memory rule that will guide Claude's behavior when working in this codebase
|
|
304
|
+
SUCCESS CRITERIA: The rule must be (1) specific and actionable, (2) include concrete examples, (3) avoid ambiguous language, (4) follow Claude Code rule format
|
|
305
|
+
|
|
306
|
+
TASK:
|
|
307
|
+
• Parse the user's description to identify core requirements
|
|
308
|
+
• Infer additional context from file name "${fileName}" and category "${context.category}"
|
|
309
|
+
• Generate structured markdown content with clear instructions
|
|
310
|
+
• Include DO and DON'T examples where appropriate
|
|
311
|
+
• ${context.isConditional ? 'Consider if frontmatter paths are needed for conditional activation' : 'Create as a global rule'}
|
|
312
|
+
|
|
313
|
+
MODE: write
|
|
314
|
+
|
|
315
|
+
RULE CATEGORY: ${context.category}
|
|
316
|
+
CATEGORY GUIDANCE: ${guidance}
|
|
317
|
+
${techHint}
|
|
318
|
+
${subdirHint}
|
|
319
|
+
SCOPE: ${context.scopeHint}
|
|
320
|
+
|
|
321
|
+
EXPECTED OUTPUT FORMAT:
|
|
322
|
+
\`\`\`markdown
|
|
323
|
+
${context.isConditional ? `---
|
|
324
|
+
paths: [specific/path/patterns/**/*]
|
|
325
|
+
---
|
|
326
|
+
|
|
327
|
+
` : ''}# Rule Title
|
|
328
|
+
|
|
329
|
+
Brief description of what this rule enforces.
|
|
330
|
+
|
|
331
|
+
## Guidelines
|
|
332
|
+
|
|
333
|
+
1. **First guideline** - Explanation
|
|
334
|
+
2. **Second guideline** - Explanation
|
|
335
|
+
|
|
336
|
+
## Examples
|
|
337
|
+
|
|
338
|
+
### ✅ Correct
|
|
339
|
+
\`\`\`language
|
|
340
|
+
// Good example
|
|
341
|
+
\`\`\`
|
|
342
|
+
|
|
343
|
+
### ❌ Incorrect
|
|
344
|
+
\`\`\`language
|
|
345
|
+
// Bad example
|
|
346
|
+
\`\`\`
|
|
347
|
+
|
|
348
|
+
## Exceptions
|
|
349
|
+
|
|
350
|
+
- When this rule may not apply
|
|
351
|
+
\`\`\`
|
|
352
|
+
|
|
353
|
+
USER DESCRIPTION:
|
|
354
|
+
${description}
|
|
355
|
+
|
|
356
|
+
FILE NAME: ${fileName}
|
|
357
|
+
${subdirectory ? `SUBDIRECTORY: ${subdirectory}` : ''}
|
|
358
|
+
${reviewInstruction}
|
|
359
|
+
|
|
360
|
+
RULES: $(cat ~/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt) | Generate ONLY the rule content in markdown | No additional commentary | Do NOT use any tools | Output raw markdown text directly | write=CREATE`;
|
|
361
|
+
}
|
|
362
|
+
/**
|
|
363
|
+
* Build structured prompt for code extraction
|
|
364
|
+
* @param {Object} params
|
|
365
|
+
* @returns {string} Structured prompt
|
|
366
|
+
*/
|
|
367
|
+
function buildExtractPrompt(params) {
|
|
368
|
+
const { extractScope, extractFocus, fileName, subdirectory, context } = params;
|
|
369
|
+
const scope = extractScope || '**/*';
|
|
370
|
+
const focus = extractFocus || 'naming conventions, error handling, code structure, patterns';
|
|
371
|
+
return `PURPOSE: Extract and document coding conventions from the existing codebase to create a Claude Code memory rule
|
|
372
|
+
SUCCESS CRITERIA: The rule must reflect ACTUAL patterns found in the code, not theoretical best practices
|
|
373
|
+
|
|
374
|
+
TASK:
|
|
375
|
+
• Scan files matching "${scope}" for recurring patterns
|
|
376
|
+
• Identify ${focus.split(',').length} or more distinct conventions
|
|
377
|
+
• Document each pattern with real code examples from the codebase
|
|
378
|
+
• Create actionable rules based on observed practices
|
|
379
|
+
• Note any inconsistencies found (optional section)
|
|
380
|
+
|
|
381
|
+
MODE: analysis
|
|
382
|
+
|
|
383
|
+
ANALYSIS SCOPE: @${scope}
|
|
384
|
+
FOCUS AREAS: ${focus}
|
|
385
|
+
|
|
386
|
+
EXTRACTION STRATEGY:
|
|
387
|
+
1. **Pattern Recognition**: Look for repeated code structures, naming patterns, file organization
|
|
388
|
+
2. **Consistency Check**: Identify which patterns are consistently followed vs. occasionally violated
|
|
389
|
+
3. **Frequency Analysis**: Prioritize patterns that appear most frequently
|
|
390
|
+
4. **Context Awareness**: Consider why certain patterns are used (performance, readability, etc.)
|
|
391
|
+
|
|
392
|
+
EXPECTED OUTPUT FORMAT:
|
|
393
|
+
\`\`\`markdown
|
|
394
|
+
# ${fileName.replace(/\.md$/i, '')} Conventions
|
|
395
|
+
|
|
396
|
+
Conventions extracted from codebase analysis of \`${scope}\`.
|
|
397
|
+
|
|
398
|
+
## Naming Conventions
|
|
399
|
+
|
|
400
|
+
- **Pattern name**: Description with example
|
|
401
|
+
\`\`\`language
|
|
402
|
+
// Actual code from codebase
|
|
403
|
+
\`\`\`
|
|
404
|
+
|
|
405
|
+
## Code Structure
|
|
406
|
+
|
|
407
|
+
- **Pattern name**: Description with example
|
|
408
|
+
|
|
409
|
+
## Error Handling
|
|
410
|
+
|
|
411
|
+
- **Pattern name**: Description with example
|
|
412
|
+
|
|
413
|
+
## Notes
|
|
414
|
+
|
|
415
|
+
- Any inconsistencies or variations observed
|
|
416
|
+
\`\`\`
|
|
417
|
+
|
|
418
|
+
FILE NAME: ${fileName}
|
|
419
|
+
${subdirectory ? `SUBDIRECTORY: ${subdirectory}` : ''}
|
|
420
|
+
INFERRED CATEGORY: ${context.category}
|
|
421
|
+
|
|
422
|
+
RULES: $(cat ~/.claude/workflows/cli-templates/prompts/analysis/02-analyze-code-patterns.txt) | Extract REAL patterns from code | Include actual code snippets as examples | Do NOT use any tools | Output raw markdown text directly | analysis=READ-ONLY`;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Build review prompt for validating and improving generated rules
|
|
426
|
+
* @param {string} content - Generated rule content to review
|
|
427
|
+
* @param {string} fileName - Target file name
|
|
428
|
+
* @param {Object} context - Inferred context
|
|
429
|
+
* @returns {string} Review prompt
|
|
430
|
+
*/
|
|
431
|
+
function buildReviewPrompt(content, fileName, context) {
|
|
432
|
+
return `PURPOSE: Review and improve a Claude Code memory rule for quality, clarity, and actionability
|
|
433
|
+
SUCCESS CRITERIA: Output an improved version that is (1) more specific, (2) includes better examples, (3) has no ambiguous language
|
|
434
|
+
|
|
435
|
+
TASK:
|
|
436
|
+
• Analyze the rule for clarity and specificity
|
|
437
|
+
• Check if guidelines are actionable (Claude can follow them)
|
|
438
|
+
• Verify examples are concrete and helpful
|
|
439
|
+
• Remove any ambiguous or vague language
|
|
440
|
+
• Ensure markdown formatting is correct
|
|
441
|
+
• Improve structure if needed
|
|
442
|
+
• Keep the core intent and requirements intact
|
|
443
|
+
|
|
444
|
+
MODE: write
|
|
445
|
+
|
|
446
|
+
REVIEW CRITERIA:
|
|
447
|
+
1. **Specificity**: Each guideline should be specific enough to follow without interpretation
|
|
448
|
+
2. **Actionability**: Guidelines should tell Claude exactly what to do or not do
|
|
449
|
+
3. **Examples**: Good and bad examples should be clearly different and illustrative
|
|
450
|
+
4. **Consistency**: Formatting and style should be consistent throughout
|
|
451
|
+
5. **Completeness**: All necessary aspects of the rule should be covered
|
|
452
|
+
6. **Conciseness**: No unnecessary verbosity or repetition
|
|
453
|
+
|
|
454
|
+
RULE CATEGORY: ${context.category}
|
|
455
|
+
FILE NAME: ${fileName}
|
|
456
|
+
|
|
457
|
+
ORIGINAL RULE CONTENT:
|
|
458
|
+
\`\`\`markdown
|
|
459
|
+
${content}
|
|
460
|
+
\`\`\`
|
|
461
|
+
|
|
462
|
+
EXPECTED OUTPUT:
|
|
463
|
+
- Output ONLY the improved rule content in markdown format
|
|
464
|
+
- Do NOT include any commentary, explanation, or meta-text
|
|
465
|
+
- If the original is already high quality, return it unchanged
|
|
466
|
+
- Preserve any frontmatter (---paths---) if present
|
|
467
|
+
|
|
468
|
+
RULES: $(cat ~/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt) | Output ONLY improved markdown content | No additional text | Do NOT use any tools | Output raw markdown text directly | write=CREATE`;
|
|
187
469
|
}
|
|
188
470
|
/**
|
|
189
471
|
* Generate rule content via CLI tool
|
|
@@ -197,27 +479,30 @@ function deleteRule(ruleName, location, projectPath) {
|
|
|
197
479
|
* @param {string} params.location - 'project' or 'user'
|
|
198
480
|
* @param {string} params.subdirectory - Optional subdirectory
|
|
199
481
|
* @param {string} params.projectPath - Project root path
|
|
482
|
+
* @param {boolean} params.enableReview - Optional: enable secondary review
|
|
200
483
|
* @returns {Object}
|
|
201
484
|
*/
|
|
202
485
|
async function generateRuleViaCLI(params) {
|
|
486
|
+
// Generate unique execution ID for tracking
|
|
487
|
+
const executionId = `rule-gen-${params.fileName.replace('.md', '')}-${Date.now()}`;
|
|
203
488
|
try {
|
|
204
|
-
const { generationType, description, templateType, extractScope, extractFocus, fileName, location, subdirectory, projectPath } = params;
|
|
489
|
+
const { generationType, description, templateType, extractScope, extractFocus, fileName, location, subdirectory, projectPath, enableReview, broadcastToClients } = params;
|
|
205
490
|
let prompt = '';
|
|
206
491
|
let mode = 'analysis';
|
|
207
492
|
let workingDir = projectPath;
|
|
493
|
+
// Infer context from file name and subdirectory
|
|
494
|
+
const context = inferRuleContext(fileName, subdirectory || '', location);
|
|
208
495
|
// Build prompt based on generation type
|
|
209
496
|
if (generationType === 'description') {
|
|
210
497
|
mode = 'write';
|
|
211
|
-
prompt =
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
FILE NAME: ${fileName}`;
|
|
498
|
+
prompt = buildStructuredRulePrompt({
|
|
499
|
+
description: description || '',
|
|
500
|
+
fileName,
|
|
501
|
+
subdirectory: subdirectory || '',
|
|
502
|
+
location,
|
|
503
|
+
context,
|
|
504
|
+
enableReview
|
|
505
|
+
});
|
|
221
506
|
}
|
|
222
507
|
else if (generationType === 'template') {
|
|
223
508
|
mode = 'write';
|
|
@@ -225,43 +510,91 @@ FILE NAME: ${fileName}`;
|
|
|
225
510
|
TASK: • Create rule based on ${templateType} template • Generate structured markdown content
|
|
226
511
|
MODE: write
|
|
227
512
|
EXPECTED: Complete rule content in markdown format following template structure
|
|
228
|
-
RULES: $(cat ~/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt) | Follow Claude Code rule format | Use ${templateType} template patterns | write=CREATE
|
|
513
|
+
RULES: $(cat ~/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt) | Follow Claude Code rule format | Use ${templateType} template patterns | Do NOT use any tools | Output raw markdown text directly | write=CREATE
|
|
229
514
|
|
|
230
515
|
TEMPLATE TYPE: ${templateType}
|
|
231
516
|
FILE NAME: ${fileName}`;
|
|
232
517
|
}
|
|
233
518
|
else if (generationType === 'extract') {
|
|
234
519
|
mode = 'analysis';
|
|
235
|
-
prompt =
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
ANALYSIS SCOPE: ${extractScope || '**/*'}
|
|
243
|
-
FOCUS AREAS: ${extractFocus || 'naming conventions, error handling, code structure'}`;
|
|
520
|
+
prompt = buildExtractPrompt({
|
|
521
|
+
extractScope: extractScope || '',
|
|
522
|
+
extractFocus: extractFocus || '',
|
|
523
|
+
fileName,
|
|
524
|
+
subdirectory: subdirectory || '',
|
|
525
|
+
context
|
|
526
|
+
});
|
|
244
527
|
}
|
|
245
528
|
else {
|
|
246
529
|
return { error: `Unknown generation type: ${generationType}` };
|
|
247
530
|
}
|
|
531
|
+
// Broadcast CLI_EXECUTION_STARTED event
|
|
532
|
+
if (broadcastToClients) {
|
|
533
|
+
broadcastToClients({
|
|
534
|
+
type: 'CLI_EXECUTION_STARTED',
|
|
535
|
+
payload: {
|
|
536
|
+
executionId,
|
|
537
|
+
tool: 'claude',
|
|
538
|
+
mode,
|
|
539
|
+
category: 'internal',
|
|
540
|
+
context: 'rule-generation',
|
|
541
|
+
fileName
|
|
542
|
+
}
|
|
543
|
+
});
|
|
544
|
+
}
|
|
545
|
+
// Create onOutput callback for real-time streaming
|
|
546
|
+
const onOutput = broadcastToClients
|
|
547
|
+
? (unit) => {
|
|
548
|
+
// CliOutputUnit handler: use SmartContentFormatter for intelligent formatting (never returns null)
|
|
549
|
+
const content = SmartContentFormatter.format(unit.content, unit.type);
|
|
550
|
+
broadcastToClients({
|
|
551
|
+
type: 'CLI_OUTPUT',
|
|
552
|
+
payload: {
|
|
553
|
+
executionId,
|
|
554
|
+
chunkType: unit.type,
|
|
555
|
+
data: content
|
|
556
|
+
}
|
|
557
|
+
});
|
|
558
|
+
}
|
|
559
|
+
: undefined;
|
|
248
560
|
// Execute CLI tool (Claude) with at least 10 minutes timeout
|
|
561
|
+
const startTime = Date.now();
|
|
249
562
|
const result = await executeCliTool({
|
|
250
563
|
tool: 'claude',
|
|
251
564
|
prompt,
|
|
252
565
|
mode,
|
|
253
566
|
cd: workingDir,
|
|
254
567
|
timeout: 600000, // 10 minutes
|
|
255
|
-
category: 'internal'
|
|
256
|
-
|
|
568
|
+
category: 'internal',
|
|
569
|
+
id: executionId
|
|
570
|
+
}, onOutput);
|
|
571
|
+
// Broadcast CLI_EXECUTION_COMPLETED event
|
|
572
|
+
if (broadcastToClients) {
|
|
573
|
+
broadcastToClients({
|
|
574
|
+
type: 'CLI_EXECUTION_COMPLETED',
|
|
575
|
+
payload: {
|
|
576
|
+
executionId,
|
|
577
|
+
success: result.success,
|
|
578
|
+
status: result.execution?.status || (result.success ? 'success' : 'error'),
|
|
579
|
+
duration_ms: Date.now() - startTime
|
|
580
|
+
}
|
|
581
|
+
});
|
|
582
|
+
}
|
|
257
583
|
if (!result.success) {
|
|
258
584
|
return {
|
|
259
585
|
error: `CLI execution failed: ${result.stderr || 'Unknown error'}`,
|
|
260
586
|
stderr: result.stderr
|
|
261
587
|
};
|
|
262
588
|
}
|
|
263
|
-
// Extract generated content from
|
|
264
|
-
|
|
589
|
+
// Extract generated content - prefer parsedOutput (extracted text from stream JSON)
|
|
590
|
+
let generatedContent = (result.parsedOutput || result.stdout || '').trim();
|
|
591
|
+
// Remove markdown code block wrapper if present (e.g., ```markdown...```)
|
|
592
|
+
if (generatedContent.startsWith('```markdown')) {
|
|
593
|
+
generatedContent = generatedContent.replace(/^```markdown\s*\n?/, '').replace(/\n?```\s*$/, '');
|
|
594
|
+
}
|
|
595
|
+
else if (generatedContent.startsWith('```')) {
|
|
596
|
+
generatedContent = generatedContent.replace(/^```\w*\s*\n?/, '').replace(/\n?```\s*$/, '');
|
|
597
|
+
}
|
|
265
598
|
if (!generatedContent) {
|
|
266
599
|
return {
|
|
267
600
|
error: 'CLI execution returned empty content',
|
|
@@ -269,6 +602,82 @@ FOCUS AREAS: ${extractFocus || 'naming conventions, error handling, code structu
|
|
|
269
602
|
stderr: result.stderr
|
|
270
603
|
};
|
|
271
604
|
}
|
|
605
|
+
// Optional review step - verify and improve the generated rule
|
|
606
|
+
let reviewResult = null;
|
|
607
|
+
if (enableReview) {
|
|
608
|
+
const reviewPrompt = buildReviewPrompt(generatedContent, fileName, context);
|
|
609
|
+
const reviewExecutionId = `${executionId}-review`;
|
|
610
|
+
// Broadcast review CLI_EXECUTION_STARTED event
|
|
611
|
+
if (broadcastToClients) {
|
|
612
|
+
broadcastToClients({
|
|
613
|
+
type: 'CLI_EXECUTION_STARTED',
|
|
614
|
+
payload: {
|
|
615
|
+
executionId: reviewExecutionId,
|
|
616
|
+
tool: 'claude',
|
|
617
|
+
mode: 'write',
|
|
618
|
+
category: 'internal',
|
|
619
|
+
context: 'rule-review',
|
|
620
|
+
fileName
|
|
621
|
+
}
|
|
622
|
+
});
|
|
623
|
+
}
|
|
624
|
+
// Create onOutput callback for review step
|
|
625
|
+
const reviewOnOutput = broadcastToClients
|
|
626
|
+
? (unit) => {
|
|
627
|
+
// CliOutputUnit handler: use SmartContentFormatter for intelligent formatting (never returns null)
|
|
628
|
+
const content = SmartContentFormatter.format(unit.content, unit.type);
|
|
629
|
+
broadcastToClients({
|
|
630
|
+
type: 'CLI_OUTPUT',
|
|
631
|
+
payload: {
|
|
632
|
+
executionId: reviewExecutionId,
|
|
633
|
+
chunkType: unit.type,
|
|
634
|
+
data: content
|
|
635
|
+
}
|
|
636
|
+
});
|
|
637
|
+
}
|
|
638
|
+
: undefined;
|
|
639
|
+
const reviewStartTime = Date.now();
|
|
640
|
+
const reviewExecution = await executeCliTool({
|
|
641
|
+
tool: 'claude',
|
|
642
|
+
prompt: reviewPrompt,
|
|
643
|
+
mode: 'write',
|
|
644
|
+
cd: workingDir,
|
|
645
|
+
timeout: 300000, // 5 minutes for review
|
|
646
|
+
category: 'internal',
|
|
647
|
+
id: reviewExecutionId
|
|
648
|
+
}, reviewOnOutput);
|
|
649
|
+
// Broadcast review CLI_EXECUTION_COMPLETED event
|
|
650
|
+
if (broadcastToClients) {
|
|
651
|
+
broadcastToClients({
|
|
652
|
+
type: 'CLI_EXECUTION_COMPLETED',
|
|
653
|
+
payload: {
|
|
654
|
+
executionId: reviewExecutionId,
|
|
655
|
+
success: reviewExecution.success,
|
|
656
|
+
status: reviewExecution.execution?.status || (reviewExecution.success ? 'success' : 'error'),
|
|
657
|
+
duration_ms: Date.now() - reviewStartTime
|
|
658
|
+
}
|
|
659
|
+
});
|
|
660
|
+
}
|
|
661
|
+
if (reviewExecution.success) {
|
|
662
|
+
let reviewedContent = (reviewExecution.parsedOutput || reviewExecution.stdout || '').trim();
|
|
663
|
+
// Remove markdown code block wrapper if present
|
|
664
|
+
if (reviewedContent.startsWith('```markdown')) {
|
|
665
|
+
reviewedContent = reviewedContent.replace(/^```markdown\s*\n?/, '').replace(/\n?```\s*$/, '');
|
|
666
|
+
}
|
|
667
|
+
else if (reviewedContent.startsWith('```')) {
|
|
668
|
+
reviewedContent = reviewedContent.replace(/^```\w*\s*\n?/, '').replace(/\n?```\s*$/, '');
|
|
669
|
+
}
|
|
670
|
+
// Only use reviewed content if it's valid and different
|
|
671
|
+
if (reviewedContent.length > 50 && reviewedContent !== generatedContent) {
|
|
672
|
+
generatedContent = reviewedContent;
|
|
673
|
+
reviewResult = {
|
|
674
|
+
reviewed: true,
|
|
675
|
+
originalLength: (result.parsedOutput || result.stdout || '').trim().length,
|
|
676
|
+
reviewedLength: reviewedContent.length
|
|
677
|
+
};
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
}
|
|
272
681
|
// Create the rule using the generated content
|
|
273
682
|
const createResult = await createRule({
|
|
274
683
|
fileName,
|
|
@@ -282,11 +691,12 @@ FOCUS AREAS: ${extractFocus || 'naming conventions, error handling, code structu
|
|
|
282
691
|
success: createResult.success || false,
|
|
283
692
|
...createResult,
|
|
284
693
|
generatedContent,
|
|
285
|
-
executionId: result.conversation?.id
|
|
694
|
+
executionId: result.conversation?.id,
|
|
695
|
+
review: reviewResult
|
|
286
696
|
};
|
|
287
697
|
}
|
|
288
698
|
catch (error) {
|
|
289
|
-
return { error: error.message };
|
|
699
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
290
700
|
}
|
|
291
701
|
}
|
|
292
702
|
/**
|
|
@@ -344,7 +754,7 @@ paths: [${paths.join(', ')}]
|
|
|
344
754
|
};
|
|
345
755
|
}
|
|
346
756
|
catch (error) {
|
|
347
|
-
return { error: error.message };
|
|
757
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
348
758
|
}
|
|
349
759
|
}
|
|
350
760
|
/**
|
|
@@ -352,7 +762,7 @@ paths: [${paths.join(', ')}]
|
|
|
352
762
|
* @returns true if route was handled, false otherwise
|
|
353
763
|
*/
|
|
354
764
|
export async function handleRulesRoutes(ctx) {
|
|
355
|
-
const { pathname, url, req, res, initialPath, handlePostRequest } = ctx;
|
|
765
|
+
const { pathname, url, req, res, initialPath, handlePostRequest, broadcastToClients } = ctx;
|
|
356
766
|
// API: Get all rules
|
|
357
767
|
if (pathname === '/api/rules') {
|
|
358
768
|
const projectPathParam = url.searchParams.get('path') || initialPath;
|
|
@@ -382,57 +792,70 @@ export async function handleRulesRoutes(ctx) {
|
|
|
382
792
|
const ruleName = decodeURIComponent(pathname.replace('/api/rules/', ''));
|
|
383
793
|
handlePostRequest(req, res, async (body) => {
|
|
384
794
|
const { location, projectPath: projectPathParam } = body;
|
|
385
|
-
|
|
795
|
+
const resolvedLocation = typeof location === 'string' && location.trim().length > 0 ? location : 'project';
|
|
796
|
+
const resolvedProjectPath = typeof projectPathParam === 'string' && projectPathParam.trim().length > 0 ? projectPathParam : initialPath;
|
|
797
|
+
return deleteRule(ruleName, resolvedLocation, resolvedProjectPath);
|
|
386
798
|
});
|
|
387
799
|
return true;
|
|
388
800
|
}
|
|
389
801
|
// API: Create rule
|
|
390
802
|
if (pathname === '/api/rules/create' && req.method === 'POST') {
|
|
391
803
|
handlePostRequest(req, res, async (body) => {
|
|
392
|
-
const { mode, fileName, content, paths, location, subdirectory, projectPath: projectPathParam,
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
804
|
+
const { mode, fileName, content, paths, location, subdirectory, projectPath: projectPathParam, generationType, description, templateType, extractScope, extractFocus } = body;
|
|
805
|
+
const resolvedMode = typeof mode === 'string' ? mode : '';
|
|
806
|
+
const resolvedFileName = typeof fileName === 'string' ? fileName : '';
|
|
807
|
+
const resolvedContent = typeof content === 'string' ? content : '';
|
|
808
|
+
const resolvedLocation = typeof location === 'string' && location.trim().length > 0 ? location : '';
|
|
809
|
+
const resolvedSubdirectory = typeof subdirectory === 'string' ? subdirectory : '';
|
|
810
|
+
const resolvedProjectPath = typeof projectPathParam === 'string' && projectPathParam.trim().length > 0 ? projectPathParam : initialPath;
|
|
811
|
+
const resolvedGenerationType = typeof generationType === 'string' ? generationType : '';
|
|
812
|
+
const resolvedDescription = typeof description === 'string' ? description : undefined;
|
|
813
|
+
const resolvedTemplateType = typeof templateType === 'string' ? templateType : undefined;
|
|
814
|
+
const resolvedExtractScope = typeof extractScope === 'string' ? extractScope : undefined;
|
|
815
|
+
const resolvedExtractFocus = typeof extractFocus === 'string' ? extractFocus : undefined;
|
|
816
|
+
const resolvedPaths = Array.isArray(paths) ? paths.filter((p) => typeof p === 'string') : [];
|
|
817
|
+
if (!resolvedFileName) {
|
|
396
818
|
return { error: 'File name is required' };
|
|
397
819
|
}
|
|
398
|
-
if (!
|
|
820
|
+
if (!resolvedLocation) {
|
|
399
821
|
return { error: 'Location is required (project or user)' };
|
|
400
822
|
}
|
|
401
|
-
const projectPath =
|
|
823
|
+
const projectPath = resolvedProjectPath;
|
|
402
824
|
// CLI generation mode
|
|
403
|
-
if (
|
|
404
|
-
if (!
|
|
825
|
+
if (resolvedMode === 'cli-generate') {
|
|
826
|
+
if (!resolvedGenerationType) {
|
|
405
827
|
return { error: 'generationType is required for CLI generation mode' };
|
|
406
828
|
}
|
|
407
829
|
// Validate based on generation type
|
|
408
|
-
if (
|
|
830
|
+
if (resolvedGenerationType === 'description' && !resolvedDescription) {
|
|
409
831
|
return { error: 'description is required for description-based generation' };
|
|
410
832
|
}
|
|
411
|
-
if (
|
|
833
|
+
if (resolvedGenerationType === 'template' && !resolvedTemplateType) {
|
|
412
834
|
return { error: 'templateType is required for template-based generation' };
|
|
413
835
|
}
|
|
414
836
|
return await generateRuleViaCLI({
|
|
415
|
-
generationType,
|
|
416
|
-
description,
|
|
417
|
-
templateType,
|
|
418
|
-
extractScope,
|
|
419
|
-
extractFocus,
|
|
420
|
-
fileName,
|
|
421
|
-
location,
|
|
422
|
-
subdirectory:
|
|
423
|
-
projectPath
|
|
837
|
+
generationType: resolvedGenerationType,
|
|
838
|
+
description: resolvedDescription,
|
|
839
|
+
templateType: resolvedTemplateType,
|
|
840
|
+
extractScope: resolvedExtractScope,
|
|
841
|
+
extractFocus: resolvedExtractFocus,
|
|
842
|
+
fileName: resolvedFileName,
|
|
843
|
+
location: resolvedLocation,
|
|
844
|
+
subdirectory: resolvedSubdirectory || '',
|
|
845
|
+
projectPath,
|
|
846
|
+
broadcastToClients
|
|
424
847
|
});
|
|
425
848
|
}
|
|
426
849
|
// Manual creation mode
|
|
427
|
-
if (!
|
|
850
|
+
if (!resolvedContent) {
|
|
428
851
|
return { error: 'Content is required for manual creation' };
|
|
429
852
|
}
|
|
430
853
|
return await createRule({
|
|
431
|
-
fileName,
|
|
432
|
-
content,
|
|
433
|
-
paths:
|
|
434
|
-
location,
|
|
435
|
-
subdirectory:
|
|
854
|
+
fileName: resolvedFileName,
|
|
855
|
+
content: resolvedContent,
|
|
856
|
+
paths: resolvedPaths,
|
|
857
|
+
location: resolvedLocation,
|
|
858
|
+
subdirectory: resolvedSubdirectory || '',
|
|
436
859
|
projectPath
|
|
437
860
|
});
|
|
438
861
|
});
|