claude-mpm 4.15.2__py3-none-any.whl → 4.20.3__py3-none-any.whl
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.
- claude_mpm/VERSION +1 -1
- claude_mpm/agents/BASE_ENGINEER.md +286 -0
- claude_mpm/agents/BASE_PM.md +255 -23
- claude_mpm/agents/PM_INSTRUCTIONS.md +40 -0
- claude_mpm/agents/agent_loader.py +4 -4
- claude_mpm/agents/templates/agentic-coder-optimizer.json +9 -2
- claude_mpm/agents/templates/api_qa.json +7 -1
- claude_mpm/agents/templates/clerk-ops.json +8 -1
- claude_mpm/agents/templates/code_analyzer.json +4 -1
- claude_mpm/agents/templates/dart_engineer.json +11 -1
- claude_mpm/agents/templates/data_engineer.json +11 -1
- claude_mpm/agents/templates/documentation.json +6 -1
- claude_mpm/agents/templates/engineer.json +18 -1
- claude_mpm/agents/templates/gcp_ops_agent.json +8 -1
- claude_mpm/agents/templates/golang_engineer.json +11 -1
- claude_mpm/agents/templates/java_engineer.json +12 -2
- claude_mpm/agents/templates/local_ops_agent.json +216 -37
- claude_mpm/agents/templates/nextjs_engineer.json +11 -1
- claude_mpm/agents/templates/ops.json +8 -1
- claude_mpm/agents/templates/php-engineer.json +11 -1
- claude_mpm/agents/templates/project_organizer.json +9 -2
- claude_mpm/agents/templates/prompt-engineer.json +5 -1
- claude_mpm/agents/templates/python_engineer.json +19 -4
- claude_mpm/agents/templates/qa.json +7 -1
- claude_mpm/agents/templates/react_engineer.json +11 -1
- claude_mpm/agents/templates/refactoring_engineer.json +8 -1
- claude_mpm/agents/templates/research.json +4 -1
- claude_mpm/agents/templates/ruby-engineer.json +11 -1
- claude_mpm/agents/templates/rust_engineer.json +23 -8
- claude_mpm/agents/templates/security.json +6 -1
- claude_mpm/agents/templates/svelte-engineer.json +225 -0
- claude_mpm/agents/templates/ticketing.json +6 -1
- claude_mpm/agents/templates/typescript_engineer.json +11 -1
- claude_mpm/agents/templates/vercel_ops_agent.json +8 -1
- claude_mpm/agents/templates/version_control.json +8 -1
- claude_mpm/agents/templates/web_qa.json +7 -1
- claude_mpm/agents/templates/web_ui.json +11 -1
- claude_mpm/cli/commands/__init__.py +2 -0
- claude_mpm/cli/commands/configure.py +164 -16
- claude_mpm/cli/commands/configure_agent_display.py +6 -6
- claude_mpm/cli/commands/configure_behavior_manager.py +8 -8
- claude_mpm/cli/commands/configure_navigation.py +20 -18
- claude_mpm/cli/commands/configure_startup_manager.py +14 -14
- claude_mpm/cli/commands/configure_template_editor.py +8 -8
- claude_mpm/cli/commands/mpm_init.py +109 -24
- claude_mpm/cli/commands/skills.py +434 -0
- claude_mpm/cli/executor.py +2 -0
- claude_mpm/cli/interactive/__init__.py +3 -0
- claude_mpm/cli/interactive/skills_wizard.py +491 -0
- claude_mpm/cli/parsers/base_parser.py +7 -0
- claude_mpm/cli/parsers/skills_parser.py +137 -0
- claude_mpm/cli/startup.py +83 -0
- claude_mpm/commands/mpm-auto-configure.md +52 -0
- claude_mpm/commands/mpm-help.md +3 -0
- claude_mpm/commands/mpm-init.md +112 -6
- claude_mpm/commands/mpm-version.md +113 -0
- claude_mpm/commands/mpm.md +1 -0
- claude_mpm/config/agent_config.py +2 -2
- claude_mpm/constants.py +12 -0
- claude_mpm/core/config.py +42 -0
- claude_mpm/core/enums.py +18 -0
- claude_mpm/core/factories.py +1 -1
- claude_mpm/core/optimized_agent_loader.py +3 -3
- claude_mpm/core/types.py +2 -9
- claude_mpm/dashboard/static/js/dashboard.js +0 -14
- claude_mpm/dashboard/templates/index.html +3 -41
- claude_mpm/hooks/__init__.py +8 -0
- claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
- claude_mpm/hooks/session_resume_hook.py +121 -0
- claude_mpm/models/resume_log.py +340 -0
- claude_mpm/services/agents/auto_config_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
- claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
- claude_mpm/services/agents/deployment/agent_validator.py +17 -1
- claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
- claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
- claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
- claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
- claude_mpm/services/agents/local_template_manager.py +1 -1
- claude_mpm/services/agents/recommender.py +47 -0
- claude_mpm/services/cli/resume_service.py +617 -0
- claude_mpm/services/cli/session_manager.py +87 -0
- claude_mpm/services/cli/session_resume_helper.py +352 -0
- claude_mpm/services/core/models/health.py +1 -28
- claude_mpm/services/core/path_resolver.py +1 -1
- claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
- claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
- claude_mpm/services/infrastructure/monitoring/base.py +5 -13
- claude_mpm/services/infrastructure/monitoring/network.py +7 -6
- claude_mpm/services/infrastructure/monitoring/process.py +13 -12
- claude_mpm/services/infrastructure/monitoring/resources.py +7 -6
- claude_mpm/services/infrastructure/monitoring/service.py +16 -15
- claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
- claude_mpm/services/local_ops/__init__.py +1 -1
- claude_mpm/services/local_ops/crash_detector.py +1 -1
- claude_mpm/services/local_ops/health_checks/http_check.py +2 -1
- claude_mpm/services/local_ops/health_checks/process_check.py +2 -1
- claude_mpm/services/local_ops/health_checks/resource_check.py +2 -1
- claude_mpm/services/local_ops/health_manager.py +1 -1
- claude_mpm/services/local_ops/restart_manager.py +1 -1
- claude_mpm/services/mcp_config_manager.py +7 -131
- claude_mpm/services/session_manager.py +205 -1
- claude_mpm/services/shared/async_service_base.py +16 -27
- claude_mpm/services/shared/lifecycle_service_base.py +1 -14
- claude_mpm/services/socketio/handlers/__init__.py +5 -2
- claude_mpm/services/socketio/handlers/hook.py +10 -0
- claude_mpm/services/socketio/handlers/registry.py +4 -2
- claude_mpm/services/socketio/server/main.py +7 -7
- claude_mpm/services/unified/deployment_strategies/local.py +1 -1
- claude_mpm/services/version_service.py +104 -1
- claude_mpm/skills/__init__.py +42 -0
- claude_mpm/skills/agent_skills_injector.py +331 -0
- claude_mpm/skills/bundled/LICENSE_ATTRIBUTIONS.md +79 -0
- claude_mpm/skills/bundled/__init__.py +6 -0
- claude_mpm/skills/bundled/api-documentation.md +393 -0
- claude_mpm/skills/bundled/async-testing.md +571 -0
- claude_mpm/skills/bundled/code-review.md +143 -0
- claude_mpm/skills/bundled/collaboration/brainstorming/SKILL.md +75 -0
- claude_mpm/skills/bundled/collaboration/dispatching-parallel-agents/SKILL.md +184 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/SKILL.md +107 -0
- claude_mpm/skills/bundled/collaboration/requesting-code-review/code-reviewer.md +146 -0
- claude_mpm/skills/bundled/collaboration/writing-plans/SKILL.md +118 -0
- claude_mpm/skills/bundled/database-migration.md +199 -0
- claude_mpm/skills/bundled/debugging/root-cause-tracing/SKILL.md +177 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/CREATION-LOG.md +119 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/SKILL.md +148 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/anti-patterns.md +483 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/examples.md +452 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/troubleshooting.md +449 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/references/workflow.md +411 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-academic.md +14 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-1.md +58 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-2.md +68 -0
- claude_mpm/skills/bundled/debugging/systematic-debugging/test-pressure-3.md +69 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/SKILL.md +175 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/common-failures.md +213 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/gate-function.md +314 -0
- claude_mpm/skills/bundled/debugging/verification-before-completion/references/verification-patterns.md +227 -0
- claude_mpm/skills/bundled/docker-containerization.md +194 -0
- claude_mpm/skills/bundled/express-local-dev.md +1429 -0
- claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
- claude_mpm/skills/bundled/git-workflow.md +414 -0
- claude_mpm/skills/bundled/imagemagick.md +204 -0
- claude_mpm/skills/bundled/json-data-handling.md +223 -0
- claude_mpm/skills/bundled/main/artifacts-builder/SKILL.md +74 -0
- claude_mpm/skills/bundled/main/internal-comms/SKILL.md +32 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/3p-updates.md +47 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/company-newsletter.md +65 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/faq-answers.md +30 -0
- claude_mpm/skills/bundled/main/internal-comms/examples/general-comms.md +16 -0
- claude_mpm/skills/bundled/main/mcp-builder/SKILL.md +328 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/evaluation.md +602 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/mcp_best_practices.md +915 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/node_mcp_server.md +916 -0
- claude_mpm/skills/bundled/main/mcp-builder/reference/python_mcp_server.md +752 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/connections.py +150 -0
- claude_mpm/skills/bundled/main/mcp-builder/scripts/evaluation.py +372 -0
- claude_mpm/skills/bundled/main/skill-creator/SKILL.md +209 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/init_skill.py +302 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/package_skill.py +111 -0
- claude_mpm/skills/bundled/main/skill-creator/scripts/quick_validate.py +65 -0
- claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
- claude_mpm/skills/bundled/pdf.md +141 -0
- claude_mpm/skills/bundled/performance-profiling.md +567 -0
- claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
- claude_mpm/skills/bundled/security-scanning.md +327 -0
- claude_mpm/skills/bundled/systematic-debugging.md +473 -0
- claude_mpm/skills/bundled/test-driven-development.md +378 -0
- claude_mpm/skills/bundled/testing/condition-based-waiting/SKILL.md +123 -0
- claude_mpm/skills/bundled/testing/test-driven-development/SKILL.md +145 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/anti-patterns.md +543 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/examples.md +741 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/integration.md +470 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/philosophy.md +458 -0
- claude_mpm/skills/bundled/testing/test-driven-development/references/workflow.md +639 -0
- claude_mpm/skills/bundled/testing/testing-anti-patterns/SKILL.md +304 -0
- claude_mpm/skills/bundled/testing/webapp-testing/SKILL.md +96 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/console_logging.py +35 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/element_discovery.py +40 -0
- claude_mpm/skills/bundled/testing/webapp-testing/examples/static_html_automation.py +34 -0
- claude_mpm/skills/bundled/testing/webapp-testing/scripts/with_server.py +107 -0
- claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
- claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
- claude_mpm/skills/bundled/xlsx.md +157 -0
- claude_mpm/skills/registry.py +286 -0
- claude_mpm/skills/skill_manager.py +310 -0
- claude_mpm/skills/skills_registry.py +351 -0
- claude_mpm/skills/skills_service.py +730 -0
- claude_mpm/utils/agent_dependency_loader.py +2 -2
- {claude_mpm-4.15.2.dist-info → claude_mpm-4.20.3.dist-info}/METADATA +211 -33
- {claude_mpm-4.15.2.dist-info → claude_mpm-4.20.3.dist-info}/RECORD +195 -115
- claude_mpm/agents/INSTRUCTIONS_OLD_DEPRECATED.md +0 -602
- claude_mpm/dashboard/static/css/code-tree.css +0 -1639
- claude_mpm/dashboard/static/js/components/code-tree/tree-breadcrumb.js +0 -353
- claude_mpm/dashboard/static/js/components/code-tree/tree-constants.js +0 -235
- claude_mpm/dashboard/static/js/components/code-tree/tree-search.js +0 -409
- claude_mpm/dashboard/static/js/components/code-tree/tree-utils.js +0 -435
- claude_mpm/dashboard/static/js/components/code-tree.js +0 -5869
- claude_mpm/dashboard/static/js/components/code-viewer.js +0 -1386
- {claude_mpm-4.15.2.dist-info → claude_mpm-4.20.3.dist-info}/WHEEL +0 -0
- {claude_mpm-4.15.2.dist-info → claude_mpm-4.20.3.dist-info}/entry_points.txt +0 -0
- {claude_mpm-4.15.2.dist-info → claude_mpm-4.20.3.dist-info}/licenses/LICENSE +0 -0
- {claude_mpm-4.15.2.dist-info → claude_mpm-4.20.3.dist-info}/top_level.txt +0 -0
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "Svelte Engineer",
|
|
3
|
+
"description": "Specialized agent for modern Svelte 5 (Runes API) and SvelteKit development. Expert in reactive state management with $state, $derived, $effect, and $props. Provides production-ready code following Svelte 5 best practices with TypeScript integration. Supports legacy Svelte 4 patterns when needed.",
|
|
4
|
+
"schema_version": "1.3.0",
|
|
5
|
+
"agent_id": "svelte_engineer",
|
|
6
|
+
"agent_version": "1.1.0",
|
|
7
|
+
"template_version": "1.1.0",
|
|
8
|
+
"template_changelog": [
|
|
9
|
+
{
|
|
10
|
+
"version": "1.1.0",
|
|
11
|
+
"date": "2025-10-30",
|
|
12
|
+
"description": "Optimized for Svelte 5 as primary approach. Runes API prioritized over Svelte 4 patterns. Added Svelte 5 specific patterns and best practices. Enhanced TypeScript integration examples."
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
"version": "1.0.0",
|
|
16
|
+
"date": "2025-10-30",
|
|
17
|
+
"description": "Initial Svelte Engineer agent creation with Svelte 4/5, SvelteKit, Runes, and modern patterns"
|
|
18
|
+
}
|
|
19
|
+
],
|
|
20
|
+
"agent_type": "engineer",
|
|
21
|
+
"metadata": {
|
|
22
|
+
"name": "Svelte Engineer",
|
|
23
|
+
"description": "Specialized agent for modern Svelte 5 (Runes API) and SvelteKit development. Expert in reactive state management with $state, $derived, $effect, and $props. Provides production-ready code following Svelte 5 best practices with TypeScript integration. Supports legacy Svelte 4 patterns when needed.",
|
|
24
|
+
"category": "engineering",
|
|
25
|
+
"tags": [
|
|
26
|
+
"svelte",
|
|
27
|
+
"svelte5",
|
|
28
|
+
"sveltekit",
|
|
29
|
+
"runes",
|
|
30
|
+
"reactivity",
|
|
31
|
+
"ssr",
|
|
32
|
+
"vite",
|
|
33
|
+
"typescript",
|
|
34
|
+
"performance",
|
|
35
|
+
"web-components"
|
|
36
|
+
],
|
|
37
|
+
"author": "Claude MPM Team",
|
|
38
|
+
"created_at": "2025-10-30T00:00:00.000000Z",
|
|
39
|
+
"updated_at": "2025-10-30T00:00:00.000000Z",
|
|
40
|
+
"color": "orange"
|
|
41
|
+
},
|
|
42
|
+
"capabilities": {
|
|
43
|
+
"model": "sonnet",
|
|
44
|
+
"tools": [
|
|
45
|
+
"Read",
|
|
46
|
+
"Write",
|
|
47
|
+
"Edit",
|
|
48
|
+
"MultiEdit",
|
|
49
|
+
"Bash",
|
|
50
|
+
"Grep",
|
|
51
|
+
"Glob",
|
|
52
|
+
"WebSearch",
|
|
53
|
+
"TodoWrite"
|
|
54
|
+
],
|
|
55
|
+
"resource_tier": "standard",
|
|
56
|
+
"max_tokens": 4096,
|
|
57
|
+
"temperature": 0.2,
|
|
58
|
+
"timeout": 900,
|
|
59
|
+
"memory_limit": 2048,
|
|
60
|
+
"cpu_limit": 50,
|
|
61
|
+
"network_access": true,
|
|
62
|
+
"file_access": {
|
|
63
|
+
"read_paths": [
|
|
64
|
+
"./"
|
|
65
|
+
],
|
|
66
|
+
"write_paths": [
|
|
67
|
+
"./"
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
"instructions": "# Svelte Engineer\n\n## Identity & Expertise\nModern Svelte 5 specialist delivering production-ready web applications with Runes API, SvelteKit framework, SSR/SSG, and exceptional performance. Expert in fine-grained reactive state management using $state, $derived, $effect, and $props. Provides truly reactive UI with minimal JavaScript and optimal Core Web Vitals.\n\n## Search-First Workflow (MANDATORY)\n\n**When to Search**:\n- Svelte 5 Runes API patterns and best practices\n- Migration strategies from Svelte 4 to Svelte 5\n- SvelteKit routing and load functions\n- SSR/SSG/CSR rendering modes\n- Form actions and progressive enhancement\n- Runes-based state management patterns\n- TypeScript integration with Svelte 5\n- Adapter configuration (Vercel, Node, Static)\n\n**Search Template**: \"Svelte 5 [feature] best practices 2025\" or \"SvelteKit [pattern] implementation\"\n\n**Validation Process**:\n1. Check official Svelte and SvelteKit documentation\n2. Verify with Svelte team examples and tutorials\n3. Cross-reference with community patterns (Svelte Society)\n4. Test with actual performance measurements\n\n## Core Expertise - Svelte 5 (PRIMARY)\n\n**Runes API - Modern Reactive State:**\n- **$state()**: Fine-grained reactive state management with automatic dependency tracking\n- **$derived()**: Computed values with automatic updates based on dependencies\n- **$effect()**: Side effects with automatic cleanup and batching, replaces onMount for effects\n- **$props()**: Type-safe component props with destructuring support\n- **$bindable()**: Two-way binding with parent components, replaces bind:prop\n- **$inspect()**: Development-time reactive debugging tool\n\n**Svelte 5 Advantages:**\n- Finer-grained reactivity (better performance than Svelte 4)\n- Explicit state declarations (clearer intent and maintainability)\n- Superior TypeScript integration with inference\n- Simplified component API (less magic, more predictable)\n- Improved server-side rendering performance\n- Signals-based architecture (predictable, composable)\n\n**When to Use Svelte 5 Runes:**\n- ALL new projects (default choice for 2025)\n- Modern applications requiring optimal performance\n- TypeScript-first projects needing strong type inference\n- Complex state management with computed values\n- Applications with fine-grained reactivity needs\n- Any project starting after Svelte 5 stable release\n\n## Svelte 5 Best Practices (PRIMARY)\n\n**State Management:**\n\u2705 Use `$state()` for local component state\n\u2705 Use `$derived()` for computed values (replaces `$:`)\n\u2705 Use `$effect()` for side effects (replaces `$:` and onMount for side effects)\n\u2705 Create custom stores with Runes for global state\n\n**Component API:**\n\u2705 Use `$props()` for type-safe props\n\u2705 Use `$bindable()` for two-way binding\n\u2705 Destructure props directly: `let { name, age } = $props()`\n\u2705 Provide defaults: `let { theme = 'light' } = $props()`\n\n**Performance:**\n\u2705 Runes provide fine-grained reactivity automatically\n\u2705 No need for manual optimization in most cases\n\u2705 Use `$effect` cleanup functions for subscriptions\n\u2705 Avoid unnecessary derived calculations\n\n**Migration from Svelte 4:**\n- `$: derived = ...` \u2192 `let derived = $derived(...)`\n- `$: { sideEffect(); }` \u2192 `$effect(() => { sideEffect(); })`\n- `export let prop` \u2192 `let { prop } = $props()`\n- Stores still work but consider Runes-based alternatives\n\n## Migrating to Svelte 5 from Svelte 4\n\n**When you encounter Svelte 4 code, proactively suggest Svelte 5 equivalents:**\n\n| Svelte 4 Pattern | Svelte 5 Equivalent | Benefit |\n|------------------|---------------------|---------|\n| `export let prop` | `let { prop } = $props()` | Type safety, destructuring |\n| `$: derived = compute(x)` | `let derived = $derived(compute(x))` | Explicit, clearer intent |\n| `$: { sideEffect(); }` | `$effect(() => { sideEffect(); })` | Explicit dependencies, cleanup |\n| `let x = writable(0)` | `let x = $state(0)` | Simpler, fine-grained reactivity |\n| `$x = 5` | `x = 5` | No store syntax needed |\n\n**Migration Strategy:**\n1. Start with new components using Svelte 5 Runes\n2. Gradually migrate existing components as you touch them\n3. Svelte 4 and 5 can coexist in the same project\n4. Prioritize high-traffic components for migration\n\n### Legacy Svelte 4 Support (When Needed)\n- **Reactive declarations**: $: label syntax (replaced by $derived)\n- **Stores**: writable, readable, derived, custom stores (still valid but consider Runes)\n- **Component lifecycle**: onMount, onDestroy, beforeUpdate, afterUpdate\n- **Two-way binding**: bind:value, bind:this patterns (still valid)\n- **Context API**: setContext, getContext for dependency injection\n- **Note**: Use only for maintaining existing Svelte 4 codebases\n\n### SvelteKit Framework\n- **File-based routing**: +page.svelte, +layout.svelte, +error.svelte\n- **Load functions**: +page.js (universal), +page.server.js (server-only)\n- **Form actions**: Progressive enhancement with +page.server.js actions\n- **Hooks**: handle, handleError, handleFetch for request interception\n- **Environment variables**: $env/static/private, $env/static/public, $env/dynamic/*\n- **Adapters**: Deployment to Vercel, Node, static hosts, Cloudflare\n- **API routes**: +server.js for REST/GraphQL endpoints\n\n### Advanced Features\n- **Actions**: use:action directive for element behaviors\n- **Transitions**: fade, slide, scale with custom easing\n- **Animations**: animate:flip, crossfade for smooth UI\n- **Slots**: Named slots, slot props, $$slots inspection\n- **Special elements**: <svelte:component>, <svelte:element>, <svelte:window>\n- **Preprocessors**: TypeScript, SCSS, PostCSS integration\n\n## Quality Standards\n\n**Type Safety**: TypeScript strict mode, typed props with Svelte 5 $props, runtime validation with Zod\n\n**Testing**: Vitest for unit tests, Playwright for E2E, @testing-library/svelte, 90%+ coverage\n\n**Performance**:\n- LCP < 2.5s (Largest Contentful Paint)\n- FID < 100ms (First Input Delay)\n- CLS < 0.1 (Cumulative Layout Shift)\n- Minimal JavaScript bundle (Svelte compiles to vanilla JS)\n- SSR/SSG for instant first paint\n\n**Accessibility**:\n- Semantic HTML and ARIA attributes\n- a11y warnings enabled (svelte.config.js)\n- Keyboard navigation and focus management\n- Screen reader testing\n\n## Production Patterns - Svelte 5 First\n\n### Pattern 1: Svelte 5 Runes Component (PRIMARY)\n\n```svelte\n<script lang=\"ts\">\n import type { User } from '$lib/types'\n\n let { user, onUpdate }: { user: User; onUpdate: (u: User) => void } = $props()\n\n let count = $state(0)\n let doubled = $derived(count * 2)\n let userName = $derived(user.firstName + ' ' + user.lastName)\n\n $effect(() => {\n console.log(`Count changed to ${count}`)\n return () => console.log('Cleanup')\n })\n\n function increment() {\n count += 1\n }\n</script>\n\n<div>\n <h1>Welcome, {userName}</h1>\n <p>Count: {count}, Doubled: {doubled}</p>\n <button onclick={increment}>Increment</button>\n</div>\n```\n\n### Pattern 2: Svelte 5 Form with Validation\n\n```svelte\n<script lang=\"ts\">\n interface FormData {\n email: string;\n password: string;\n }\n\n let { onSubmit } = $props<{ onSubmit: (data: FormData) => void }>();\n\n let email = $state('');\n let password = $state('');\n let touched = $state({ email: false, password: false });\n\n let emailError = $derived(\n touched.email && !email.includes('@') ? 'Invalid email' : null\n );\n let passwordError = $derived(\n touched.password && password.length < 8 ? 'Min 8 characters' : null\n );\n let isValid = $derived(!emailError && !passwordError && email && password);\n\n function handleSubmit() {\n if (isValid) {\n onSubmit({ email, password });\n }\n }\n</script>\n\n<form on:submit|preventDefault={handleSubmit}>\n <input\n bind:value={email}\n type=\"email\"\n on:blur={() => touched.email = true}\n />\n {#if emailError}<span>{emailError}</span>{/if}\n\n <input\n bind:value={password}\n type=\"password\"\n on:blur={() => touched.password = true}\n />\n {#if passwordError}<span>{passwordError}</span>{/if}\n\n <button disabled={!isValid}>Submit</button>\n</form>\n```\n\n### Pattern 3: Svelte 5 Data Fetching\n\n```svelte\n<script lang=\"ts\">\n import { onMount } from 'svelte';\n\n interface User {\n id: number;\n name: string;\n }\n\n let data = $state<User | null>(null);\n let loading = $state(true);\n let error = $state<string | null>(null);\n\n async function fetchData() {\n try {\n const response = await fetch('/api/user');\n data = await response.json();\n } catch (e) {\n error = e instanceof Error ? e.message : 'Unknown error';\n } finally {\n loading = false;\n }\n }\n\n onMount(fetchData);\n\n let displayName = $derived(data?.name ?? 'Anonymous');\n</script>\n\n{#if loading}\n <p>Loading...</p>\n{:else if error}\n <p>Error: {error}</p>\n{:else if data}\n <p>Welcome, {displayName}!</p>\n{/if}\n```\n\n### Pattern 4: Svelte 5 Custom Store (Runes-based)\n\n```typescript\n// lib/stores/counter.svelte.ts\nfunction createCounter(initialValue = 0) {\n let count = $state(initialValue);\n let doubled = $derived(count * 2);\n\n return {\n get count() { return count; },\n get doubled() { return doubled; },\n increment: () => count++,\n decrement: () => count--,\n reset: () => count = initialValue\n };\n}\n\nexport const counter = createCounter();\n```\n\n### Pattern 5: Svelte 5 Bindable Props\n\n```svelte\n<!-- Child: SearchInput.svelte -->\n<script lang=\"ts\">\n let { value = $bindable('') } = $props<{ value: string }>();\n</script>\n\n<input bind:value type=\"search\" />\n```\n\n```svelte\n<!-- Parent -->\n<script lang=\"ts\">\n import SearchInput from './SearchInput.svelte';\n let searchTerm = $state('');\n let results = $derived(searchTerm ? performSearch(searchTerm) : []);\n</script>\n\n<SearchInput bind:value={searchTerm} />\n<p>Found {results.length} results</p>\n```\n\n### Pattern 6: SvelteKit Page with Load\n\n```typescript\n// +page.server.ts\nexport const load = async ({ params }) => {\n const product = await fetchProduct(params.id);\n return { product };\n}\n```\n\n```svelte\n<!-- +page.svelte -->\n<script lang=\"ts\">\n let { data } = $props();\n</script>\n\n<h1>{data.product.name}</h1>\n```\n\n### Pattern 7: Form Actions (SvelteKit)\n\n```typescript\n// +page.server.ts\nimport { z } from 'zod';\n\nconst schema = z.object({\n email: z.string().email(),\n password: z.string().min(8)\n});\n\nexport const actions = {\n default: async ({ request }) => {\n const data = Object.fromEntries(await request.formData());\n const result = schema.safeParse(data);\n if (!result.success) {\n return fail(400, { errors: result.error });\n }\n // Process login\n }\n};\n```\n\n## Anti-Patterns to Avoid\n\n\u274c **Mixing Svelte 4 and 5 Patterns**: Using $: with Runes\n\u2705 **Instead**: Use Svelte 5 Runes consistently\n\n\u274c **Overusing Stores**: Using stores for component-local state\n\u2705 **Instead**: Use $state for local, stores for global\n\n\u274c **Client-only Data Fetching**: onMount + fetch\n\u2705 **Instead**: SvelteKit load functions\n\n\u274c **Missing Validation**: Accepting form data without validation\n\u2705 **Instead**: Zod schemas with proper error handling\n\n## Resources\n\n- Svelte 5 Docs: https://svelte.dev/docs\n- SvelteKit Docs: https://kit.svelte.dev/docs\n- Runes API: https://svelte-5-preview.vercel.app/docs/runes\n\nAlways prioritize Svelte 5 Runes for new projects.",
|
|
72
|
+
"knowledge": {
|
|
73
|
+
"domain_expertise": [
|
|
74
|
+
"Svelte 5 Runes API ($state, $derived, $effect, $props, $bindable)",
|
|
75
|
+
"Svelte 5 migration patterns and best practices",
|
|
76
|
+
"SvelteKit routing and load functions",
|
|
77
|
+
"SSR/SSG/CSR rendering modes",
|
|
78
|
+
"Form actions and progressive enhancement",
|
|
79
|
+
"Component actions and transitions",
|
|
80
|
+
"TypeScript integration with Svelte 5",
|
|
81
|
+
"Vite build optimization",
|
|
82
|
+
"Adapter configuration and deployment",
|
|
83
|
+
"Legacy Svelte 4 support when needed"
|
|
84
|
+
],
|
|
85
|
+
"best_practices": [
|
|
86
|
+
"Search-first for Svelte 5 and SvelteKit features",
|
|
87
|
+
"Use Runes for ALL new Svelte 5 projects",
|
|
88
|
+
"Implement SSR with load functions",
|
|
89
|
+
"Progressive enhancement with form actions",
|
|
90
|
+
"Type-safe props with $props()",
|
|
91
|
+
"Stores for global state only",
|
|
92
|
+
"Component actions for reusable behaviors",
|
|
93
|
+
"Accessibility with semantic HTML",
|
|
94
|
+
"Performance optimization with minimal JS"
|
|
95
|
+
],
|
|
96
|
+
"constraints": [
|
|
97
|
+
"MUST use WebSearch for medium-complex problems",
|
|
98
|
+
"MUST use Svelte 5 Runes for new projects",
|
|
99
|
+
"MUST implement progressive enhancement",
|
|
100
|
+
"MUST use TypeScript strict mode",
|
|
101
|
+
"SHOULD implement SSR with load functions",
|
|
102
|
+
"SHOULD use Zod for form validation",
|
|
103
|
+
"SHOULD meet Core Web Vitals targets",
|
|
104
|
+
"MUST test with Vitest and Playwright"
|
|
105
|
+
],
|
|
106
|
+
"examples": [
|
|
107
|
+
{
|
|
108
|
+
"scenario": "Building dashboard with real-time data",
|
|
109
|
+
"approach": "Svelte 5 Runes for state, SvelteKit load for SSR, Runes-based stores for WebSocket"
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"scenario": "User authentication flow",
|
|
113
|
+
"approach": "Form actions with Zod validation, Svelte 5 state management"
|
|
114
|
+
}
|
|
115
|
+
]
|
|
116
|
+
},
|
|
117
|
+
"interactions": {
|
|
118
|
+
"input_format": {
|
|
119
|
+
"required_fields": [
|
|
120
|
+
"task"
|
|
121
|
+
],
|
|
122
|
+
"optional_fields": [
|
|
123
|
+
"svelte_version",
|
|
124
|
+
"performance_requirements"
|
|
125
|
+
]
|
|
126
|
+
},
|
|
127
|
+
"output_format": {
|
|
128
|
+
"structure": "markdown",
|
|
129
|
+
"includes": [
|
|
130
|
+
"component_design",
|
|
131
|
+
"implementation_code",
|
|
132
|
+
"routing_structure",
|
|
133
|
+
"testing_strategy"
|
|
134
|
+
]
|
|
135
|
+
},
|
|
136
|
+
"handoff_agents": [
|
|
137
|
+
"typescript_engineer",
|
|
138
|
+
"web-qa"
|
|
139
|
+
],
|
|
140
|
+
"triggers": [
|
|
141
|
+
"svelte development",
|
|
142
|
+
"sveltekit",
|
|
143
|
+
"svelte5",
|
|
144
|
+
"runes",
|
|
145
|
+
"ssr"
|
|
146
|
+
]
|
|
147
|
+
},
|
|
148
|
+
"testing": {
|
|
149
|
+
"test_cases": [
|
|
150
|
+
{
|
|
151
|
+
"name": "Svelte 5 component with Runes",
|
|
152
|
+
"input": "Create user profile component",
|
|
153
|
+
"expected_behavior": "Implements Runes, type-safe props",
|
|
154
|
+
"validation_criteria": [
|
|
155
|
+
"implements_runes",
|
|
156
|
+
"type_safe_props",
|
|
157
|
+
"component_tests"
|
|
158
|
+
]
|
|
159
|
+
}
|
|
160
|
+
],
|
|
161
|
+
"performance_benchmarks": {
|
|
162
|
+
"response_time": 300,
|
|
163
|
+
"token_usage": 4096,
|
|
164
|
+
"success_rate": 0.95
|
|
165
|
+
}
|
|
166
|
+
},
|
|
167
|
+
"memory_routing": {
|
|
168
|
+
"description": "Stores Svelte 5 patterns, Runes usage, and performance optimizations",
|
|
169
|
+
"categories": [
|
|
170
|
+
"Svelte 5 Runes patterns and usage",
|
|
171
|
+
"SvelteKit routing and load functions",
|
|
172
|
+
"Form actions and progressive enhancement"
|
|
173
|
+
],
|
|
174
|
+
"keywords": [
|
|
175
|
+
"svelte",
|
|
176
|
+
"svelte5",
|
|
177
|
+
"svelte-5",
|
|
178
|
+
"sveltekit",
|
|
179
|
+
"runes",
|
|
180
|
+
"runes-api",
|
|
181
|
+
"$state",
|
|
182
|
+
"$derived",
|
|
183
|
+
"$effect",
|
|
184
|
+
"$props",
|
|
185
|
+
"$bindable",
|
|
186
|
+
"$inspect",
|
|
187
|
+
"reactive",
|
|
188
|
+
"+page",
|
|
189
|
+
"+layout",
|
|
190
|
+
"+server",
|
|
191
|
+
"form-actions",
|
|
192
|
+
"progressive-enhancement",
|
|
193
|
+
"ssr",
|
|
194
|
+
"ssg",
|
|
195
|
+
"csr",
|
|
196
|
+
"prerender"
|
|
197
|
+
],
|
|
198
|
+
"paths": [
|
|
199
|
+
"src/routes/",
|
|
200
|
+
"src/lib/",
|
|
201
|
+
"svelte.config.js"
|
|
202
|
+
],
|
|
203
|
+
"extensions": [
|
|
204
|
+
".svelte",
|
|
205
|
+
".ts",
|
|
206
|
+
".js",
|
|
207
|
+
".server.ts"
|
|
208
|
+
]
|
|
209
|
+
},
|
|
210
|
+
"dependencies": {
|
|
211
|
+
"python": [],
|
|
212
|
+
"system": [
|
|
213
|
+
"node>=20",
|
|
214
|
+
"npm>=10"
|
|
215
|
+
],
|
|
216
|
+
"optional": false
|
|
217
|
+
},
|
|
218
|
+
"skills": [
|
|
219
|
+
"test-driven-development",
|
|
220
|
+
"systematic-debugging",
|
|
221
|
+
"performance-profiling",
|
|
222
|
+
"code-review",
|
|
223
|
+
"vite-local-dev"
|
|
224
|
+
]
|
|
225
|
+
}
|
|
@@ -271,5 +271,15 @@
|
|
|
271
271
|
"npm>=10"
|
|
272
272
|
],
|
|
273
273
|
"optional": false
|
|
274
|
-
}
|
|
274
|
+
},
|
|
275
|
+
"skills": [
|
|
276
|
+
"test-driven-development",
|
|
277
|
+
"systematic-debugging",
|
|
278
|
+
"async-testing",
|
|
279
|
+
"performance-profiling",
|
|
280
|
+
"security-scanning",
|
|
281
|
+
"code-review",
|
|
282
|
+
"refactoring-patterns",
|
|
283
|
+
"git-workflow"
|
|
284
|
+
]
|
|
275
285
|
}
|
|
@@ -401,5 +401,12 @@
|
|
|
401
401
|
"environment": "https://api.vercel.com/v10/projects/{projectId}/env",
|
|
402
402
|
"teams": "https://api.vercel.com/v2/teams"
|
|
403
403
|
}
|
|
404
|
-
}
|
|
404
|
+
},
|
|
405
|
+
"skills": [
|
|
406
|
+
"docker-containerization",
|
|
407
|
+
"database-migration",
|
|
408
|
+
"security-scanning",
|
|
409
|
+
"git-workflow",
|
|
410
|
+
"systematic-debugging"
|
|
411
|
+
]
|
|
405
412
|
}
|
|
@@ -175,5 +175,15 @@
|
|
|
175
175
|
"token_usage": 10240,
|
|
176
176
|
"success_rate": 0.95
|
|
177
177
|
}
|
|
178
|
-
}
|
|
178
|
+
},
|
|
179
|
+
"skills": [
|
|
180
|
+
"test-driven-development",
|
|
181
|
+
"systematic-debugging",
|
|
182
|
+
"async-testing",
|
|
183
|
+
"performance-profiling",
|
|
184
|
+
"security-scanning",
|
|
185
|
+
"code-review",
|
|
186
|
+
"refactoring-patterns",
|
|
187
|
+
"git-workflow"
|
|
188
|
+
]
|
|
179
189
|
}
|
|
@@ -20,6 +20,7 @@ from .mcp import manage_mcp
|
|
|
20
20
|
from .memory import manage_memory
|
|
21
21
|
from .monitor import manage_monitor
|
|
22
22
|
from .run import run_session
|
|
23
|
+
from .skills import manage_skills
|
|
23
24
|
from .tickets import list_tickets, manage_tickets
|
|
24
25
|
|
|
25
26
|
__all__ = [
|
|
@@ -36,6 +37,7 @@ __all__ = [
|
|
|
36
37
|
"manage_mcp",
|
|
37
38
|
"manage_memory",
|
|
38
39
|
"manage_monitor",
|
|
40
|
+
"manage_skills",
|
|
39
41
|
# 'run_guarded_session', # Excluded from default exports (experimental)
|
|
40
42
|
"manage_tickets",
|
|
41
43
|
"run_doctor",
|
|
@@ -211,19 +211,21 @@ class ConfigureCommand(BaseCommand):
|
|
|
211
211
|
if choice == "1":
|
|
212
212
|
self._manage_agents()
|
|
213
213
|
elif choice == "2":
|
|
214
|
-
self.
|
|
214
|
+
self._manage_skills()
|
|
215
215
|
elif choice == "3":
|
|
216
|
-
self.
|
|
216
|
+
self._edit_templates()
|
|
217
217
|
elif choice == "4":
|
|
218
|
+
self._manage_behaviors()
|
|
219
|
+
elif choice == "5":
|
|
218
220
|
# If user saves and wants to proceed to startup, exit the configurator
|
|
219
221
|
if self._manage_startup_configuration():
|
|
220
222
|
self.console.print(
|
|
221
223
|
"\n[green]Configuration saved. Exiting configurator...[/green]"
|
|
222
224
|
)
|
|
223
225
|
break
|
|
224
|
-
elif choice == "5":
|
|
225
|
-
self._switch_scope()
|
|
226
226
|
elif choice == "6":
|
|
227
|
+
self._switch_scope()
|
|
228
|
+
elif choice == "7":
|
|
227
229
|
self._show_version_info_interactive()
|
|
228
230
|
elif choice == "l":
|
|
229
231
|
# Check for pending agent changes
|
|
@@ -296,33 +298,33 @@ class ConfigureCommand(BaseCommand):
|
|
|
296
298
|
|
|
297
299
|
# Use Text objects to properly display shortcuts with styling
|
|
298
300
|
text_t = Text(" ")
|
|
299
|
-
text_t.append("[t]", style="
|
|
301
|
+
text_t.append("[t]", style="bold blue")
|
|
300
302
|
text_t.append(" Toggle agents (enable/disable multiple)")
|
|
301
303
|
self.console.print(text_t)
|
|
302
304
|
|
|
303
305
|
text_c = Text(" ")
|
|
304
|
-
text_c.append("[c]", style="
|
|
306
|
+
text_c.append("[c]", style="bold blue")
|
|
305
307
|
text_c.append(" Customize agent template")
|
|
306
308
|
self.console.print(text_c)
|
|
307
309
|
|
|
308
310
|
text_v = Text(" ")
|
|
309
|
-
text_v.append("[v]", style="
|
|
311
|
+
text_v.append("[v]", style="bold blue")
|
|
310
312
|
text_v.append(" View agent details")
|
|
311
313
|
self.console.print(text_v)
|
|
312
314
|
|
|
313
315
|
text_r = Text(" ")
|
|
314
|
-
text_r.append("[r]", style="
|
|
316
|
+
text_r.append("[r]", style="bold blue")
|
|
315
317
|
text_r.append(" Reset agent to defaults")
|
|
316
318
|
self.console.print(text_r)
|
|
317
319
|
|
|
318
320
|
text_b = Text(" ")
|
|
319
|
-
text_b.append("[b]", style="
|
|
321
|
+
text_b.append("[b]", style="bold blue")
|
|
320
322
|
text_b.append(" Back to main menu")
|
|
321
323
|
self.console.print(text_b)
|
|
322
324
|
|
|
323
325
|
self.console.print()
|
|
324
326
|
|
|
325
|
-
choice = Prompt.ask("[bold
|
|
327
|
+
choice = Prompt.ask("[bold blue]Select an option[/bold blue]", default="b")
|
|
326
328
|
|
|
327
329
|
if choice == "b":
|
|
328
330
|
break
|
|
@@ -361,32 +363,32 @@ class ConfigureCommand(BaseCommand):
|
|
|
361
363
|
# Show menu
|
|
362
364
|
self.console.print("\n[bold]Toggle Agent Status:[/bold]")
|
|
363
365
|
text_toggle = Text(" ")
|
|
364
|
-
text_toggle.append("[t]", style="
|
|
366
|
+
text_toggle.append("[t]", style="bold blue")
|
|
365
367
|
text_toggle.append(" Enter agent IDs to toggle (e.g., '1,3,5' or '1-4')")
|
|
366
368
|
self.console.print(text_toggle)
|
|
367
369
|
|
|
368
370
|
text_all = Text(" ")
|
|
369
|
-
text_all.append("[a]", style="
|
|
371
|
+
text_all.append("[a]", style="bold blue")
|
|
370
372
|
text_all.append(" Enable all agents")
|
|
371
373
|
self.console.print(text_all)
|
|
372
374
|
|
|
373
375
|
text_none = Text(" ")
|
|
374
|
-
text_none.append("[n]", style="
|
|
376
|
+
text_none.append("[n]", style="bold blue")
|
|
375
377
|
text_none.append(" Disable all agents")
|
|
376
378
|
self.console.print(text_none)
|
|
377
379
|
|
|
378
380
|
text_save = Text(" ")
|
|
379
|
-
text_save.append("[s]", style="green
|
|
381
|
+
text_save.append("[s]", style="bold green")
|
|
380
382
|
text_save.append(" Save changes and return")
|
|
381
383
|
self.console.print(text_save)
|
|
382
384
|
|
|
383
385
|
text_cancel = Text(" ")
|
|
384
|
-
text_cancel.append("[c]", style="
|
|
386
|
+
text_cancel.append("[c]", style="bold magenta")
|
|
385
387
|
text_cancel.append(" Cancel (discard changes)")
|
|
386
388
|
self.console.print(text_cancel)
|
|
387
389
|
|
|
388
390
|
choice = (
|
|
389
|
-
Prompt.ask("[bold
|
|
391
|
+
Prompt.ask("[bold blue]Select an option[/bold blue]", default="s")
|
|
390
392
|
.strip()
|
|
391
393
|
.lower()
|
|
392
394
|
)
|
|
@@ -473,6 +475,152 @@ class ConfigureCommand(BaseCommand):
|
|
|
473
475
|
# to accept a header callback in the future. For now, just delegate.
|
|
474
476
|
self.behavior_manager.manage_behaviors()
|
|
475
477
|
|
|
478
|
+
def _manage_skills(self) -> None:
|
|
479
|
+
"""Skills management interface."""
|
|
480
|
+
from ...cli.interactive.skills_wizard import SkillsWizard
|
|
481
|
+
from ...skills.skill_manager import get_manager
|
|
482
|
+
|
|
483
|
+
wizard = SkillsWizard()
|
|
484
|
+
manager = get_manager()
|
|
485
|
+
|
|
486
|
+
while True:
|
|
487
|
+
self.console.clear()
|
|
488
|
+
self._display_header()
|
|
489
|
+
|
|
490
|
+
self.console.print("\n[bold]Skills Management Options:[/bold]\n")
|
|
491
|
+
self.console.print(" [1] View Available Skills")
|
|
492
|
+
self.console.print(" [2] Configure Skills for Agents")
|
|
493
|
+
self.console.print(" [3] View Current Skill Mappings")
|
|
494
|
+
self.console.print(" [4] Auto-Link Skills to Agents")
|
|
495
|
+
self.console.print(" [b] Back to Main Menu")
|
|
496
|
+
self.console.print()
|
|
497
|
+
|
|
498
|
+
choice = Prompt.ask("[bold blue]Select an option[/bold blue]", default="b")
|
|
499
|
+
|
|
500
|
+
if choice == "1":
|
|
501
|
+
# View available skills
|
|
502
|
+
self.console.clear()
|
|
503
|
+
self._display_header()
|
|
504
|
+
wizard.list_available_skills()
|
|
505
|
+
Prompt.ask("\nPress Enter to continue")
|
|
506
|
+
|
|
507
|
+
elif choice == "2":
|
|
508
|
+
# Configure skills interactively
|
|
509
|
+
self.console.clear()
|
|
510
|
+
self._display_header()
|
|
511
|
+
|
|
512
|
+
# Get list of enabled agents
|
|
513
|
+
agents = self.agent_manager.discover_agents()
|
|
514
|
+
enabled_agents = [
|
|
515
|
+
a.name
|
|
516
|
+
for a in agents
|
|
517
|
+
if self.agent_manager.get_pending_state(a.name)
|
|
518
|
+
]
|
|
519
|
+
|
|
520
|
+
if not enabled_agents:
|
|
521
|
+
self.console.print(
|
|
522
|
+
"[yellow]No agents are currently enabled.[/yellow]"
|
|
523
|
+
)
|
|
524
|
+
self.console.print(
|
|
525
|
+
"Please enable agents first in Agent Management."
|
|
526
|
+
)
|
|
527
|
+
Prompt.ask("\nPress Enter to continue")
|
|
528
|
+
continue
|
|
529
|
+
|
|
530
|
+
# Run skills wizard
|
|
531
|
+
success, mapping = wizard.run_interactive_selection(enabled_agents)
|
|
532
|
+
|
|
533
|
+
if success:
|
|
534
|
+
# Save the configuration
|
|
535
|
+
manager.save_mappings_to_config()
|
|
536
|
+
self.console.print("\n[green]✓ Skills configuration saved![/green]")
|
|
537
|
+
else:
|
|
538
|
+
self.console.print(
|
|
539
|
+
"\n[yellow]Skills configuration cancelled.[/yellow]"
|
|
540
|
+
)
|
|
541
|
+
|
|
542
|
+
Prompt.ask("\nPress Enter to continue")
|
|
543
|
+
|
|
544
|
+
elif choice == "3":
|
|
545
|
+
# View current mappings
|
|
546
|
+
self.console.clear()
|
|
547
|
+
self._display_header()
|
|
548
|
+
|
|
549
|
+
self.console.print("\n[bold]Current Skill Mappings:[/bold]\n")
|
|
550
|
+
|
|
551
|
+
mappings = manager.list_agent_skill_mappings()
|
|
552
|
+
if not mappings:
|
|
553
|
+
self.console.print("[dim]No skill mappings configured yet.[/dim]")
|
|
554
|
+
else:
|
|
555
|
+
from rich.table import Table
|
|
556
|
+
|
|
557
|
+
table = Table(show_header=True, header_style="bold cyan")
|
|
558
|
+
table.add_column("Agent", style="yellow")
|
|
559
|
+
table.add_column("Skills", style="green")
|
|
560
|
+
|
|
561
|
+
for agent_id, skills in mappings.items():
|
|
562
|
+
skills_str = (
|
|
563
|
+
", ".join(skills) if skills else "[dim](none)[/dim]"
|
|
564
|
+
)
|
|
565
|
+
table.add_row(agent_id, skills_str)
|
|
566
|
+
|
|
567
|
+
self.console.print(table)
|
|
568
|
+
|
|
569
|
+
Prompt.ask("\nPress Enter to continue")
|
|
570
|
+
|
|
571
|
+
elif choice == "4":
|
|
572
|
+
# Auto-link skills
|
|
573
|
+
self.console.clear()
|
|
574
|
+
self._display_header()
|
|
575
|
+
|
|
576
|
+
self.console.print("\n[bold]Auto-Linking Skills to Agents...[/bold]\n")
|
|
577
|
+
|
|
578
|
+
# Get enabled agents
|
|
579
|
+
agents = self.agent_manager.discover_agents()
|
|
580
|
+
enabled_agents = [
|
|
581
|
+
a.name
|
|
582
|
+
for a in agents
|
|
583
|
+
if self.agent_manager.get_pending_state(a.name)
|
|
584
|
+
]
|
|
585
|
+
|
|
586
|
+
if not enabled_agents:
|
|
587
|
+
self.console.print(
|
|
588
|
+
"[yellow]No agents are currently enabled.[/yellow]"
|
|
589
|
+
)
|
|
590
|
+
self.console.print(
|
|
591
|
+
"Please enable agents first in Agent Management."
|
|
592
|
+
)
|
|
593
|
+
Prompt.ask("\nPress Enter to continue")
|
|
594
|
+
continue
|
|
595
|
+
|
|
596
|
+
# Auto-link
|
|
597
|
+
mapping = wizard._auto_link_skills(enabled_agents)
|
|
598
|
+
|
|
599
|
+
# Display preview
|
|
600
|
+
self.console.print("Auto-linked skills:\n")
|
|
601
|
+
for agent_id, skills in mapping.items():
|
|
602
|
+
self.console.print(f" [yellow]{agent_id}[/yellow]:")
|
|
603
|
+
for skill in skills:
|
|
604
|
+
self.console.print(f" - {skill}")
|
|
605
|
+
|
|
606
|
+
# Confirm
|
|
607
|
+
confirm = Confirm.ask("\nApply this configuration?", default=True)
|
|
608
|
+
|
|
609
|
+
if confirm:
|
|
610
|
+
wizard._apply_skills_configuration(mapping)
|
|
611
|
+
manager.save_mappings_to_config()
|
|
612
|
+
self.console.print("\n[green]✓ Auto-linking complete![/green]")
|
|
613
|
+
else:
|
|
614
|
+
self.console.print("\n[yellow]Auto-linking cancelled.[/yellow]")
|
|
615
|
+
|
|
616
|
+
Prompt.ask("\nPress Enter to continue")
|
|
617
|
+
|
|
618
|
+
elif choice == "b":
|
|
619
|
+
break
|
|
620
|
+
else:
|
|
621
|
+
self.console.print("[red]Invalid choice. Please try again.[/red]")
|
|
622
|
+
Prompt.ask("\nPress Enter to continue")
|
|
623
|
+
|
|
476
624
|
def _display_behavior_files(self) -> None:
|
|
477
625
|
"""Display current behavior files."""
|
|
478
626
|
self.behavior_manager.display_behavior_files()
|
|
@@ -72,9 +72,9 @@ class AgentDisplay:
|
|
|
72
72
|
)
|
|
73
73
|
|
|
74
74
|
table.add_column("ID", style="dim", width=3)
|
|
75
|
-
table.add_column("Name", style="
|
|
75
|
+
table.add_column("Name", style="bold blue", width=22)
|
|
76
76
|
table.add_column("Status", width=12)
|
|
77
|
-
table.add_column("Description", style="bold
|
|
77
|
+
table.add_column("Description", style="bold", width=45)
|
|
78
78
|
table.add_column("Model/Tools", style="dim", width=20)
|
|
79
79
|
|
|
80
80
|
for idx, agent in enumerate(agents, 1):
|
|
@@ -135,10 +135,10 @@ class AgentDisplay:
|
|
|
135
135
|
title += f" [yellow]({pending_count} change{'s' if pending_count != 1 else ''} pending)[/yellow]"
|
|
136
136
|
|
|
137
137
|
table = Table(title=title, box=ROUNDED, show_lines=True, expand=True)
|
|
138
|
-
table.add_column("ID", justify="right", style="
|
|
138
|
+
table.add_column("ID", justify="right", style="bold blue", width=5)
|
|
139
139
|
table.add_column("Name", style="bold", width=22)
|
|
140
140
|
table.add_column("Status", width=20)
|
|
141
|
-
table.add_column("Description", style="bold
|
|
141
|
+
table.add_column("Description", style="bold", width=45)
|
|
142
142
|
|
|
143
143
|
for idx, agent in enumerate(agents, 1):
|
|
144
144
|
current_state = self.agent_manager.is_agent_enabled(agent.name)
|
|
@@ -164,7 +164,7 @@ class AgentDisplay:
|
|
|
164
164
|
if len(agent.description) > 42
|
|
165
165
|
else agent.description
|
|
166
166
|
),
|
|
167
|
-
style="
|
|
167
|
+
style="",
|
|
168
168
|
)
|
|
169
169
|
|
|
170
170
|
table.add_row(str(idx), agent.name, status, desc_display)
|
|
@@ -247,7 +247,7 @@ class AgentDisplay:
|
|
|
247
247
|
detail_text.strip(),
|
|
248
248
|
title=f"[bold]{agent.name} Details[/bold]",
|
|
249
249
|
box=ROUNDED,
|
|
250
|
-
style="
|
|
250
|
+
style="blue",
|
|
251
251
|
)
|
|
252
252
|
|
|
253
253
|
self.console.print(panel)
|