@skillsmith/core 0.4.0 → 0.4.1
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/dist/.tsbuildinfo +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.d.ts.map +1 -1
- package/dist/src/analysis/CodebaseAnalyzer.js.map +1 -1
- package/dist/src/analysis/adapters/__tests__/python.test.js.map +1 -1
- package/dist/src/analysis/language-detector.d.ts +4 -20
- package/dist/src/analysis/language-detector.d.ts.map +1 -1
- package/dist/src/analysis/language-detector.js +2 -399
- package/dist/src/analysis/language-detector.js.map +1 -1
- package/dist/src/analysis/language-detector.patterns.d.ts +17 -0
- package/dist/src/analysis/language-detector.patterns.d.ts.map +1 -0
- package/dist/src/analysis/language-detector.patterns.js +413 -0
- package/dist/src/analysis/language-detector.patterns.js.map +1 -0
- package/dist/src/analysis/language-detector.types.d.ts +48 -0
- package/dist/src/analysis/language-detector.types.d.ts.map +1 -0
- package/dist/src/analysis/language-detector.types.js +6 -0
- package/dist/src/analysis/language-detector.types.js.map +1 -0
- package/dist/src/analysis/metrics.d.ts +22 -219
- package/dist/src/analysis/metrics.d.ts.map +1 -1
- package/dist/src/analysis/metrics.implementations.d.ts +39 -0
- package/dist/src/analysis/metrics.implementations.d.ts.map +1 -0
- package/dist/src/analysis/metrics.implementations.js +114 -0
- package/dist/src/analysis/metrics.implementations.js.map +1 -0
- package/dist/src/analysis/metrics.js +21 -224
- package/dist/src/analysis/metrics.js.map +1 -1
- package/dist/src/analysis/metrics.types.d.ts +79 -0
- package/dist/src/analysis/metrics.types.d.ts.map +1 -0
- package/dist/src/analysis/metrics.types.js +6 -0
- package/dist/src/analysis/metrics.types.js.map +1 -0
- package/dist/src/analytics/ROIDashboardService.js +4 -2
- package/dist/src/analytics/ROIDashboardService.js.map +1 -1
- package/dist/src/api/cache.d.ts.map +1 -1
- package/dist/src/api/cache.js.map +1 -1
- package/dist/src/api/client.d.ts +1 -0
- package/dist/src/api/client.d.ts.map +1 -1
- package/dist/src/api/client.js +17 -3
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/api/types.d.ts +1 -1
- package/dist/src/api/types.d.ts.map +1 -1
- package/dist/src/benchmarks/BenchmarkRunner.d.ts.map +1 -1
- package/dist/src/benchmarks/BenchmarkRunner.js +1 -1
- package/dist/src/benchmarks/BenchmarkRunner.js.map +1 -1
- package/dist/src/billing/BillingService.d.ts +15 -53
- package/dist/src/billing/BillingService.d.ts.map +1 -1
- package/dist/src/billing/BillingService.helpers.d.ts +15 -0
- package/dist/src/billing/BillingService.helpers.d.ts.map +1 -0
- package/dist/src/billing/BillingService.helpers.js +45 -0
- package/dist/src/billing/BillingService.helpers.js.map +1 -0
- package/dist/src/billing/BillingService.js +49 -179
- package/dist/src/billing/BillingService.js.map +1 -1
- package/dist/src/billing/BillingService.types.d.ts +52 -0
- package/dist/src/billing/BillingService.types.d.ts.map +1 -0
- package/dist/src/billing/BillingService.types.js +6 -0
- package/dist/src/billing/BillingService.types.js.map +1 -0
- package/dist/src/billing/StripeClient.d.ts +3 -2
- package/dist/src/billing/StripeClient.d.ts.map +1 -1
- package/dist/src/billing/StripeClient.js +4 -3
- package/dist/src/billing/StripeClient.js.map +1 -1
- package/dist/src/billing/StripeWebhookHandler.d.ts +13 -0
- package/dist/src/billing/StripeWebhookHandler.d.ts.map +1 -1
- package/dist/src/billing/StripeWebhookHandler.js +52 -9
- package/dist/src/billing/StripeWebhookHandler.js.map +1 -1
- package/dist/src/db/migration.d.ts +129 -0
- package/dist/src/db/migration.d.ts.map +1 -0
- package/dist/src/db/migration.js +289 -0
- package/dist/src/db/migration.js.map +1 -0
- package/dist/src/db/schema.d.ts +2 -2
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +23 -1
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/embeddings/hnsw-store.d.ts +8 -518
- package/dist/src/embeddings/hnsw-store.d.ts.map +1 -1
- package/dist/src/embeddings/hnsw-store.helpers.d.ts +83 -0
- package/dist/src/embeddings/hnsw-store.helpers.d.ts.map +1 -0
- package/dist/src/embeddings/hnsw-store.helpers.js +147 -0
- package/dist/src/embeddings/hnsw-store.helpers.js.map +1 -0
- package/dist/src/embeddings/hnsw-store.js +66 -517
- package/dist/src/embeddings/hnsw-store.js.map +1 -1
- package/dist/src/embeddings/hnsw-store.types.d.ts +154 -0
- package/dist/src/embeddings/hnsw-store.types.d.ts.map +1 -0
- package/dist/src/embeddings/hnsw-store.types.js +26 -0
- package/dist/src/embeddings/hnsw-store.types.js.map +1 -0
- package/dist/src/errors.d.ts.map +1 -1
- package/dist/src/errors.js +1 -1
- package/dist/src/errors.js.map +1 -1
- package/dist/src/index.d.ts +8 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +18 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/indexer/GitHubIndexer.d.ts.map +1 -1
- package/dist/src/indexer/GitHubIndexer.js +17 -4
- package/dist/src/indexer/GitHubIndexer.js.map +1 -1
- package/dist/src/indexer/SwarmIndexer.d.ts.map +1 -1
- package/dist/src/indexer/SwarmIndexer.js +1 -1
- package/dist/src/indexer/SwarmIndexer.js.map +1 -1
- package/dist/src/learning/PatternStore.d.ts +6 -426
- package/dist/src/learning/PatternStore.d.ts.map +1 -1
- package/dist/src/learning/PatternStore.helpers.d.ts +88 -0
- package/dist/src/learning/PatternStore.helpers.d.ts.map +1 -0
- package/dist/src/learning/PatternStore.helpers.js +286 -0
- package/dist/src/learning/PatternStore.helpers.js.map +1 -0
- package/dist/src/learning/PatternStore.js +52 -598
- package/dist/src/learning/PatternStore.js.map +1 -1
- package/dist/src/learning/PatternStore.queries.d.ts +83 -0
- package/dist/src/learning/PatternStore.queries.d.ts.map +1 -0
- package/dist/src/learning/PatternStore.queries.js +189 -0
- package/dist/src/learning/PatternStore.queries.js.map +1 -0
- package/dist/src/learning/PatternStore.types.d.ts +308 -0
- package/dist/src/learning/PatternStore.types.d.ts.map +1 -0
- package/dist/src/learning/PatternStore.types.js +44 -0
- package/dist/src/learning/PatternStore.types.js.map +1 -0
- package/dist/src/learning/ReasoningBankIntegration.d.ts +5 -345
- package/dist/src/learning/ReasoningBankIntegration.d.ts.map +1 -1
- package/dist/src/learning/ReasoningBankIntegration.helpers.d.ts +49 -0
- package/dist/src/learning/ReasoningBankIntegration.helpers.d.ts.map +1 -0
- package/dist/src/learning/ReasoningBankIntegration.helpers.js +180 -0
- package/dist/src/learning/ReasoningBankIntegration.helpers.js.map +1 -0
- package/dist/src/learning/ReasoningBankIntegration.js +21 -390
- package/dist/src/learning/ReasoningBankIntegration.js.map +1 -1
- package/dist/src/learning/ReasoningBankIntegration.types.d.ts +167 -0
- package/dist/src/learning/ReasoningBankIntegration.types.d.ts.map +1 -0
- package/dist/src/learning/ReasoningBankIntegration.types.js +51 -0
- package/dist/src/learning/ReasoningBankIntegration.types.js.map +1 -0
- package/dist/src/learning/interfaces.d.ts.map +1 -1
- package/dist/src/pipeline/DailyIndexPipeline.js +1 -1
- package/dist/src/pipeline/DailyIndexPipeline.js.map +1 -1
- package/dist/src/repositories/IndexerRepository.d.ts +1 -0
- package/dist/src/repositories/IndexerRepository.d.ts.map +1 -1
- package/dist/src/repositories/IndexerRepository.js +6 -0
- package/dist/src/repositories/IndexerRepository.js.map +1 -1
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +20 -5
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/routing/SONARouter.d.ts +3 -101
- package/dist/src/routing/SONARouter.d.ts.map +1 -1
- package/dist/src/routing/SONARouter.helpers.d.ts +112 -0
- package/dist/src/routing/SONARouter.helpers.d.ts.map +1 -0
- package/dist/src/routing/SONARouter.helpers.js +184 -0
- package/dist/src/routing/SONARouter.helpers.js.map +1 -0
- package/dist/src/routing/SONARouter.js +16 -318
- package/dist/src/routing/SONARouter.js.map +1 -1
- package/dist/src/scripts/github-import/github-client.js +0 -1
- package/dist/src/scripts/github-import/github-client.js.map +1 -1
- package/dist/src/scripts/ingest-lenny-skills.d.ts +40 -0
- package/dist/src/scripts/ingest-lenny-skills.d.ts.map +1 -0
- package/dist/src/scripts/ingest-lenny-skills.js +346 -0
- package/dist/src/scripts/ingest-lenny-skills.js.map +1 -0
- package/dist/src/scripts/review-lenny-skills.d.ts +25 -0
- package/dist/src/scripts/review-lenny-skills.d.ts.map +1 -0
- package/dist/src/scripts/review-lenny-skills.js +520 -0
- package/dist/src/scripts/review-lenny-skills.js.map +1 -0
- package/dist/src/scripts/sync-to-supabase.d.ts +10 -0
- package/dist/src/scripts/sync-to-supabase.d.ts.map +1 -0
- package/dist/src/scripts/sync-to-supabase.js +93 -0
- package/dist/src/scripts/sync-to-supabase.js.map +1 -0
- package/dist/src/security/AuditLogger.js +1 -1
- package/dist/src/security/AuditLogger.js.map +1 -1
- package/dist/src/security/__tests__/pathValidation.test.js.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.d.ts +12 -88
- package/dist/src/security/scanner/SecurityScanner.d.ts.map +1 -1
- package/dist/src/security/scanner/SecurityScanner.formatters.d.ts +49 -0
- package/dist/src/security/scanner/SecurityScanner.formatters.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.formatters.js +139 -0
- package/dist/src/security/scanner/SecurityScanner.formatters.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts +40 -0
- package/dist/src/security/scanner/SecurityScanner.helpers.d.ts.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.helpers.js +142 -0
- package/dist/src/security/scanner/SecurityScanner.helpers.js.map +1 -0
- package/dist/src/security/scanner/SecurityScanner.js +26 -255
- package/dist/src/security/scanner/SecurityScanner.js.map +1 -1
- package/dist/src/services/SearchService.d.ts +5 -0
- package/dist/src/services/SearchService.d.ts.map +1 -1
- package/dist/src/services/SearchService.js +143 -11
- package/dist/src/services/SearchService.js.map +1 -1
- package/dist/src/services/SkillAnalyzer.d.ts +117 -0
- package/dist/src/services/SkillAnalyzer.d.ts.map +1 -0
- package/dist/src/services/SkillAnalyzer.js +421 -0
- package/dist/src/services/SkillAnalyzer.js.map +1 -0
- package/dist/src/services/SkillDecomposer.d.ts +103 -0
- package/dist/src/services/SkillDecomposer.d.ts.map +1 -0
- package/dist/src/services/SkillDecomposer.js +359 -0
- package/dist/src/services/SkillDecomposer.js.map +1 -0
- package/dist/src/services/SubagentGenerator.d.ts +68 -0
- package/dist/src/services/SubagentGenerator.d.ts.map +1 -0
- package/dist/src/services/SubagentGenerator.js +319 -0
- package/dist/src/services/SubagentGenerator.js.map +1 -0
- package/dist/src/services/TransformationService.d.ts +163 -0
- package/dist/src/services/TransformationService.d.ts.map +1 -0
- package/dist/src/services/TransformationService.js +291 -0
- package/dist/src/services/TransformationService.js.map +1 -0
- package/dist/src/services/__tests__/SkillAnalyzer.test.d.ts +6 -0
- package/dist/src/services/__tests__/SkillAnalyzer.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/SkillAnalyzer.test.js +177 -0
- package/dist/src/services/__tests__/SkillAnalyzer.test.js.map +1 -0
- package/dist/src/services/__tests__/SkillDecomposer.test.d.ts +6 -0
- package/dist/src/services/__tests__/SkillDecomposer.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/SkillDecomposer.test.js +235 -0
- package/dist/src/services/__tests__/SkillDecomposer.test.js.map +1 -0
- package/dist/src/services/__tests__/SubagentGenerator.test.d.ts +6 -0
- package/dist/src/services/__tests__/SubagentGenerator.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/SubagentGenerator.test.js +174 -0
- package/dist/src/services/__tests__/SubagentGenerator.test.js.map +1 -0
- package/dist/src/services/__tests__/TransformationService.test.d.ts +6 -0
- package/dist/src/services/__tests__/TransformationService.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/TransformationService.test.js +242 -0
- package/dist/src/services/__tests__/TransformationService.test.js.map +1 -0
- package/dist/src/session/SessionContext.js +1 -1
- package/dist/src/session/SessionContext.js.map +1 -1
- package/dist/src/session/SessionManager.d.ts +3 -67
- package/dist/src/session/SessionManager.d.ts.map +1 -1
- package/dist/src/session/SessionManager.helpers.d.ts +68 -0
- package/dist/src/session/SessionManager.helpers.d.ts.map +1 -0
- package/dist/src/session/SessionManager.helpers.js +152 -0
- package/dist/src/session/SessionManager.helpers.js.map +1 -0
- package/dist/src/session/SessionManager.js +58 -163
- package/dist/src/session/SessionManager.js.map +1 -1
- package/dist/src/session/SessionManager.types.d.ts +88 -0
- package/dist/src/session/SessionManager.types.d.ts.map +1 -0
- package/dist/src/session/SessionManager.types.js +27 -0
- package/dist/src/session/SessionManager.types.js.map +1 -0
- package/dist/src/session/SessionRecovery.d.ts.map +1 -1
- package/dist/src/session/SessionRecovery.js +3 -2
- package/dist/src/session/SessionRecovery.js.map +1 -1
- package/dist/src/sources/RawUrlSourceAdapter.js.map +1 -1
- package/dist/src/sources/SourceAdapterRegistry.js +1 -1
- package/dist/src/sources/SourceAdapterRegistry.js.map +1 -1
- package/dist/src/telemetry/tracer.d.ts.map +1 -1
- package/dist/src/telemetry/tracer.js +2 -3
- package/dist/src/telemetry/tracer.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.d.ts +17 -293
- package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -1
- package/dist/src/testing/MultiLLMProvider.helpers.d.ts +54 -0
- package/dist/src/testing/MultiLLMProvider.helpers.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.helpers.js +126 -0
- package/dist/src/testing/MultiLLMProvider.helpers.js.map +1 -0
- package/dist/src/testing/MultiLLMProvider.js +50 -323
- package/dist/src/testing/MultiLLMProvider.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.types.d.ts +253 -0
- package/dist/src/testing/MultiLLMProvider.types.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.types.js +111 -0
- package/dist/src/testing/MultiLLMProvider.types.js.map +1 -0
- package/dist/src/triggers/__tests__/TriggerDetector.test.js +1 -1
- package/dist/src/triggers/__tests__/TriggerDetector.test.js.map +1 -1
- package/dist/src/types/skill.d.ts +29 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types/skill.js +11 -1
- package/dist/src/types/skill.js.map +1 -1
- package/dist/src/types.d.ts +22 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/utils/retry.js +2 -2
- package/dist/src/utils/retry.js.map +1 -1
- package/dist/src/validation/index.js +2 -2
- package/dist/src/validation/index.js.map +1 -1
- package/dist/src/webhooks/WebhookHandler.d.ts.map +1 -1
- package/dist/src/webhooks/WebhookHandler.js.map +1 -1
- package/dist/src/webhooks/WebhookPayload.js +1 -1
- package/dist/src/webhooks/WebhookPayload.js.map +1 -1
- package/dist/tests/Analytics.integration.test.js +2 -2
- package/dist/tests/Analytics.integration.test.js.map +1 -1
- package/dist/tests/AnalyticsRepository.test.js +3 -5
- package/dist/tests/AnalyticsRepository.test.js.map +1 -1
- package/dist/tests/AnalyticsStorage.test.js.map +1 -1
- package/dist/tests/ApiPartialResponses.test.d.ts +12 -0
- package/dist/tests/ApiPartialResponses.test.d.ts.map +1 -0
- package/dist/tests/ApiPartialResponses.test.js +202 -0
- package/dist/tests/ApiPartialResponses.test.js.map +1 -0
- package/dist/tests/AuditLogger.test.js.map +1 -1
- package/dist/tests/BenchmarkRunner.test.js +6 -6
- package/dist/tests/BenchmarkRunner.test.js.map +1 -1
- package/dist/tests/CacheSecurity.test.js.map +1 -1
- package/dist/tests/CodebaseAnalyzer.test.js.map +1 -1
- package/dist/tests/DailyIndexPipeline.test.js.map +1 -1
- package/dist/tests/EmbeddingService.test.js.map +1 -1
- package/dist/tests/GitHubIndexer.test.js +4 -3
- package/dist/tests/GitHubIndexer.test.js.map +1 -1
- package/dist/tests/MemoryProfiler.test.js +3 -3
- package/dist/tests/MemoryProfiler.test.js.map +1 -1
- package/dist/tests/QualityScorer.test.js.map +1 -1
- package/dist/tests/RateLimiter.test.js.map +1 -1
- package/dist/tests/ScraperAdapters.test.js.map +1 -1
- package/dist/tests/SecurityScanner.test.js +4 -4
- package/dist/tests/SecurityScanner.test.js.map +1 -1
- package/dist/tests/SessionManager.security.test.js +1 -1
- package/dist/tests/SessionManager.security.test.js.map +1 -1
- package/dist/tests/SessionManager.test.js +4 -4
- package/dist/tests/SessionManager.test.js.map +1 -1
- package/dist/tests/SwarmIndexer.test.js +1 -1
- package/dist/tests/SwarmIndexer.test.js.map +1 -1
- package/dist/tests/TieredCache.test.js +2 -11
- package/dist/tests/TieredCache.test.js.map +1 -1
- package/dist/tests/WebhookHandler.test.js.map +1 -1
- package/dist/tests/fixtures/api-responses/index.d.ts +119 -0
- package/dist/tests/fixtures/api-responses/index.d.ts.map +1 -0
- package/dist/tests/fixtures/api-responses/index.js +419 -0
- package/dist/tests/fixtures/api-responses/index.js.map +1 -0
- package/dist/tests/logger.test.js +1 -1
- package/dist/tests/logger.test.js.map +1 -1
- package/dist/tests/performance/LargeScalePerformance.test.js +1 -1
- package/dist/tests/performance/LargeScalePerformance.test.js.map +1 -1
- package/dist/tests/sanitization.test.js.map +1 -1
- package/dist/tests/session/SessionManager.helpers.test.d.ts +8 -0
- package/dist/tests/session/SessionManager.helpers.test.d.ts.map +1 -0
- package/dist/tests/session/SessionManager.helpers.test.js +105 -0
- package/dist/tests/session/SessionManager.helpers.test.js.map +1 -0
- package/dist/tests/sources.test.js.map +1 -1
- package/dist/tests/webhooks/WebhookHandler.idempotency.test.js +1 -1
- package/dist/tests/webhooks/WebhookHandler.idempotency.test.js.map +1 -1
- package/dist/tests/webhooks/WebhookPayload.security.test.js.map +1 -1
- package/package.json +9 -9
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SMI-XXX: TransformationService - Orchestrate skill optimization pipeline
|
|
3
|
+
*
|
|
4
|
+
* The central service for transforming community skills into optimized versions.
|
|
5
|
+
* Coordinates the full pipeline:
|
|
6
|
+
* 1. SkillAnalyzer - Analyze skill for optimization patterns
|
|
7
|
+
* 2. SkillDecomposer - Decompose large skills into sub-skills
|
|
8
|
+
* 3. SubagentGenerator - Generate companion subagent definitions
|
|
9
|
+
* 4. Caching - Cache transformed skills for reuse
|
|
10
|
+
*
|
|
11
|
+
* Implements the hybrid approach:
|
|
12
|
+
* - Hot skills (>100 installs): Pre-transformed, cached
|
|
13
|
+
* - Warm skills (10-100 installs): JIT on first install, cached
|
|
14
|
+
* - Cold skills (<10 installs): JIT on demand, short TTL
|
|
15
|
+
*
|
|
16
|
+
* Part of the Skillsmith Optimization Layer.
|
|
17
|
+
*/
|
|
18
|
+
import { CacheRepository } from '../repositories/CacheRepository.js';
|
|
19
|
+
import { analyzeSkill, quickTransformCheck } from './SkillAnalyzer.js';
|
|
20
|
+
import { decomposeSkill, parallelizeTaskCalls, } from './SkillDecomposer.js';
|
|
21
|
+
import { generateSubagent, } from './SubagentGenerator.js';
|
|
22
|
+
const DEFAULT_OPTIONS = {
|
|
23
|
+
cacheTtl: 3600, // 1 hour
|
|
24
|
+
enableCache: true,
|
|
25
|
+
forceTransform: false,
|
|
26
|
+
version: '1.0.0',
|
|
27
|
+
};
|
|
28
|
+
/** Cache key prefix for transformed skills */
|
|
29
|
+
const CACHE_KEY_PREFIX = 'transform:';
|
|
30
|
+
/** Attribution text added to optimized skills */
|
|
31
|
+
const ATTRIBUTION = '\n\n---\n\n*Optimized by Skillsmith - Token usage reduced through intelligent decomposition*';
|
|
32
|
+
/**
|
|
33
|
+
* TransformationService orchestrates the skill optimization pipeline
|
|
34
|
+
*/
|
|
35
|
+
export class TransformationService {
|
|
36
|
+
cache;
|
|
37
|
+
options;
|
|
38
|
+
/**
|
|
39
|
+
* Create a new TransformationService
|
|
40
|
+
*
|
|
41
|
+
* @param db - Database connection (optional, for caching)
|
|
42
|
+
* @param options - Service configuration
|
|
43
|
+
*/
|
|
44
|
+
constructor(db, options) {
|
|
45
|
+
this.options = { ...DEFAULT_OPTIONS, ...options };
|
|
46
|
+
this.cache = db && this.options.enableCache ? new CacheRepository(db) : null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Transform a skill through the full optimization pipeline
|
|
50
|
+
*
|
|
51
|
+
* @param skillId - Unique identifier for the skill (for caching)
|
|
52
|
+
* @param skillName - Human-readable skill name
|
|
53
|
+
* @param description - Skill description
|
|
54
|
+
* @param content - The full SKILL.md content
|
|
55
|
+
* @returns Transformation result
|
|
56
|
+
*/
|
|
57
|
+
async transform(skillId, skillName, description, content) {
|
|
58
|
+
const startTime = Date.now();
|
|
59
|
+
// Check cache first (unless force transform)
|
|
60
|
+
if (!this.options.forceTransform && this.cache) {
|
|
61
|
+
const cached = this.getCachedTransformation(skillId, content);
|
|
62
|
+
if (cached) {
|
|
63
|
+
return cached;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
// Quick check if transformation is needed
|
|
67
|
+
if (!quickTransformCheck(content)) {
|
|
68
|
+
// Still add attribution but skip full transformation
|
|
69
|
+
const result = this.createMinimalResult(content, startTime);
|
|
70
|
+
// Cache the result
|
|
71
|
+
if (this.cache) {
|
|
72
|
+
this.cacheTransformation(skillId, content, result);
|
|
73
|
+
}
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
// Full analysis
|
|
77
|
+
const analysis = analyzeSkill(content);
|
|
78
|
+
// Apply transformations
|
|
79
|
+
let transformedContent = content;
|
|
80
|
+
// 1. Parallelize Task() calls
|
|
81
|
+
let tasksParallelized = false;
|
|
82
|
+
if (analysis.taskPatterns.canBatch) {
|
|
83
|
+
transformedContent = parallelizeTaskCalls(transformedContent);
|
|
84
|
+
tasksParallelized = true;
|
|
85
|
+
}
|
|
86
|
+
// 2. Decompose if needed
|
|
87
|
+
const decomposition = decomposeSkill(transformedContent, analysis);
|
|
88
|
+
// 3. Generate subagent if beneficial
|
|
89
|
+
const subagentResult = generateSubagent(skillName, description, content, analysis);
|
|
90
|
+
// Build result
|
|
91
|
+
const result = this.buildResult(decomposition, subagentResult, analysis, tasksParallelized, startTime);
|
|
92
|
+
// Cache the result
|
|
93
|
+
if (this.cache) {
|
|
94
|
+
this.cacheTransformation(skillId, content, result);
|
|
95
|
+
}
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Quick transform without caching (for testing or one-off transforms)
|
|
100
|
+
*
|
|
101
|
+
* @param skillName - Human-readable skill name
|
|
102
|
+
* @param description - Skill description
|
|
103
|
+
* @param content - The full SKILL.md content
|
|
104
|
+
* @returns Transformation result
|
|
105
|
+
*/
|
|
106
|
+
transformSync(skillName, description, content) {
|
|
107
|
+
const startTime = Date.now();
|
|
108
|
+
// Quick check if transformation is needed
|
|
109
|
+
if (!quickTransformCheck(content)) {
|
|
110
|
+
return this.createMinimalResult(content, startTime);
|
|
111
|
+
}
|
|
112
|
+
// Full analysis
|
|
113
|
+
const analysis = analyzeSkill(content);
|
|
114
|
+
// Apply transformations
|
|
115
|
+
let transformedContent = content;
|
|
116
|
+
// 1. Parallelize Task() calls
|
|
117
|
+
let tasksParallelized = false;
|
|
118
|
+
if (analysis.taskPatterns.canBatch) {
|
|
119
|
+
transformedContent = parallelizeTaskCalls(transformedContent);
|
|
120
|
+
tasksParallelized = true;
|
|
121
|
+
}
|
|
122
|
+
// 2. Decompose if needed
|
|
123
|
+
const decomposition = decomposeSkill(transformedContent, analysis);
|
|
124
|
+
// 3. Generate subagent if beneficial
|
|
125
|
+
const subagentResult = generateSubagent(skillName, description, content, analysis);
|
|
126
|
+
return this.buildResult(decomposition, subagentResult, analysis, tasksParallelized, startTime);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Check if a skill would benefit from transformation without fully transforming
|
|
130
|
+
*
|
|
131
|
+
* @param content - The SKILL.md content
|
|
132
|
+
* @returns Analysis with transformation recommendations
|
|
133
|
+
*/
|
|
134
|
+
analyze(content) {
|
|
135
|
+
return analyzeSkill(content);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Get cached transformation if available and valid
|
|
139
|
+
*/
|
|
140
|
+
getCachedTransformation(skillId, content) {
|
|
141
|
+
if (!this.cache)
|
|
142
|
+
return null;
|
|
143
|
+
const cacheKey = this.buildCacheKey(skillId);
|
|
144
|
+
const cached = this.cache.get(cacheKey);
|
|
145
|
+
if (!cached)
|
|
146
|
+
return null;
|
|
147
|
+
// Validate cache entry
|
|
148
|
+
const contentHash = this.hashContent(content);
|
|
149
|
+
if (cached.skillHash !== contentHash) {
|
|
150
|
+
// Content changed, invalidate cache
|
|
151
|
+
return null;
|
|
152
|
+
}
|
|
153
|
+
if (cached.version !== this.options.version) {
|
|
154
|
+
// Version mismatch, invalidate cache
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
return cached.result;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Cache a transformation result
|
|
161
|
+
*/
|
|
162
|
+
cacheTransformation(skillId, content, result) {
|
|
163
|
+
if (!this.cache)
|
|
164
|
+
return;
|
|
165
|
+
const cacheKey = this.buildCacheKey(skillId);
|
|
166
|
+
const contentHash = this.hashContent(content);
|
|
167
|
+
const cacheEntry = {
|
|
168
|
+
result,
|
|
169
|
+
skillHash: contentHash,
|
|
170
|
+
cachedAt: new Date().toISOString(),
|
|
171
|
+
version: this.options.version,
|
|
172
|
+
};
|
|
173
|
+
this.cache.set(cacheKey, cacheEntry, this.options.cacheTtl);
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Build cache key for a skill
|
|
177
|
+
*/
|
|
178
|
+
buildCacheKey(skillId) {
|
|
179
|
+
return `${CACHE_KEY_PREFIX}${skillId}`;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Simple hash function for content comparison
|
|
183
|
+
*/
|
|
184
|
+
hashContent(content) {
|
|
185
|
+
// Simple hash for content comparison
|
|
186
|
+
let hash = 0;
|
|
187
|
+
for (let i = 0; i < content.length; i++) {
|
|
188
|
+
const char = content.charCodeAt(i);
|
|
189
|
+
hash = (hash << 5) - hash + char;
|
|
190
|
+
hash = hash & hash; // Convert to 32-bit integer
|
|
191
|
+
}
|
|
192
|
+
return hash.toString(16);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Create minimal result for skills that don't need transformation
|
|
196
|
+
*/
|
|
197
|
+
createMinimalResult(content, startTime) {
|
|
198
|
+
const lineCount = content.split('\n').length;
|
|
199
|
+
// Add attribution if not present
|
|
200
|
+
let mainSkillContent = content;
|
|
201
|
+
if (!content.includes('Optimized by Skillsmith')) {
|
|
202
|
+
mainSkillContent = content.trimEnd() + ATTRIBUTION;
|
|
203
|
+
}
|
|
204
|
+
return {
|
|
205
|
+
transformed: false,
|
|
206
|
+
mainSkillContent,
|
|
207
|
+
subSkills: [],
|
|
208
|
+
stats: {
|
|
209
|
+
originalLines: lineCount,
|
|
210
|
+
optimizedLines: mainSkillContent.split('\n').length,
|
|
211
|
+
subSkillCount: 0,
|
|
212
|
+
tasksParallelized: false,
|
|
213
|
+
subagentGenerated: false,
|
|
214
|
+
tokenReductionPercent: 0,
|
|
215
|
+
transformDurationMs: Date.now() - startTime,
|
|
216
|
+
},
|
|
217
|
+
analysis: analyzeSkill(content),
|
|
218
|
+
attribution: ATTRIBUTION,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Build full transformation result
|
|
223
|
+
*/
|
|
224
|
+
buildResult(decomposition, subagentResult, analysis, tasksParallelized, startTime) {
|
|
225
|
+
// Calculate token reduction
|
|
226
|
+
let tokenReductionPercent = decomposition.stats.tokenReductionPercent;
|
|
227
|
+
// Add savings from subagent context isolation
|
|
228
|
+
if (subagentResult.generated) {
|
|
229
|
+
tokenReductionPercent += 20; // Subagent provides ~20% additional savings
|
|
230
|
+
}
|
|
231
|
+
// Add savings from task parallelization
|
|
232
|
+
if (tasksParallelized) {
|
|
233
|
+
tokenReductionPercent += analysis.taskPatterns.batchSavingsPercent / 2;
|
|
234
|
+
}
|
|
235
|
+
// Cap at 80% (realistic maximum)
|
|
236
|
+
tokenReductionPercent = Math.min(80, Math.round(tokenReductionPercent));
|
|
237
|
+
return {
|
|
238
|
+
transformed: decomposition.wasDecomposed || subagentResult.generated || tasksParallelized,
|
|
239
|
+
mainSkillContent: decomposition.mainSkill.content,
|
|
240
|
+
subSkills: decomposition.subSkills.map((s) => ({
|
|
241
|
+
filename: s.filename,
|
|
242
|
+
content: s.content,
|
|
243
|
+
})),
|
|
244
|
+
subagent: subagentResult.subagent,
|
|
245
|
+
claudeMdSnippet: subagentResult.claudeMdSnippet,
|
|
246
|
+
stats: {
|
|
247
|
+
originalLines: decomposition.stats.originalLines,
|
|
248
|
+
optimizedLines: decomposition.mainSkill.lineCount,
|
|
249
|
+
subSkillCount: decomposition.subSkills.length,
|
|
250
|
+
tasksParallelized,
|
|
251
|
+
subagentGenerated: subagentResult.generated,
|
|
252
|
+
tokenReductionPercent,
|
|
253
|
+
transformDurationMs: Date.now() - startTime,
|
|
254
|
+
},
|
|
255
|
+
analysis,
|
|
256
|
+
attribution: ATTRIBUTION,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Clear transformation cache
|
|
261
|
+
*/
|
|
262
|
+
clearCache() {
|
|
263
|
+
if (!this.cache)
|
|
264
|
+
return 0;
|
|
265
|
+
return this.cache.clear();
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Get cache statistics
|
|
269
|
+
*/
|
|
270
|
+
getCacheStats() {
|
|
271
|
+
return {
|
|
272
|
+
enabled: this.cache !== null,
|
|
273
|
+
ttl: this.options.cacheTtl,
|
|
274
|
+
version: this.options.version,
|
|
275
|
+
};
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Create a standalone transformation (no caching)
|
|
280
|
+
*
|
|
281
|
+
* @param skillName - Human-readable skill name
|
|
282
|
+
* @param description - Skill description
|
|
283
|
+
* @param content - The full SKILL.md content
|
|
284
|
+
* @returns Transformation result
|
|
285
|
+
*/
|
|
286
|
+
export function transformSkill(skillName, description, content) {
|
|
287
|
+
const service = new TransformationService();
|
|
288
|
+
return service.transformSync(skillName, description, content);
|
|
289
|
+
}
|
|
290
|
+
export default TransformationService;
|
|
291
|
+
//# sourceMappingURL=TransformationService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TransformationService.js","sourceRoot":"","sources":["../../../src/services/TransformationService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillAnalyzer.test.d.ts","sourceRoot":"","sources":["../../../../src/services/__tests__/SkillAnalyzer.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tests for SkillAnalyzer service
|
|
3
|
+
* Part of Skillsmith Optimization Layer
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect } from 'vitest';
|
|
6
|
+
import { analyzeSkill, quickTransformCheck } from '../SkillAnalyzer.js';
|
|
7
|
+
describe('SkillAnalyzer', () => {
|
|
8
|
+
describe('analyzeSkill', () => {
|
|
9
|
+
it('should analyze a simple skill with low complexity', () => {
|
|
10
|
+
const content = `---
|
|
11
|
+
name: simple-skill
|
|
12
|
+
description: A simple skill for testing
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
# Simple Skill
|
|
16
|
+
|
|
17
|
+
This is a simple skill with minimal content.
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
Just use it normally.
|
|
22
|
+
`;
|
|
23
|
+
const analysis = analyzeSkill(content);
|
|
24
|
+
expect(analysis.lineCount).toBeLessThan(500);
|
|
25
|
+
expect(analysis.shouldTransform).toBe(false);
|
|
26
|
+
expect(analysis.optimizationScore).toBeLessThan(30);
|
|
27
|
+
});
|
|
28
|
+
it('should detect large skills that need decomposition', () => {
|
|
29
|
+
// Create a skill with >500 lines
|
|
30
|
+
const sections = Array(100)
|
|
31
|
+
.fill(null)
|
|
32
|
+
.map((_, i) => `## Section ${i}\n\nContent for section ${i}.\n\n`.repeat(5))
|
|
33
|
+
.join('\n');
|
|
34
|
+
const content = `---
|
|
35
|
+
name: large-skill
|
|
36
|
+
description: A large skill that needs decomposition
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
# Large Skill
|
|
40
|
+
|
|
41
|
+
${sections}
|
|
42
|
+
`;
|
|
43
|
+
const analysis = analyzeSkill(content);
|
|
44
|
+
expect(analysis.lineCount).toBeGreaterThan(500);
|
|
45
|
+
expect(analysis.shouldTransform).toBe(true);
|
|
46
|
+
expect(analysis.recommendations.some((r) => r.type === 'decompose')).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
it('should detect heavy tool usage suggesting subagent', () => {
|
|
49
|
+
const content = `---
|
|
50
|
+
name: tool-heavy-skill
|
|
51
|
+
description: A skill with heavy tool usage
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
# Tool Heavy Skill
|
|
55
|
+
|
|
56
|
+
This skill uses many tools:
|
|
57
|
+
- Run npm install
|
|
58
|
+
- Execute git commands
|
|
59
|
+
- Run docker build
|
|
60
|
+
- Use npx to execute
|
|
61
|
+
- Run yarn commands
|
|
62
|
+
- Use pnpm for package management
|
|
63
|
+
|
|
64
|
+
## Commands
|
|
65
|
+
|
|
66
|
+
bash: npm run build
|
|
67
|
+
bash: git status
|
|
68
|
+
bash: docker compose up
|
|
69
|
+
`;
|
|
70
|
+
const analysis = analyzeSkill(content);
|
|
71
|
+
expect(analysis.toolUsage.detectedTools).toContain('Bash');
|
|
72
|
+
expect(analysis.toolUsage.suggestsSubagent).toBe(true);
|
|
73
|
+
expect(analysis.recommendations.some((r) => r.type === 'subagent')).toBe(true);
|
|
74
|
+
});
|
|
75
|
+
it('should detect sequential Task() calls that can be parallelized', () => {
|
|
76
|
+
const content = `---
|
|
77
|
+
name: task-skill
|
|
78
|
+
description: A skill with sequential Task() calls
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
# Task Skill
|
|
82
|
+
|
|
83
|
+
## Execution
|
|
84
|
+
|
|
85
|
+
\`\`\`javascript
|
|
86
|
+
Task("agent1", "do task 1")
|
|
87
|
+
Task("agent2", "do task 2")
|
|
88
|
+
Task("agent3", "do task 3")
|
|
89
|
+
\`\`\`
|
|
90
|
+
|
|
91
|
+
These tasks are independent and can run in parallel.
|
|
92
|
+
`;
|
|
93
|
+
const analysis = analyzeSkill(content);
|
|
94
|
+
expect(analysis.taskPatterns.taskCallCount).toBeGreaterThanOrEqual(3);
|
|
95
|
+
expect(analysis.taskPatterns.canBatch).toBe(true);
|
|
96
|
+
expect(analysis.recommendations.some((r) => r.type === 'parallelize')).toBe(true);
|
|
97
|
+
});
|
|
98
|
+
it('should identify extractable sections', () => {
|
|
99
|
+
// Create content with large API reference section
|
|
100
|
+
const apiSection = Array(60).fill('- endpoint: /api/v1/resource').join('\n');
|
|
101
|
+
const content = `---
|
|
102
|
+
name: api-skill
|
|
103
|
+
description: A skill with large API reference
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
# API Skill
|
|
107
|
+
|
|
108
|
+
## Overview
|
|
109
|
+
|
|
110
|
+
Quick overview here.
|
|
111
|
+
|
|
112
|
+
## API Reference
|
|
113
|
+
|
|
114
|
+
${apiSection}
|
|
115
|
+
|
|
116
|
+
## Examples
|
|
117
|
+
|
|
118
|
+
Some examples here.
|
|
119
|
+
`;
|
|
120
|
+
const analysis = analyzeSkill(content);
|
|
121
|
+
expect(analysis.extractableSections.length).toBeGreaterThan(0);
|
|
122
|
+
expect(analysis.extractableSections.some((s) => s.name.toLowerCase().includes('api') || s.name.toLowerCase().includes('reference'))).toBe(true);
|
|
123
|
+
});
|
|
124
|
+
it('should calculate optimization score based on multiple factors', () => {
|
|
125
|
+
// Skill with multiple optimization opportunities
|
|
126
|
+
const content = `---
|
|
127
|
+
name: complex-skill
|
|
128
|
+
description: A complex skill with multiple optimization opportunities
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
# Complex Skill
|
|
132
|
+
|
|
133
|
+
This skill has multiple areas for optimization.
|
|
134
|
+
|
|
135
|
+
## Heavy Commands
|
|
136
|
+
|
|
137
|
+
Run npm install
|
|
138
|
+
Run npx something
|
|
139
|
+
Run git commands
|
|
140
|
+
Run docker build
|
|
141
|
+
Run yarn add
|
|
142
|
+
Use bash terminal
|
|
143
|
+
|
|
144
|
+
## Large Examples Section
|
|
145
|
+
|
|
146
|
+
${'Example code here.\n'.repeat(250)}
|
|
147
|
+
|
|
148
|
+
## API Reference
|
|
149
|
+
|
|
150
|
+
${Array(60).fill('- endpoint').join('\n')}
|
|
151
|
+
`;
|
|
152
|
+
const analysis = analyzeSkill(content);
|
|
153
|
+
// Score should reflect multiple optimization opportunities
|
|
154
|
+
expect(analysis.optimizationScore).toBeGreaterThan(20);
|
|
155
|
+
expect(analysis.recommendations.length).toBeGreaterThan(0);
|
|
156
|
+
});
|
|
157
|
+
});
|
|
158
|
+
describe('quickTransformCheck', () => {
|
|
159
|
+
it('should return false for small, simple skills', () => {
|
|
160
|
+
const content = `# Simple Skill\n\nJust a simple skill.`;
|
|
161
|
+
expect(quickTransformCheck(content)).toBe(false);
|
|
162
|
+
});
|
|
163
|
+
it('should return true for skills with >500 lines', () => {
|
|
164
|
+
const content = Array(600).fill('line content').join('\n');
|
|
165
|
+
expect(quickTransformCheck(content)).toBe(true);
|
|
166
|
+
});
|
|
167
|
+
it('should return true for skills with heavy tool patterns', () => {
|
|
168
|
+
const content = `# Skill\n\nnpm install\ngit status\ndocker build`;
|
|
169
|
+
expect(quickTransformCheck(content)).toBe(true);
|
|
170
|
+
});
|
|
171
|
+
it('should return true for skills with multiple Task() calls', () => {
|
|
172
|
+
const content = `# Skill\n\nTask("a", "b")\nTask("c", "d")`;
|
|
173
|
+
expect(quickTransformCheck(content)).toBe(true);
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
});
|
|
177
|
+
//# sourceMappingURL=SkillAnalyzer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillAnalyzer.test.js","sourceRoot":"","sources":["../../../../src/services/__tests__/SkillAnalyzer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SkillDecomposer.test.d.ts","sourceRoot":"","sources":["../../../../src/services/__tests__/SkillDecomposer.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|