claude-code-workflow 6.3.18 → 6.3.20
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/issue-plan-agent.md +31 -2
- 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 +93 -3
- package/.claude/commands/issue/plan.md +9 -3
- 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 +310 -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 +513 -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 +206 -29
- package/ccw/dist/core/server.js.map +1 -1
- package/ccw/dist/core/services/api-key-tester.d.ts +42 -0
- package/ccw/dist/core/services/api-key-tester.d.ts.map +1 -0
- package/ccw/dist/core/services/api-key-tester.js +126 -0
- package/ccw/dist/core/services/api-key-tester.js.map +1 -0
- package/ccw/dist/core/services/health-check-service.d.ts +88 -0
- package/ccw/dist/core/services/health-check-service.d.ts.map +1 -0
- package/ccw/dist/core/services/health-check-service.js +293 -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 +574 -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 +657 -468
- package/ccw/src/core/services/api-key-tester.ts +160 -0
- package/ccw/src/core/services/health-check-service.ts +366 -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 +4448 -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 +6101 -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 +777 -15
- package/codex-lens/src/codexlens/cli/model_manager.py +676 -0
- package/codex-lens/src/codexlens/config.py +356 -12
- package/codex-lens/src/codexlens/entities.py +4 -1
- package/codex-lens/src/codexlens/env_config.py +304 -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 +1652 -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 +397 -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__/chunker.cpython-313.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/chunker.py +328 -23
- 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-312.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-312.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-312.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-312.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-312.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-312.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-312.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 +240 -25
- 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,22 +1,54 @@
|
|
|
1
|
-
// @ts-nocheck
|
|
2
1
|
/**
|
|
3
2
|
* Rules Routes Module
|
|
4
3
|
* Handles all Rules-related API endpoints
|
|
5
4
|
*/
|
|
6
|
-
import type { IncomingMessage, ServerResponse } from 'http';
|
|
7
5
|
import { readFileSync, existsSync, readdirSync, unlinkSync, promises as fsPromises } from 'fs';
|
|
8
6
|
import { join } from 'path';
|
|
9
7
|
import { homedir } from 'os';
|
|
10
8
|
import { executeCliTool } from '../../tools/cli-executor.js';
|
|
9
|
+
import { SmartContentFormatter } from '../../tools/cli-output-converter.js';
|
|
10
|
+
import type { RouteContext } from './types.js';
|
|
11
11
|
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
interface ParsedRuleFrontmatter {
|
|
13
|
+
paths: string[];
|
|
14
|
+
content: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
interface RuleDetail {
|
|
18
|
+
name: string;
|
|
19
|
+
paths: string[];
|
|
20
|
+
content: string;
|
|
21
|
+
location: string;
|
|
22
|
+
path: string;
|
|
23
|
+
subdirectory: string | null;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
interface RuleConfigResult {
|
|
27
|
+
projectRules: RuleDetail[];
|
|
28
|
+
userRules: RuleDetail[];
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
interface RuleCreateParams {
|
|
32
|
+
fileName: string;
|
|
33
|
+
content: string;
|
|
34
|
+
paths: string[];
|
|
35
|
+
location: string;
|
|
36
|
+
subdirectory: string;
|
|
37
|
+
projectPath: string;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface RuleGenerateParams {
|
|
41
|
+
generationType: string;
|
|
42
|
+
description?: string;
|
|
43
|
+
templateType?: string;
|
|
44
|
+
extractScope?: string;
|
|
45
|
+
extractFocus?: string;
|
|
46
|
+
fileName: string;
|
|
47
|
+
location: string;
|
|
48
|
+
subdirectory: string;
|
|
49
|
+
projectPath: string;
|
|
50
|
+
enableReview?: boolean;
|
|
51
|
+
broadcastToClients?: (data: unknown) => void;
|
|
20
52
|
}
|
|
21
53
|
|
|
22
54
|
/**
|
|
@@ -24,8 +56,8 @@ export interface RouteContext {
|
|
|
24
56
|
* @param {string} content
|
|
25
57
|
* @returns {Object}
|
|
26
58
|
*/
|
|
27
|
-
function parseRuleFrontmatter(content) {
|
|
28
|
-
const result = {
|
|
59
|
+
function parseRuleFrontmatter(content: string): ParsedRuleFrontmatter {
|
|
60
|
+
const result: ParsedRuleFrontmatter = {
|
|
29
61
|
paths: [],
|
|
30
62
|
content: content
|
|
31
63
|
};
|
|
@@ -64,8 +96,8 @@ function parseRuleFrontmatter(content) {
|
|
|
64
96
|
* @param {string} subdirectory
|
|
65
97
|
* @returns {Object[]}
|
|
66
98
|
*/
|
|
67
|
-
function scanRulesDirectory(dirPath, location, subdirectory) {
|
|
68
|
-
const rules = [];
|
|
99
|
+
function scanRulesDirectory(dirPath: string, location: string, subdirectory: string): RuleDetail[] {
|
|
100
|
+
const rules: RuleDetail[] = [];
|
|
69
101
|
|
|
70
102
|
try {
|
|
71
103
|
const entries = readdirSync(dirPath, { withFileTypes: true });
|
|
@@ -102,8 +134,8 @@ function scanRulesDirectory(dirPath, location, subdirectory) {
|
|
|
102
134
|
* @param {string} projectPath
|
|
103
135
|
* @returns {Object}
|
|
104
136
|
*/
|
|
105
|
-
function getRulesConfig(projectPath) {
|
|
106
|
-
const result = {
|
|
137
|
+
function getRulesConfig(projectPath: string): RuleConfigResult {
|
|
138
|
+
const result: RuleConfigResult = {
|
|
107
139
|
projectRules: [],
|
|
108
140
|
userRules: []
|
|
109
141
|
};
|
|
@@ -135,7 +167,7 @@ function getRulesConfig(projectPath) {
|
|
|
135
167
|
* @param {string} ruleName
|
|
136
168
|
* @returns {string|null}
|
|
137
169
|
*/
|
|
138
|
-
function findRuleFile(baseDir, ruleName) {
|
|
170
|
+
function findRuleFile(baseDir: string, ruleName: string): string | null {
|
|
139
171
|
try {
|
|
140
172
|
// Direct path
|
|
141
173
|
const directPath = join(baseDir, ruleName);
|
|
@@ -164,7 +196,7 @@ function findRuleFile(baseDir, ruleName) {
|
|
|
164
196
|
* @param {string} projectPath
|
|
165
197
|
* @returns {Object}
|
|
166
198
|
*/
|
|
167
|
-
function getRuleDetail(ruleName, location, projectPath) {
|
|
199
|
+
function getRuleDetail(ruleName: string, location: string, projectPath: string): { rule?: RuleDetail; error?: string } {
|
|
168
200
|
try {
|
|
169
201
|
const baseDir = location === 'project'
|
|
170
202
|
? join(projectPath, '.claude', 'rules')
|
|
@@ -180,17 +212,26 @@ function getRuleDetail(ruleName, location, projectPath) {
|
|
|
180
212
|
const content = readFileSync(rulePath, 'utf8');
|
|
181
213
|
const parsed = parseRuleFrontmatter(content);
|
|
182
214
|
|
|
215
|
+
const normalizedBaseDir = baseDir.replace(/\\/g, '/').replace(/\/+$/, '');
|
|
216
|
+
const normalizedRulePath = rulePath.replace(/\\/g, '/');
|
|
217
|
+
const relativePath = normalizedRulePath.startsWith(`${normalizedBaseDir}/`)
|
|
218
|
+
? normalizedRulePath.slice(normalizedBaseDir.length + 1)
|
|
219
|
+
: ruleName;
|
|
220
|
+
const relativeParts = relativePath.split('/');
|
|
221
|
+
const subdirectory = relativeParts.length > 1 ? relativeParts.slice(0, -1).join('/') : null;
|
|
222
|
+
|
|
183
223
|
return {
|
|
184
224
|
rule: {
|
|
185
225
|
name: ruleName,
|
|
186
226
|
paths: parsed.paths,
|
|
187
227
|
content: parsed.content,
|
|
188
228
|
location,
|
|
189
|
-
path: rulePath
|
|
229
|
+
path: rulePath,
|
|
230
|
+
subdirectory
|
|
190
231
|
}
|
|
191
232
|
};
|
|
192
233
|
} catch (error) {
|
|
193
|
-
return { error:
|
|
234
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
194
235
|
}
|
|
195
236
|
}
|
|
196
237
|
|
|
@@ -201,7 +242,11 @@ function getRuleDetail(ruleName, location, projectPath) {
|
|
|
201
242
|
* @param {string} projectPath
|
|
202
243
|
* @returns {Object}
|
|
203
244
|
*/
|
|
204
|
-
function deleteRule(
|
|
245
|
+
function deleteRule(
|
|
246
|
+
ruleName: string,
|
|
247
|
+
location: string,
|
|
248
|
+
projectPath: string
|
|
249
|
+
): { success: true; ruleName: string; location: string } | { error: string; status?: number } {
|
|
205
250
|
try {
|
|
206
251
|
const baseDir = location === 'project'
|
|
207
252
|
? join(projectPath, '.claude', 'rules')
|
|
@@ -217,10 +262,314 @@ function deleteRule(ruleName, location, projectPath) {
|
|
|
217
262
|
|
|
218
263
|
return { success: true, ruleName, location };
|
|
219
264
|
} catch (error) {
|
|
220
|
-
return { error:
|
|
265
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
221
266
|
}
|
|
222
267
|
}
|
|
223
268
|
|
|
269
|
+
/**
|
|
270
|
+
* Infer rule context from file name and subdirectory for better prompt generation
|
|
271
|
+
* @param {string} fileName - Rule file name
|
|
272
|
+
* @param {string} subdirectory - Optional subdirectory path
|
|
273
|
+
* @param {string} location - 'project' or 'user'
|
|
274
|
+
* @returns {Object} Inferred context
|
|
275
|
+
*/
|
|
276
|
+
function inferRuleContext(fileName: string, subdirectory: string, location: string) {
|
|
277
|
+
const normalizedName = fileName.replace(/\.md$/i, '').toLowerCase();
|
|
278
|
+
const normalizedSubdir = (subdirectory || '').toLowerCase();
|
|
279
|
+
|
|
280
|
+
// Rule category inference from file name and subdirectory
|
|
281
|
+
const categories = {
|
|
282
|
+
coding: ['coding', 'code', 'style', 'format', 'lint', 'convention'],
|
|
283
|
+
testing: ['test', 'spec', 'jest', 'vitest', 'mocha', 'coverage'],
|
|
284
|
+
security: ['security', 'auth', 'permission', 'access', 'secret', 'credential'],
|
|
285
|
+
architecture: ['arch', 'design', 'pattern', 'structure', 'module', 'layer'],
|
|
286
|
+
documentation: ['doc', 'comment', 'readme', 'jsdoc', 'api-doc'],
|
|
287
|
+
performance: ['perf', 'performance', 'optimize', 'cache', 'memory'],
|
|
288
|
+
workflow: ['workflow', 'ci', 'cd', 'deploy', 'build', 'release'],
|
|
289
|
+
tooling: ['tool', 'cli', 'script', 'npm', 'yarn', 'pnpm'],
|
|
290
|
+
error: ['error', 'exception', 'handling', 'logging', 'debug']
|
|
291
|
+
};
|
|
292
|
+
|
|
293
|
+
let inferredCategory = 'general';
|
|
294
|
+
let inferredKeywords: string[] = [];
|
|
295
|
+
|
|
296
|
+
for (const [category, keywords] of Object.entries(categories)) {
|
|
297
|
+
for (const keyword of keywords) {
|
|
298
|
+
if (normalizedName.includes(keyword) || normalizedSubdir.includes(keyword)) {
|
|
299
|
+
inferredCategory = category;
|
|
300
|
+
inferredKeywords = keywords;
|
|
301
|
+
break;
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
if (inferredCategory !== 'general') break;
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
// Scope inference from location
|
|
308
|
+
const scopeHint = location === 'project'
|
|
309
|
+
? 'This rule applies to the current project only'
|
|
310
|
+
: 'This rule applies globally to all projects';
|
|
311
|
+
|
|
312
|
+
// Technology hints from file name
|
|
313
|
+
const techPatterns = {
|
|
314
|
+
typescript: ['ts', 'typescript', 'tsc'],
|
|
315
|
+
javascript: ['js', 'javascript', 'node'],
|
|
316
|
+
react: ['react', 'jsx', 'tsx', 'component'],
|
|
317
|
+
vue: ['vue', 'vuex', 'pinia'],
|
|
318
|
+
python: ['python', 'py', 'pip', 'poetry'],
|
|
319
|
+
rust: ['rust', 'cargo', 'rs'],
|
|
320
|
+
go: ['go', 'golang', 'mod'],
|
|
321
|
+
java: ['java', 'maven', 'gradle', 'spring']
|
|
322
|
+
};
|
|
323
|
+
|
|
324
|
+
let inferredTech: string | null = null;
|
|
325
|
+
for (const [tech, patterns] of Object.entries(techPatterns)) {
|
|
326
|
+
if (patterns.some(p => normalizedName.includes(p) || normalizedSubdir.includes(p))) {
|
|
327
|
+
inferredTech = tech;
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
return {
|
|
333
|
+
category: inferredCategory,
|
|
334
|
+
keywords: inferredKeywords,
|
|
335
|
+
scopeHint,
|
|
336
|
+
technology: inferredTech,
|
|
337
|
+
isConditional: normalizedSubdir.length > 0
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
/**
|
|
342
|
+
* Build structured prompt for rule generation
|
|
343
|
+
* @param {Object} params
|
|
344
|
+
* @returns {string} Structured prompt
|
|
345
|
+
*/
|
|
346
|
+
function buildStructuredRulePrompt(params: {
|
|
347
|
+
description: string;
|
|
348
|
+
fileName: string;
|
|
349
|
+
subdirectory: string;
|
|
350
|
+
location: string;
|
|
351
|
+
context: ReturnType<typeof inferRuleContext>;
|
|
352
|
+
enableReview?: boolean;
|
|
353
|
+
}) {
|
|
354
|
+
const { description, fileName, subdirectory, location, context, enableReview } = params;
|
|
355
|
+
|
|
356
|
+
// Build category-specific guidance
|
|
357
|
+
const categoryGuidance: Record<string, string> = {
|
|
358
|
+
coding: 'Focus on code style, naming conventions, and formatting rules. Include specific examples of correct and incorrect patterns.',
|
|
359
|
+
testing: 'Emphasize test structure, coverage expectations, mocking strategies, and assertion patterns.',
|
|
360
|
+
security: 'Highlight security best practices, input validation, authentication requirements, and sensitive data handling.',
|
|
361
|
+
architecture: 'Define module boundaries, dependency rules, layer responsibilities, and design pattern usage.',
|
|
362
|
+
documentation: 'Specify documentation requirements, comment styles, and API documentation standards.',
|
|
363
|
+
performance: 'Address caching strategies, optimization guidelines, resource management, and performance metrics.',
|
|
364
|
+
workflow: 'Define CI/CD requirements, deployment procedures, and release management rules.',
|
|
365
|
+
tooling: 'Specify tool configurations, script conventions, and dependency management rules.',
|
|
366
|
+
error: 'Define error handling patterns, logging requirements, and exception management.',
|
|
367
|
+
general: 'Provide clear, actionable guidelines that Claude can follow consistently.'
|
|
368
|
+
};
|
|
369
|
+
|
|
370
|
+
const guidance = categoryGuidance[context.category] || categoryGuidance.general;
|
|
371
|
+
|
|
372
|
+
// Build technology-specific hint
|
|
373
|
+
const techHint = context.technology
|
|
374
|
+
? `\nTECHNOLOGY CONTEXT: This rule is for ${context.technology} development. Use ${context.technology}-specific best practices and terminology.`
|
|
375
|
+
: '';
|
|
376
|
+
|
|
377
|
+
// Build subdirectory context
|
|
378
|
+
const subdirHint = subdirectory
|
|
379
|
+
? `\nORGANIZATION: This rule will be placed in the "${subdirectory}" subdirectory, indicating its category/scope.`
|
|
380
|
+
: '';
|
|
381
|
+
|
|
382
|
+
// Build review instruction if enabled
|
|
383
|
+
const reviewInstruction = enableReview
|
|
384
|
+
? `\n\nAFTER GENERATION:
|
|
385
|
+
- Verify the rule is specific and actionable
|
|
386
|
+
- Check for ambiguous language that could be misinterpreted
|
|
387
|
+
- Ensure examples are clear and relevant
|
|
388
|
+
- Validate markdown formatting is correct`
|
|
389
|
+
: '';
|
|
390
|
+
|
|
391
|
+
return `PURPOSE: Generate a high-quality Claude Code memory rule that will guide Claude's behavior when working in this codebase
|
|
392
|
+
SUCCESS CRITERIA: The rule must be (1) specific and actionable, (2) include concrete examples, (3) avoid ambiguous language, (4) follow Claude Code rule format
|
|
393
|
+
|
|
394
|
+
TASK:
|
|
395
|
+
• Parse the user's description to identify core requirements
|
|
396
|
+
• Infer additional context from file name "${fileName}" and category "${context.category}"
|
|
397
|
+
• Generate structured markdown content with clear instructions
|
|
398
|
+
• Include DO and DON'T examples where appropriate
|
|
399
|
+
• ${context.isConditional ? 'Consider if frontmatter paths are needed for conditional activation' : 'Create as a global rule'}
|
|
400
|
+
|
|
401
|
+
MODE: write
|
|
402
|
+
|
|
403
|
+
RULE CATEGORY: ${context.category}
|
|
404
|
+
CATEGORY GUIDANCE: ${guidance}
|
|
405
|
+
${techHint}
|
|
406
|
+
${subdirHint}
|
|
407
|
+
SCOPE: ${context.scopeHint}
|
|
408
|
+
|
|
409
|
+
EXPECTED OUTPUT FORMAT:
|
|
410
|
+
\`\`\`markdown
|
|
411
|
+
${context.isConditional ? `---
|
|
412
|
+
paths: [specific/path/patterns/**/*]
|
|
413
|
+
---
|
|
414
|
+
|
|
415
|
+
` : ''}# Rule Title
|
|
416
|
+
|
|
417
|
+
Brief description of what this rule enforces.
|
|
418
|
+
|
|
419
|
+
## Guidelines
|
|
420
|
+
|
|
421
|
+
1. **First guideline** - Explanation
|
|
422
|
+
2. **Second guideline** - Explanation
|
|
423
|
+
|
|
424
|
+
## Examples
|
|
425
|
+
|
|
426
|
+
### ✅ Correct
|
|
427
|
+
\`\`\`language
|
|
428
|
+
// Good example
|
|
429
|
+
\`\`\`
|
|
430
|
+
|
|
431
|
+
### ❌ Incorrect
|
|
432
|
+
\`\`\`language
|
|
433
|
+
// Bad example
|
|
434
|
+
\`\`\`
|
|
435
|
+
|
|
436
|
+
## Exceptions
|
|
437
|
+
|
|
438
|
+
- When this rule may not apply
|
|
439
|
+
\`\`\`
|
|
440
|
+
|
|
441
|
+
USER DESCRIPTION:
|
|
442
|
+
${description}
|
|
443
|
+
|
|
444
|
+
FILE NAME: ${fileName}
|
|
445
|
+
${subdirectory ? `SUBDIRECTORY: ${subdirectory}` : ''}
|
|
446
|
+
${reviewInstruction}
|
|
447
|
+
|
|
448
|
+
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`;
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* Build structured prompt for code extraction
|
|
453
|
+
* @param {Object} params
|
|
454
|
+
* @returns {string} Structured prompt
|
|
455
|
+
*/
|
|
456
|
+
function buildExtractPrompt(params: {
|
|
457
|
+
extractScope: string;
|
|
458
|
+
extractFocus: string;
|
|
459
|
+
fileName: string;
|
|
460
|
+
subdirectory: string;
|
|
461
|
+
context: ReturnType<typeof inferRuleContext>;
|
|
462
|
+
}) {
|
|
463
|
+
const { extractScope, extractFocus, fileName, subdirectory, context } = params;
|
|
464
|
+
|
|
465
|
+
const scope = extractScope || '**/*';
|
|
466
|
+
const focus = extractFocus || 'naming conventions, error handling, code structure, patterns';
|
|
467
|
+
|
|
468
|
+
return `PURPOSE: Extract and document coding conventions from the existing codebase to create a Claude Code memory rule
|
|
469
|
+
SUCCESS CRITERIA: The rule must reflect ACTUAL patterns found in the code, not theoretical best practices
|
|
470
|
+
|
|
471
|
+
TASK:
|
|
472
|
+
• Scan files matching "${scope}" for recurring patterns
|
|
473
|
+
• Identify ${focus.split(',').length} or more distinct conventions
|
|
474
|
+
• Document each pattern with real code examples from the codebase
|
|
475
|
+
• Create actionable rules based on observed practices
|
|
476
|
+
• Note any inconsistencies found (optional section)
|
|
477
|
+
|
|
478
|
+
MODE: analysis
|
|
479
|
+
|
|
480
|
+
ANALYSIS SCOPE: @${scope}
|
|
481
|
+
FOCUS AREAS: ${focus}
|
|
482
|
+
|
|
483
|
+
EXTRACTION STRATEGY:
|
|
484
|
+
1. **Pattern Recognition**: Look for repeated code structures, naming patterns, file organization
|
|
485
|
+
2. **Consistency Check**: Identify which patterns are consistently followed vs. occasionally violated
|
|
486
|
+
3. **Frequency Analysis**: Prioritize patterns that appear most frequently
|
|
487
|
+
4. **Context Awareness**: Consider why certain patterns are used (performance, readability, etc.)
|
|
488
|
+
|
|
489
|
+
EXPECTED OUTPUT FORMAT:
|
|
490
|
+
\`\`\`markdown
|
|
491
|
+
# ${fileName.replace(/\.md$/i, '')} Conventions
|
|
492
|
+
|
|
493
|
+
Conventions extracted from codebase analysis of \`${scope}\`.
|
|
494
|
+
|
|
495
|
+
## Naming Conventions
|
|
496
|
+
|
|
497
|
+
- **Pattern name**: Description with example
|
|
498
|
+
\`\`\`language
|
|
499
|
+
// Actual code from codebase
|
|
500
|
+
\`\`\`
|
|
501
|
+
|
|
502
|
+
## Code Structure
|
|
503
|
+
|
|
504
|
+
- **Pattern name**: Description with example
|
|
505
|
+
|
|
506
|
+
## Error Handling
|
|
507
|
+
|
|
508
|
+
- **Pattern name**: Description with example
|
|
509
|
+
|
|
510
|
+
## Notes
|
|
511
|
+
|
|
512
|
+
- Any inconsistencies or variations observed
|
|
513
|
+
\`\`\`
|
|
514
|
+
|
|
515
|
+
FILE NAME: ${fileName}
|
|
516
|
+
${subdirectory ? `SUBDIRECTORY: ${subdirectory}` : ''}
|
|
517
|
+
INFERRED CATEGORY: ${context.category}
|
|
518
|
+
|
|
519
|
+
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`;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* Build review prompt for validating and improving generated rules
|
|
524
|
+
* @param {string} content - Generated rule content to review
|
|
525
|
+
* @param {string} fileName - Target file name
|
|
526
|
+
* @param {Object} context - Inferred context
|
|
527
|
+
* @returns {string} Review prompt
|
|
528
|
+
*/
|
|
529
|
+
function buildReviewPrompt(
|
|
530
|
+
content: string,
|
|
531
|
+
fileName: string,
|
|
532
|
+
context: ReturnType<typeof inferRuleContext>
|
|
533
|
+
) {
|
|
534
|
+
return `PURPOSE: Review and improve a Claude Code memory rule for quality, clarity, and actionability
|
|
535
|
+
SUCCESS CRITERIA: Output an improved version that is (1) more specific, (2) includes better examples, (3) has no ambiguous language
|
|
536
|
+
|
|
537
|
+
TASK:
|
|
538
|
+
• Analyze the rule for clarity and specificity
|
|
539
|
+
• Check if guidelines are actionable (Claude can follow them)
|
|
540
|
+
• Verify examples are concrete and helpful
|
|
541
|
+
• Remove any ambiguous or vague language
|
|
542
|
+
• Ensure markdown formatting is correct
|
|
543
|
+
• Improve structure if needed
|
|
544
|
+
• Keep the core intent and requirements intact
|
|
545
|
+
|
|
546
|
+
MODE: write
|
|
547
|
+
|
|
548
|
+
REVIEW CRITERIA:
|
|
549
|
+
1. **Specificity**: Each guideline should be specific enough to follow without interpretation
|
|
550
|
+
2. **Actionability**: Guidelines should tell Claude exactly what to do or not do
|
|
551
|
+
3. **Examples**: Good and bad examples should be clearly different and illustrative
|
|
552
|
+
4. **Consistency**: Formatting and style should be consistent throughout
|
|
553
|
+
5. **Completeness**: All necessary aspects of the rule should be covered
|
|
554
|
+
6. **Conciseness**: No unnecessary verbosity or repetition
|
|
555
|
+
|
|
556
|
+
RULE CATEGORY: ${context.category}
|
|
557
|
+
FILE NAME: ${fileName}
|
|
558
|
+
|
|
559
|
+
ORIGINAL RULE CONTENT:
|
|
560
|
+
\`\`\`markdown
|
|
561
|
+
${content}
|
|
562
|
+
\`\`\`
|
|
563
|
+
|
|
564
|
+
EXPECTED OUTPUT:
|
|
565
|
+
- Output ONLY the improved rule content in markdown format
|
|
566
|
+
- Do NOT include any commentary, explanation, or meta-text
|
|
567
|
+
- If the original is already high quality, return it unchanged
|
|
568
|
+
- Preserve any frontmatter (---paths---) if present
|
|
569
|
+
|
|
570
|
+
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`;
|
|
571
|
+
}
|
|
572
|
+
|
|
224
573
|
/**
|
|
225
574
|
* Generate rule content via CLI tool
|
|
226
575
|
* @param {Object} params
|
|
@@ -233,9 +582,13 @@ function deleteRule(ruleName, location, projectPath) {
|
|
|
233
582
|
* @param {string} params.location - 'project' or 'user'
|
|
234
583
|
* @param {string} params.subdirectory - Optional subdirectory
|
|
235
584
|
* @param {string} params.projectPath - Project root path
|
|
585
|
+
* @param {boolean} params.enableReview - Optional: enable secondary review
|
|
236
586
|
* @returns {Object}
|
|
237
587
|
*/
|
|
238
|
-
async function generateRuleViaCLI(params) {
|
|
588
|
+
async function generateRuleViaCLI(params: RuleGenerateParams): Promise<Record<string, unknown>> {
|
|
589
|
+
// Generate unique execution ID for tracking
|
|
590
|
+
const executionId = `rule-gen-${params.fileName.replace('.md', '')}-${Date.now()}`;
|
|
591
|
+
|
|
239
592
|
try {
|
|
240
593
|
const {
|
|
241
594
|
generationType,
|
|
@@ -246,60 +599,107 @@ async function generateRuleViaCLI(params) {
|
|
|
246
599
|
fileName,
|
|
247
600
|
location,
|
|
248
601
|
subdirectory,
|
|
249
|
-
projectPath
|
|
602
|
+
projectPath,
|
|
603
|
+
enableReview,
|
|
604
|
+
broadcastToClients
|
|
250
605
|
} = params;
|
|
251
606
|
|
|
252
607
|
let prompt = '';
|
|
253
608
|
let mode = 'analysis';
|
|
254
609
|
let workingDir = projectPath;
|
|
255
610
|
|
|
611
|
+
// Infer context from file name and subdirectory
|
|
612
|
+
const context = inferRuleContext(fileName, subdirectory || '', location);
|
|
613
|
+
|
|
256
614
|
// Build prompt based on generation type
|
|
257
615
|
if (generationType === 'description') {
|
|
258
616
|
mode = 'write';
|
|
259
|
-
prompt =
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
FILE NAME: ${fileName}`;
|
|
617
|
+
prompt = buildStructuredRulePrompt({
|
|
618
|
+
description: description || '',
|
|
619
|
+
fileName,
|
|
620
|
+
subdirectory: subdirectory || '',
|
|
621
|
+
location,
|
|
622
|
+
context,
|
|
623
|
+
enableReview
|
|
624
|
+
});
|
|
269
625
|
} else if (generationType === 'template') {
|
|
270
626
|
mode = 'write';
|
|
271
627
|
prompt = `PURPOSE: Generate Claude Code rule from template type
|
|
272
628
|
TASK: • Create rule based on ${templateType} template • Generate structured markdown content
|
|
273
629
|
MODE: write
|
|
274
630
|
EXPECTED: Complete rule content in markdown format following template structure
|
|
275
|
-
RULES: $(cat ~/.claude/workflows/cli-templates/prompts/universal/00-universal-rigorous-style.txt) | Follow Claude Code rule format | Use ${templateType} template patterns | write=CREATE
|
|
631
|
+
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
|
|
276
632
|
|
|
277
633
|
TEMPLATE TYPE: ${templateType}
|
|
278
634
|
FILE NAME: ${fileName}`;
|
|
279
635
|
} else if (generationType === 'extract') {
|
|
280
636
|
mode = 'analysis';
|
|
281
|
-
prompt =
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
ANALYSIS SCOPE: ${extractScope || '**/*'}
|
|
289
|
-
FOCUS AREAS: ${extractFocus || 'naming conventions, error handling, code structure'}`;
|
|
637
|
+
prompt = buildExtractPrompt({
|
|
638
|
+
extractScope: extractScope || '',
|
|
639
|
+
extractFocus: extractFocus || '',
|
|
640
|
+
fileName,
|
|
641
|
+
subdirectory: subdirectory || '',
|
|
642
|
+
context
|
|
643
|
+
});
|
|
290
644
|
} else {
|
|
291
645
|
return { error: `Unknown generation type: ${generationType}` };
|
|
292
646
|
}
|
|
293
647
|
|
|
648
|
+
// Broadcast CLI_EXECUTION_STARTED event
|
|
649
|
+
if (broadcastToClients) {
|
|
650
|
+
broadcastToClients({
|
|
651
|
+
type: 'CLI_EXECUTION_STARTED',
|
|
652
|
+
payload: {
|
|
653
|
+
executionId,
|
|
654
|
+
tool: 'claude',
|
|
655
|
+
mode,
|
|
656
|
+
category: 'internal',
|
|
657
|
+
context: 'rule-generation',
|
|
658
|
+
fileName
|
|
659
|
+
}
|
|
660
|
+
});
|
|
661
|
+
}
|
|
662
|
+
|
|
663
|
+
// Create onOutput callback for real-time streaming
|
|
664
|
+
const onOutput = broadcastToClients
|
|
665
|
+
? (unit: import('../../tools/cli-output-converter.js').CliOutputUnit) => {
|
|
666
|
+
// CliOutputUnit handler: use SmartContentFormatter for intelligent formatting (never returns null)
|
|
667
|
+
const content = SmartContentFormatter.format(unit.content, unit.type);
|
|
668
|
+
broadcastToClients({
|
|
669
|
+
type: 'CLI_OUTPUT',
|
|
670
|
+
payload: {
|
|
671
|
+
executionId,
|
|
672
|
+
chunkType: unit.type,
|
|
673
|
+
data: content
|
|
674
|
+
}
|
|
675
|
+
});
|
|
676
|
+
}
|
|
677
|
+
: undefined;
|
|
678
|
+
|
|
294
679
|
// Execute CLI tool (Claude) with at least 10 minutes timeout
|
|
680
|
+
const startTime = Date.now();
|
|
295
681
|
const result = await executeCliTool({
|
|
296
682
|
tool: 'claude',
|
|
297
683
|
prompt,
|
|
298
684
|
mode,
|
|
299
685
|
cd: workingDir,
|
|
300
686
|
timeout: 600000, // 10 minutes
|
|
301
|
-
category: 'internal'
|
|
302
|
-
|
|
687
|
+
category: 'internal',
|
|
688
|
+
id: executionId
|
|
689
|
+
}, onOutput);
|
|
690
|
+
|
|
691
|
+
// Broadcast CLI_EXECUTION_COMPLETED event
|
|
692
|
+
if (broadcastToClients) {
|
|
693
|
+
broadcastToClients({
|
|
694
|
+
type: 'CLI_EXECUTION_COMPLETED',
|
|
695
|
+
payload: {
|
|
696
|
+
executionId,
|
|
697
|
+
success: result.success,
|
|
698
|
+
status: result.execution?.status || (result.success ? 'success' : 'error'),
|
|
699
|
+
duration_ms: Date.now() - startTime
|
|
700
|
+
}
|
|
701
|
+
});
|
|
702
|
+
}
|
|
303
703
|
|
|
304
704
|
if (!result.success) {
|
|
305
705
|
return {
|
|
@@ -308,8 +708,15 @@ FOCUS AREAS: ${extractFocus || 'naming conventions, error handling, code structu
|
|
|
308
708
|
};
|
|
309
709
|
}
|
|
310
710
|
|
|
311
|
-
// Extract generated content from
|
|
312
|
-
|
|
711
|
+
// Extract generated content - prefer parsedOutput (extracted text from stream JSON)
|
|
712
|
+
let generatedContent = (result.parsedOutput || result.stdout || '').trim();
|
|
713
|
+
|
|
714
|
+
// Remove markdown code block wrapper if present (e.g., ```markdown...```)
|
|
715
|
+
if (generatedContent.startsWith('```markdown')) {
|
|
716
|
+
generatedContent = generatedContent.replace(/^```markdown\s*\n?/, '').replace(/\n?```\s*$/, '');
|
|
717
|
+
} else if (generatedContent.startsWith('```')) {
|
|
718
|
+
generatedContent = generatedContent.replace(/^```\w*\s*\n?/, '').replace(/\n?```\s*$/, '');
|
|
719
|
+
}
|
|
313
720
|
|
|
314
721
|
if (!generatedContent) {
|
|
315
722
|
return {
|
|
@@ -319,6 +726,87 @@ FOCUS AREAS: ${extractFocus || 'naming conventions, error handling, code structu
|
|
|
319
726
|
};
|
|
320
727
|
}
|
|
321
728
|
|
|
729
|
+
// Optional review step - verify and improve the generated rule
|
|
730
|
+
let reviewResult = null;
|
|
731
|
+
if (enableReview) {
|
|
732
|
+
const reviewPrompt = buildReviewPrompt(generatedContent, fileName, context);
|
|
733
|
+
const reviewExecutionId = `${executionId}-review`;
|
|
734
|
+
|
|
735
|
+
// Broadcast review CLI_EXECUTION_STARTED event
|
|
736
|
+
if (broadcastToClients) {
|
|
737
|
+
broadcastToClients({
|
|
738
|
+
type: 'CLI_EXECUTION_STARTED',
|
|
739
|
+
payload: {
|
|
740
|
+
executionId: reviewExecutionId,
|
|
741
|
+
tool: 'claude',
|
|
742
|
+
mode: 'write',
|
|
743
|
+
category: 'internal',
|
|
744
|
+
context: 'rule-review',
|
|
745
|
+
fileName
|
|
746
|
+
}
|
|
747
|
+
});
|
|
748
|
+
}
|
|
749
|
+
|
|
750
|
+
// Create onOutput callback for review step
|
|
751
|
+
const reviewOnOutput = broadcastToClients
|
|
752
|
+
? (unit: import('../../tools/cli-output-converter.js').CliOutputUnit) => {
|
|
753
|
+
// CliOutputUnit handler: use SmartContentFormatter for intelligent formatting (never returns null)
|
|
754
|
+
const content = SmartContentFormatter.format(unit.content, unit.type);
|
|
755
|
+
broadcastToClients({
|
|
756
|
+
type: 'CLI_OUTPUT',
|
|
757
|
+
payload: {
|
|
758
|
+
executionId: reviewExecutionId,
|
|
759
|
+
chunkType: unit.type,
|
|
760
|
+
data: content
|
|
761
|
+
}
|
|
762
|
+
});
|
|
763
|
+
}
|
|
764
|
+
: undefined;
|
|
765
|
+
|
|
766
|
+
const reviewStartTime = Date.now();
|
|
767
|
+
const reviewExecution = await executeCliTool({
|
|
768
|
+
tool: 'claude',
|
|
769
|
+
prompt: reviewPrompt,
|
|
770
|
+
mode: 'write',
|
|
771
|
+
cd: workingDir,
|
|
772
|
+
timeout: 300000, // 5 minutes for review
|
|
773
|
+
category: 'internal',
|
|
774
|
+
id: reviewExecutionId
|
|
775
|
+
}, reviewOnOutput);
|
|
776
|
+
|
|
777
|
+
// Broadcast review CLI_EXECUTION_COMPLETED event
|
|
778
|
+
if (broadcastToClients) {
|
|
779
|
+
broadcastToClients({
|
|
780
|
+
type: 'CLI_EXECUTION_COMPLETED',
|
|
781
|
+
payload: {
|
|
782
|
+
executionId: reviewExecutionId,
|
|
783
|
+
success: reviewExecution.success,
|
|
784
|
+
status: reviewExecution.execution?.status || (reviewExecution.success ? 'success' : 'error'),
|
|
785
|
+
duration_ms: Date.now() - reviewStartTime
|
|
786
|
+
}
|
|
787
|
+
});
|
|
788
|
+
}
|
|
789
|
+
|
|
790
|
+
if (reviewExecution.success) {
|
|
791
|
+
let reviewedContent = (reviewExecution.parsedOutput || reviewExecution.stdout || '').trim();
|
|
792
|
+
// Remove markdown code block wrapper if present
|
|
793
|
+
if (reviewedContent.startsWith('```markdown')) {
|
|
794
|
+
reviewedContent = reviewedContent.replace(/^```markdown\s*\n?/, '').replace(/\n?```\s*$/, '');
|
|
795
|
+
} else if (reviewedContent.startsWith('```')) {
|
|
796
|
+
reviewedContent = reviewedContent.replace(/^```\w*\s*\n?/, '').replace(/\n?```\s*$/, '');
|
|
797
|
+
}
|
|
798
|
+
// Only use reviewed content if it's valid and different
|
|
799
|
+
if (reviewedContent.length > 50 && reviewedContent !== generatedContent) {
|
|
800
|
+
generatedContent = reviewedContent;
|
|
801
|
+
reviewResult = {
|
|
802
|
+
reviewed: true,
|
|
803
|
+
originalLength: (result.parsedOutput || result.stdout || '').trim().length,
|
|
804
|
+
reviewedLength: reviewedContent.length
|
|
805
|
+
};
|
|
806
|
+
}
|
|
807
|
+
}
|
|
808
|
+
}
|
|
809
|
+
|
|
322
810
|
// Create the rule using the generated content
|
|
323
811
|
const createResult = await createRule({
|
|
324
812
|
fileName,
|
|
@@ -333,10 +821,11 @@ FOCUS AREAS: ${extractFocus || 'naming conventions, error handling, code structu
|
|
|
333
821
|
success: createResult.success || false,
|
|
334
822
|
...createResult,
|
|
335
823
|
generatedContent,
|
|
336
|
-
executionId: result.conversation?.id
|
|
824
|
+
executionId: result.conversation?.id,
|
|
825
|
+
review: reviewResult
|
|
337
826
|
};
|
|
338
|
-
} catch (error) {
|
|
339
|
-
return { error:
|
|
827
|
+
} catch (error: unknown) {
|
|
828
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
340
829
|
}
|
|
341
830
|
}
|
|
342
831
|
|
|
@@ -351,7 +840,7 @@ FOCUS AREAS: ${extractFocus || 'naming conventions, error handling, code structu
|
|
|
351
840
|
* @param {string} params.projectPath - Project root path
|
|
352
841
|
* @returns {Object}
|
|
353
842
|
*/
|
|
354
|
-
async function createRule(params) {
|
|
843
|
+
async function createRule(params: RuleCreateParams): Promise<Record<string, unknown>> {
|
|
355
844
|
try {
|
|
356
845
|
const { fileName, content, paths, location, subdirectory, projectPath } = params;
|
|
357
846
|
|
|
@@ -402,8 +891,8 @@ paths: [${paths.join(', ')}]
|
|
|
402
891
|
path: filePath,
|
|
403
892
|
subdirectory: subdirectory || null
|
|
404
893
|
};
|
|
405
|
-
} catch (error) {
|
|
406
|
-
return { error:
|
|
894
|
+
} catch (error: unknown) {
|
|
895
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
407
896
|
}
|
|
408
897
|
}
|
|
409
898
|
|
|
@@ -412,7 +901,7 @@ paths: [${paths.join(', ')}]
|
|
|
412
901
|
* @returns true if route was handled, false otherwise
|
|
413
902
|
*/
|
|
414
903
|
export async function handleRulesRoutes(ctx: RouteContext): Promise<boolean> {
|
|
415
|
-
const { pathname, url, req, res, initialPath, handlePostRequest } = ctx;
|
|
904
|
+
const { pathname, url, req, res, initialPath, handlePostRequest, broadcastToClients } = ctx;
|
|
416
905
|
|
|
417
906
|
// API: Get all rules
|
|
418
907
|
if (pathname === '/api/rules') {
|
|
@@ -443,8 +932,11 @@ export async function handleRulesRoutes(ctx: RouteContext): Promise<boolean> {
|
|
|
443
932
|
if (pathname.startsWith('/api/rules/') && req.method === 'DELETE') {
|
|
444
933
|
const ruleName = decodeURIComponent(pathname.replace('/api/rules/', ''));
|
|
445
934
|
handlePostRequest(req, res, async (body) => {
|
|
446
|
-
const { location, projectPath: projectPathParam } = body;
|
|
447
|
-
|
|
935
|
+
const { location, projectPath: projectPathParam } = body as { location?: unknown; projectPath?: unknown };
|
|
936
|
+
const resolvedLocation = typeof location === 'string' && location.trim().length > 0 ? location : 'project';
|
|
937
|
+
const resolvedProjectPath =
|
|
938
|
+
typeof projectPathParam === 'string' && projectPathParam.trim().length > 0 ? projectPathParam : initialPath;
|
|
939
|
+
return deleteRule(ruleName, resolvedLocation, resolvedProjectPath);
|
|
448
940
|
});
|
|
449
941
|
return true;
|
|
450
942
|
}
|
|
@@ -460,63 +952,90 @@ export async function handleRulesRoutes(ctx: RouteContext): Promise<boolean> {
|
|
|
460
952
|
location,
|
|
461
953
|
subdirectory,
|
|
462
954
|
projectPath: projectPathParam,
|
|
463
|
-
// CLI generation parameters
|
|
464
955
|
generationType,
|
|
465
956
|
description,
|
|
466
957
|
templateType,
|
|
467
958
|
extractScope,
|
|
468
959
|
extractFocus
|
|
469
|
-
} = body
|
|
960
|
+
} = body as {
|
|
961
|
+
mode?: unknown;
|
|
962
|
+
fileName?: unknown;
|
|
963
|
+
content?: unknown;
|
|
964
|
+
paths?: unknown;
|
|
965
|
+
location?: unknown;
|
|
966
|
+
subdirectory?: unknown;
|
|
967
|
+
projectPath?: unknown;
|
|
968
|
+
generationType?: unknown;
|
|
969
|
+
description?: unknown;
|
|
970
|
+
templateType?: unknown;
|
|
971
|
+
extractScope?: unknown;
|
|
972
|
+
extractFocus?: unknown;
|
|
973
|
+
};
|
|
470
974
|
|
|
471
|
-
|
|
975
|
+
const resolvedMode = typeof mode === 'string' ? mode : '';
|
|
976
|
+
const resolvedFileName = typeof fileName === 'string' ? fileName : '';
|
|
977
|
+
const resolvedContent = typeof content === 'string' ? content : '';
|
|
978
|
+
const resolvedLocation = typeof location === 'string' && location.trim().length > 0 ? location : '';
|
|
979
|
+
const resolvedSubdirectory = typeof subdirectory === 'string' ? subdirectory : '';
|
|
980
|
+
const resolvedProjectPath =
|
|
981
|
+
typeof projectPathParam === 'string' && projectPathParam.trim().length > 0 ? projectPathParam : initialPath;
|
|
982
|
+
const resolvedGenerationType = typeof generationType === 'string' ? generationType : '';
|
|
983
|
+
const resolvedDescription = typeof description === 'string' ? description : undefined;
|
|
984
|
+
const resolvedTemplateType = typeof templateType === 'string' ? templateType : undefined;
|
|
985
|
+
const resolvedExtractScope = typeof extractScope === 'string' ? extractScope : undefined;
|
|
986
|
+
const resolvedExtractFocus = typeof extractFocus === 'string' ? extractFocus : undefined;
|
|
987
|
+
const resolvedPaths = Array.isArray(paths) ? paths.filter((p): p is string => typeof p === 'string') : [];
|
|
988
|
+
|
|
989
|
+
if (!resolvedFileName) {
|
|
472
990
|
return { error: 'File name is required' };
|
|
473
991
|
}
|
|
474
992
|
|
|
475
|
-
if (!
|
|
993
|
+
if (!resolvedLocation) {
|
|
476
994
|
return { error: 'Location is required (project or user)' };
|
|
477
995
|
}
|
|
478
996
|
|
|
479
|
-
const projectPath =
|
|
997
|
+
const projectPath = resolvedProjectPath;
|
|
480
998
|
|
|
481
999
|
// CLI generation mode
|
|
482
|
-
if (
|
|
483
|
-
if (!
|
|
1000
|
+
if (resolvedMode === 'cli-generate') {
|
|
1001
|
+
if (!resolvedGenerationType) {
|
|
484
1002
|
return { error: 'generationType is required for CLI generation mode' };
|
|
485
1003
|
}
|
|
486
1004
|
|
|
487
1005
|
// Validate based on generation type
|
|
488
|
-
if (
|
|
1006
|
+
if (resolvedGenerationType === 'description' && !resolvedDescription) {
|
|
489
1007
|
return { error: 'description is required for description-based generation' };
|
|
490
1008
|
}
|
|
491
1009
|
|
|
492
|
-
if (
|
|
1010
|
+
if (resolvedGenerationType === 'template' && !resolvedTemplateType) {
|
|
493
1011
|
return { error: 'templateType is required for template-based generation' };
|
|
494
1012
|
}
|
|
495
1013
|
|
|
496
1014
|
return await generateRuleViaCLI({
|
|
497
|
-
generationType,
|
|
498
|
-
description,
|
|
499
|
-
templateType,
|
|
500
|
-
extractScope,
|
|
501
|
-
extractFocus,
|
|
502
|
-
fileName,
|
|
503
|
-
location,
|
|
504
|
-
subdirectory:
|
|
505
|
-
projectPath
|
|
1015
|
+
generationType: resolvedGenerationType,
|
|
1016
|
+
description: resolvedDescription,
|
|
1017
|
+
templateType: resolvedTemplateType,
|
|
1018
|
+
extractScope: resolvedExtractScope,
|
|
1019
|
+
extractFocus: resolvedExtractFocus,
|
|
1020
|
+
fileName: resolvedFileName,
|
|
1021
|
+
location: resolvedLocation,
|
|
1022
|
+
subdirectory: resolvedSubdirectory || '',
|
|
1023
|
+
projectPath,
|
|
1024
|
+
broadcastToClients
|
|
506
1025
|
});
|
|
507
1026
|
}
|
|
508
1027
|
|
|
509
1028
|
// Manual creation mode
|
|
510
|
-
if (!
|
|
1029
|
+
if (!resolvedContent) {
|
|
511
1030
|
return { error: 'Content is required for manual creation' };
|
|
512
1031
|
}
|
|
513
1032
|
|
|
514
1033
|
return await createRule({
|
|
515
|
-
fileName,
|
|
516
|
-
content,
|
|
517
|
-
paths:
|
|
518
|
-
location,
|
|
519
|
-
subdirectory:
|
|
1034
|
+
fileName: resolvedFileName,
|
|
1035
|
+
content: resolvedContent,
|
|
1036
|
+
paths: resolvedPaths,
|
|
1037
|
+
location: resolvedLocation,
|
|
1038
|
+
subdirectory: resolvedSubdirectory || '',
|
|
520
1039
|
projectPath
|
|
521
1040
|
});
|
|
522
1041
|
});
|