@skillsmith/core 0.4.14 → 0.4.15
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/README.md +2 -0
- package/dist/.tsbuildinfo +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.health.d.ts +26 -0
- package/dist/src/api/client.health.d.ts.map +1 -0
- package/dist/src/api/client.health.js +74 -0
- package/dist/src/api/client.health.js.map +1 -0
- package/dist/src/api/client.js +3 -51
- package/dist/src/api/client.js.map +1 -1
- package/dist/src/db/createDatabase.d.ts +9 -1
- package/dist/src/db/createDatabase.d.ts.map +1 -1
- package/dist/src/db/createDatabase.js +9 -1
- package/dist/src/db/createDatabase.js.map +1 -1
- package/dist/src/db/drivers/sqljsDriver.d.ts.map +1 -1
- package/dist/src/db/drivers/sqljsDriver.js +5 -2
- package/dist/src/db/drivers/sqljsDriver.js.map +1 -1
- package/dist/src/db/migrations/v5b-change-type.d.ts +19 -0
- package/dist/src/db/migrations/v5b-change-type.d.ts.map +1 -0
- package/dist/src/db/migrations/v5b-change-type.js +22 -0
- package/dist/src/db/migrations/v5b-change-type.js.map +1 -0
- package/dist/src/db/migrations/v6-advisories.d.ts +32 -0
- package/dist/src/db/migrations/v6-advisories.d.ts.map +1 -0
- package/dist/src/db/migrations/v6-advisories.js +53 -0
- package/dist/src/db/migrations/v6-advisories.js.map +1 -0
- package/dist/src/db/migrations/v7-compatibility.d.ts +21 -0
- package/dist/src/db/migrations/v7-compatibility.d.ts.map +1 -0
- package/dist/src/db/migrations/v7-compatibility.js +23 -0
- package/dist/src/db/migrations/v7-compatibility.js.map +1 -0
- package/dist/src/db/migrations/v8-co-installs.d.ts +21 -0
- package/dist/src/db/migrations/v8-co-installs.d.ts.map +1 -0
- package/dist/src/db/migrations/v8-co-installs.js +33 -0
- package/dist/src/db/migrations/v8-co-installs.js.map +1 -0
- package/dist/src/db/schema.d.ts +5 -16
- package/dist/src/db/schema.d.ts.map +1 -1
- package/dist/src/db/schema.js +37 -22
- package/dist/src/db/schema.js.map +1 -1
- package/dist/src/exports/repositories.d.ts +5 -0
- package/dist/src/exports/repositories.d.ts.map +1 -1
- package/dist/src/exports/repositories.js +17 -0
- package/dist/src/exports/repositories.js.map +1 -1
- package/dist/src/exports/types.d.ts +1 -1
- package/dist/src/exports/types.d.ts.map +1 -1
- package/dist/src/exports/types.js.map +1 -1
- package/dist/src/indexer/SkillParser.d.ts +2 -0
- package/dist/src/indexer/SkillParser.d.ts.map +1 -1
- package/dist/src/indexer/SkillParser.js.map +1 -1
- package/dist/src/learning/PatternStore.d.ts +0 -2
- package/dist/src/learning/PatternStore.d.ts.map +1 -1
- package/dist/src/learning/PatternStore.helpers.d.ts +19 -1
- package/dist/src/learning/PatternStore.helpers.d.ts.map +1 -1
- package/dist/src/learning/PatternStore.helpers.js +51 -0
- package/dist/src/learning/PatternStore.helpers.js.map +1 -1
- package/dist/src/learning/PatternStore.js +5 -37
- package/dist/src/learning/PatternStore.js.map +1 -1
- package/dist/src/repositories/AdvisoryRepository.d.ts +80 -0
- package/dist/src/repositories/AdvisoryRepository.d.ts.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.js +128 -0
- package/dist/src/repositories/AdvisoryRepository.js.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.test.d.ts +6 -0
- package/dist/src/repositories/AdvisoryRepository.test.d.ts.map +1 -0
- package/dist/src/repositories/AdvisoryRepository.test.js +149 -0
- package/dist/src/repositories/AdvisoryRepository.test.js.map +1 -0
- package/dist/src/repositories/CoInstallRepository.d.ts +68 -0
- package/dist/src/repositories/CoInstallRepository.d.ts.map +1 -0
- package/dist/src/repositories/CoInstallRepository.js +122 -0
- package/dist/src/repositories/CoInstallRepository.js.map +1 -0
- package/dist/src/repositories/SkillRepository.d.ts.map +1 -1
- package/dist/src/repositories/SkillRepository.js +16 -5
- package/dist/src/repositories/SkillRepository.js.map +1 -1
- package/dist/src/services/SearchService.helpers.d.ts.map +1 -1
- package/dist/src/services/SearchService.helpers.js +4 -0
- package/dist/src/services/SearchService.helpers.js.map +1 -1
- package/dist/src/services/SearchService.types.d.ts +1 -0
- package/dist/src/services/SearchService.types.d.ts.map +1 -1
- package/dist/src/services/TaskRunner.d.ts +5 -81
- package/dist/src/services/TaskRunner.d.ts.map +1 -1
- package/dist/src/services/TaskRunner.js +7 -68
- package/dist/src/services/TaskRunner.js.map +1 -1
- package/dist/src/services/TaskRunner.process.d.ts +33 -0
- package/dist/src/services/TaskRunner.process.d.ts.map +1 -0
- package/dist/src/services/TaskRunner.process.js +70 -0
- package/dist/src/services/TaskRunner.process.js.map +1 -0
- package/dist/src/services/TaskRunner.types.d.ts +76 -0
- package/dist/src/services/TaskRunner.types.d.ts.map +1 -0
- package/dist/src/services/TaskRunner.types.js +22 -0
- package/dist/src/services/TaskRunner.types.js.map +1 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.d.ts +13 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.d.ts.map +1 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.js +91 -0
- package/dist/src/services/__tests__/TaskRunner.process.test.js.map +1 -0
- package/dist/src/services/quarantine/QuarantineService.d.ts +3 -24
- package/dist/src/services/quarantine/QuarantineService.d.ts.map +1 -1
- package/dist/src/services/quarantine/QuarantineService.js +8 -205
- package/dist/src/services/quarantine/QuarantineService.js.map +1 -1
- package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts +57 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.d.ts.map +1 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.js +211 -0
- package/dist/src/services/quarantine/QuarantineService.multiapproval.js.map +1 -0
- package/dist/src/session/SessionManager.d.ts +2 -33
- package/dist/src/session/SessionManager.d.ts.map +1 -1
- package/dist/src/session/SessionManager.js +14 -238
- package/dist/src/session/SessionManager.js.map +1 -1
- package/dist/src/session/SessionManager.memory.d.ts +67 -0
- package/dist/src/session/SessionManager.memory.d.ts.map +1 -0
- package/dist/src/session/SessionManager.memory.js +262 -0
- package/dist/src/session/SessionManager.memory.js.map +1 -0
- package/dist/src/sync/SyncEngine.d.ts +13 -1
- package/dist/src/sync/SyncEngine.d.ts.map +1 -1
- package/dist/src/sync/SyncEngine.js +50 -1
- package/dist/src/sync/SyncEngine.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.d.ts +5 -6
- package/dist/src/testing/MultiLLMProvider.d.ts.map +1 -1
- package/dist/src/testing/MultiLLMProvider.js +18 -130
- package/dist/src/testing/MultiLLMProvider.js.map +1 -1
- package/dist/src/testing/MultiLLMProvider.metrics.d.ts +33 -0
- package/dist/src/testing/MultiLLMProvider.metrics.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.metrics.js +87 -0
- package/dist/src/testing/MultiLLMProvider.metrics.js.map +1 -0
- package/dist/src/testing/MultiLLMProvider.selection.d.ts +77 -0
- package/dist/src/testing/MultiLLMProvider.selection.d.ts.map +1 -0
- package/dist/src/testing/MultiLLMProvider.selection.js +151 -0
- package/dist/src/testing/MultiLLMProvider.selection.js.map +1 -0
- package/dist/src/types/skill.d.ts +10 -0
- package/dist/src/types/skill.d.ts.map +1 -1
- package/dist/src/types.d.ts +30 -0
- package/dist/src/types.d.ts.map +1 -1
- package/dist/src/versioning/change-classifier.d.ts +38 -0
- package/dist/src/versioning/change-classifier.d.ts.map +1 -0
- package/dist/src/versioning/change-classifier.js +187 -0
- package/dist/src/versioning/change-classifier.js.map +1 -0
- package/dist/src/versioning/change-classifier.test.d.ts +6 -0
- package/dist/src/versioning/change-classifier.test.d.ts.map +1 -0
- package/dist/src/versioning/change-classifier.test.js +275 -0
- package/dist/src/versioning/change-classifier.test.js.map +1 -0
- package/dist/src/versioning/update-risk.d.ts +50 -0
- package/dist/src/versioning/update-risk.d.ts.map +1 -0
- package/dist/src/versioning/update-risk.js +80 -0
- package/dist/src/versioning/update-risk.js.map +1 -0
- package/dist/src/versioning/update-risk.test.d.ts +6 -0
- package/dist/src/versioning/update-risk.test.d.ts.map +1 -0
- package/dist/src/versioning/update-risk.test.js +200 -0
- package/dist/src/versioning/update-risk.test.js.map +1 -0
- package/dist/tests/AuditLogger.edge-cases.test.d.ts +10 -0
- package/dist/tests/AuditLogger.edge-cases.test.d.ts.map +1 -0
- package/dist/tests/AuditLogger.edge-cases.test.js +183 -0
- package/dist/tests/AuditLogger.edge-cases.test.js.map +1 -0
- package/dist/tests/CacheManager.test.d.ts +9 -0
- package/dist/tests/CacheManager.test.d.ts.map +1 -0
- package/dist/tests/CacheManager.test.js +163 -0
- package/dist/tests/CacheManager.test.js.map +1 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.d.ts +10 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.d.ts.map +1 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.js +255 -0
- package/dist/tests/GitHubIndexer.edge-cases.test.js.map +1 -0
- package/dist/tests/SearchService.test.js +71 -0
- package/dist/tests/SearchService.test.js.map +1 -1
- package/dist/tests/SkillVersionRepository.test.d.ts +0 -11
- package/dist/tests/SkillVersionRepository.test.d.ts.map +1 -1
- package/dist/tests/SkillVersionRepository.test.js +131 -194
- package/dist/tests/SkillVersionRepository.test.js.map +1 -1
- package/dist/tests/api/client.health.test.d.ts +15 -0
- package/dist/tests/api/client.health.test.d.ts.map +1 -0
- package/dist/tests/api/client.health.test.js +111 -0
- package/dist/tests/api/client.health.test.js.map +1 -0
- package/dist/tests/db/betterSqlite3Driver.test.d.ts +8 -0
- package/dist/tests/db/betterSqlite3Driver.test.d.ts.map +1 -0
- package/dist/tests/db/betterSqlite3Driver.test.js +88 -0
- package/dist/tests/db/betterSqlite3Driver.test.js.map +1 -0
- package/dist/tests/db/database-abstraction.test.js +12 -0
- package/dist/tests/db/database-abstraction.test.js.map +1 -1
- package/dist/tests/db/schema-migrations.test.d.ts +10 -0
- package/dist/tests/db/schema-migrations.test.d.ts.map +1 -0
- package/dist/tests/db/schema-migrations.test.js +134 -0
- package/dist/tests/db/schema-migrations.test.js.map +1 -0
- package/dist/tests/db/sqljsDriver.test.d.ts +9 -0
- package/dist/tests/db/sqljsDriver.test.d.ts.map +1 -0
- package/dist/tests/db/sqljsDriver.test.js +75 -0
- package/dist/tests/db/sqljsDriver.test.js.map +1 -0
- package/dist/tests/helpers/database.d.ts +32 -0
- package/dist/tests/helpers/database.d.ts.map +1 -0
- package/dist/tests/helpers/database.js +54 -0
- package/dist/tests/helpers/database.js.map +1 -0
- package/dist/tests/learning/PatternStore.helpers.test.d.ts +17 -0
- package/dist/tests/learning/PatternStore.helpers.test.d.ts.map +1 -0
- package/dist/tests/learning/PatternStore.helpers.test.js +301 -0
- package/dist/tests/learning/PatternStore.helpers.test.js.map +1 -0
- package/dist/tests/repositories/CoInstallRepository.test.d.ts +9 -0
- package/dist/tests/repositories/CoInstallRepository.test.d.ts.map +1 -0
- package/dist/tests/repositories/CoInstallRepository.test.js +126 -0
- package/dist/tests/repositories/CoInstallRepository.test.js.map +1 -0
- package/dist/tests/routing/LanguageRouter.test.d.ts +9 -0
- package/dist/tests/routing/LanguageRouter.test.d.ts.map +1 -0
- package/dist/tests/routing/LanguageRouter.test.js +150 -0
- package/dist/tests/routing/LanguageRouter.test.js.map +1 -0
- package/dist/tests/session/SessionManager.memory.test.d.ts +11 -0
- package/dist/tests/session/SessionManager.memory.test.d.ts.map +1 -0
- package/dist/tests/session/SessionManager.memory.test.js +219 -0
- package/dist/tests/session/SessionManager.memory.test.js.map +1 -0
- package/dist/tests/sync/SyncEngine.test.js +32 -18
- package/dist/tests/sync/SyncEngine.test.js.map +1 -1
- package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts +13 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.d.ts.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.js +149 -0
- package/dist/tests/testing/MultiLLMProvider.metrics.test.js.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts +15 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.d.ts.map +1 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.js +249 -0
- package/dist/tests/testing/MultiLLMProvider.selection.test.js.map +1 -0
- package/dist/tests/unit/quarantine-query-builder.test.d.ts +10 -0
- package/dist/tests/unit/quarantine-query-builder.test.d.ts.map +1 -0
- package/dist/tests/unit/quarantine-query-builder.test.js +157 -0
- package/dist/tests/unit/quarantine-query-builder.test.js.map +1 -0
- package/package.json +1 -1
|
@@ -35,8 +35,14 @@ export interface Skill {
|
|
|
35
35
|
securityFindingsCount: number;
|
|
36
36
|
securityScannedAt: string | null;
|
|
37
37
|
securityPassed: boolean | null;
|
|
38
|
+
/** SMI-2760: Flat array of compatible IDE/LLM/platform slugs */
|
|
39
|
+
compatibility?: string[];
|
|
38
40
|
createdAt: string;
|
|
39
41
|
updatedAt: string;
|
|
42
|
+
/** SHA-256 hex of the most recently recorded content proxy (optional, populated by SkillVersionRepository) */
|
|
43
|
+
latestContentHash?: string;
|
|
44
|
+
/** Number of distinct content hashes recorded for this skill */
|
|
45
|
+
versionCount?: number;
|
|
40
46
|
}
|
|
41
47
|
export interface SkillCreateInput {
|
|
42
48
|
id?: string;
|
|
@@ -54,6 +60,8 @@ export interface SkillCreateInput {
|
|
|
54
60
|
securityFindingsCount?: number;
|
|
55
61
|
securityScannedAt?: string | null;
|
|
56
62
|
securityPassed?: boolean | null;
|
|
63
|
+
/** SMI-2760: Flat array of compatible IDE/LLM/platform slugs */
|
|
64
|
+
compatibility?: string[];
|
|
57
65
|
}
|
|
58
66
|
export interface SkillUpdateInput {
|
|
59
67
|
name?: string;
|
|
@@ -70,6 +78,8 @@ export interface SkillUpdateInput {
|
|
|
70
78
|
securityFindingsCount?: number;
|
|
71
79
|
securityScannedAt?: string | null;
|
|
72
80
|
securityPassed?: boolean | null;
|
|
81
|
+
/** SMI-2760: Flat array of compatible IDE/LLM/platform slugs */
|
|
82
|
+
compatibility?: string[];
|
|
73
83
|
}
|
|
74
84
|
export interface SearchOptions {
|
|
75
85
|
query: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../../src/types/skill.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;GAOG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,GAAG,SAAS,GAAG,WAAW,GAAG,cAAc,GAAG,SAAS,GAAG,OAAO,CAAA;AAEnG;;;GAGG;AACH,MAAM,MAAM,SAAS,GACjB,cAAc,GACd,SAAS,GACT,eAAe,GACf,UAAU,GACV,UAAU,GACV,qBAAqB,CAAA;AAEzB;;GAEG;AACH,eAAO,MAAM,WAAW,EAAE,SAAS,SAAS,EAOlC,CAAA;AAEV,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,YAAY,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,SAAS,EAAE,SAAS,CAAA;IACpB,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,qDAAqD;IACrD,KAAK,CAAC,EAAE,SAAS,EAAE,CAAA;IACnB,WAAW,EAAE,OAAO,CAAA;IAEpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,qBAAqB,EAAE,MAAM,CAAA;IAC7B,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAA;IAChC,cAAc,EAAE,OAAO,GAAG,IAAI,CAAA;IAC9B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"skill.d.ts","sourceRoot":"","sources":["../../../src/types/skill.ts"],"names":[],"mappings":"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"}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -83,6 +83,17 @@ export interface SkillSearchResult {
|
|
|
83
83
|
/** SMI-2734: Registry install ID in 'author/skill-name' format. Only set for registry skills.
|
|
84
84
|
* Undefined for local skills since their author field is not a routable registry owner. */
|
|
85
85
|
installHint?: string;
|
|
86
|
+
/** SMI-2760: Flat array of compatible IDE/LLM/platform slugs (e.g. ["claude-code", "cursor", "claude"]) */
|
|
87
|
+
compatibility?: string[];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* SMI-2760: Compatibility filter for search
|
|
91
|
+
*/
|
|
92
|
+
export interface CompatibilityFilter {
|
|
93
|
+
/** IDE slugs to match (e.g. ['cursor', 'claude-code']) */
|
|
94
|
+
ides?: string[];
|
|
95
|
+
/** LLM slugs to match (e.g. ['claude', 'gpt-4o']) */
|
|
96
|
+
llms?: string[];
|
|
86
97
|
}
|
|
87
98
|
/**
|
|
88
99
|
* Search filters
|
|
@@ -95,6 +106,8 @@ export interface SearchFilters {
|
|
|
95
106
|
safeOnly?: boolean;
|
|
96
107
|
/** SMI-825: Maximum risk score (0-100, lower is safer) */
|
|
97
108
|
maxRiskScore?: number;
|
|
109
|
+
/** SMI-2760: Filter by IDE/LLM compatibility */
|
|
110
|
+
compatibleWith?: CompatibilityFilter;
|
|
98
111
|
}
|
|
99
112
|
/**
|
|
100
113
|
* Search response with timing
|
|
@@ -118,5 +131,22 @@ export interface GetSkillResponse {
|
|
|
118
131
|
timing: {
|
|
119
132
|
totalMs: number;
|
|
120
133
|
};
|
|
134
|
+
/** SMI-2761: Skills frequently installed alongside this one (≥5 co-installs) */
|
|
135
|
+
also_installed?: AlsoInstalledSkill[];
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* SMI-2761: Minimal skill summary used in co-install recommendations
|
|
139
|
+
*/
|
|
140
|
+
export interface AlsoInstalledSkill {
|
|
141
|
+
/** Skill ID (e.g. "anthropic/commit") */
|
|
142
|
+
skillId: string;
|
|
143
|
+
/** Human-readable name */
|
|
144
|
+
name: string;
|
|
145
|
+
/** Short description */
|
|
146
|
+
description?: string;
|
|
147
|
+
/** Author slug */
|
|
148
|
+
author?: string;
|
|
149
|
+
/** Co-install count */
|
|
150
|
+
installCount: number;
|
|
121
151
|
}
|
|
122
152
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/src/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;GAIG;AACH,MAAM,MAAM,SAAS,GACjB,UAAU,GACV,WAAW,GACX,cAAc,GACd,SAAS,GACT,OAAO,CAAA;AAEX;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAM3D,CAAA;AAED;;GAEG;AACH,MAAM,MAAM,aAAa,GACrB,aAAa,GACb,SAAS,GACT,eAAe,GACf,QAAQ,GACR,UAAU,GACV,UAAU,GACV,cAAc,GACd,aAAa,GACb,OAAO,GACP,SAAS,GACT,OAAO,CAAA;AAEX;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,CAAA;IACf,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,aAAa,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,kEAAkE;IAClE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAA;IACtB,6CAA6C;IAC7C,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;IACxB,kCAAkC;IAClC,aAAa,EAAE,MAAM,CAAA;IACrB,sCAAsC;IACtC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,aAAa,CAAA;IACvB,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,cAAc,CAAC,EAAE,cAAc,CAAA;IAC/B,IAAI,EAAE,MAAM,EAAE,CAAA;IACd,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;CAClB;AAED;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,aAAa,CAAA;IACvB,SAAS,EAAE,SAAS,CAAA;IACpB,KAAK,EAAE,MAAM,CAAA;IACb,kFAAkF;IAClF,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,qCAAqC;IACrC,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,wFAAwF;IACxF,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,CAAA;IAC7B;gGAC4F;IAC5F,WAAW,CAAC,EAAE,MAAM,CAAA;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Heuristic change classifier for skill content diffs
|
|
3
|
+
* @module @skillsmith/core/versioning/change-classifier
|
|
4
|
+
* @see SMI-skill-version-tracking Wave 2
|
|
5
|
+
*
|
|
6
|
+
* Compares old and new SKILL.md content to produce a semantic change type:
|
|
7
|
+
* 'major' — structural regression (headings removed, large risk delta)
|
|
8
|
+
* 'minor' — new structure added (headings added only, dep added)
|
|
9
|
+
* 'patch' — body edits with no structural changes
|
|
10
|
+
* 'unknown' — could not classify
|
|
11
|
+
*
|
|
12
|
+
* When the author provides a semver field in SKILL.md frontmatter the
|
|
13
|
+
* caller should pass that through; this module trusts the semver bump
|
|
14
|
+
* over heuristics when it is present and parseable.
|
|
15
|
+
*/
|
|
16
|
+
export type ChangeType = 'major' | 'minor' | 'patch' | 'unknown';
|
|
17
|
+
/**
|
|
18
|
+
* Classify the change between two versions of a SKILL.md.
|
|
19
|
+
*
|
|
20
|
+
* Order of precedence:
|
|
21
|
+
* 1. Author-provided semver in frontmatter (trusted over heuristics)
|
|
22
|
+
* 2. Removed headings → 'major'
|
|
23
|
+
* 3. Risk score delta > 20 → upgrade to 'major'
|
|
24
|
+
* 4. Removed dependencies → 'major'
|
|
25
|
+
* 5. Added headings only → 'minor'
|
|
26
|
+
* 6. Added dependencies → 'minor'
|
|
27
|
+
* 7. Body edits with no structural changes → 'patch'
|
|
28
|
+
* 8. No detectable change → 'patch'
|
|
29
|
+
* 9. Error during classification → 'unknown'
|
|
30
|
+
*
|
|
31
|
+
* @param oldContent Previous SKILL.md content
|
|
32
|
+
* @param newContent Updated SKILL.md content
|
|
33
|
+
* @param oldRiskScore Risk score of the old version (0–100, optional)
|
|
34
|
+
* @param newRiskScore Risk score of the new version (0–100, optional)
|
|
35
|
+
* @returns Semantic change type
|
|
36
|
+
*/
|
|
37
|
+
export declare function classifyChange(oldContent: string, newContent: string, oldRiskScore?: number, newRiskScore?: number): ChangeType;
|
|
38
|
+
//# sourceMappingURL=change-classifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-classifier.d.ts","sourceRoot":"","sources":["../../../src/versioning/change-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAMH,MAAM,MAAM,UAAU,GAAG,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAA;AAgHhE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,EAClB,YAAY,CAAC,EAAE,MAAM,EACrB,YAAY,CAAC,EAAE,MAAM,GACpB,UAAU,CAgDZ"}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Heuristic change classifier for skill content diffs
|
|
3
|
+
* @module @skillsmith/core/versioning/change-classifier
|
|
4
|
+
* @see SMI-skill-version-tracking Wave 2
|
|
5
|
+
*
|
|
6
|
+
* Compares old and new SKILL.md content to produce a semantic change type:
|
|
7
|
+
* 'major' — structural regression (headings removed, large risk delta)
|
|
8
|
+
* 'minor' — new structure added (headings added only, dep added)
|
|
9
|
+
* 'patch' — body edits with no structural changes
|
|
10
|
+
* 'unknown' — could not classify
|
|
11
|
+
*
|
|
12
|
+
* When the author provides a semver field in SKILL.md frontmatter the
|
|
13
|
+
* caller should pass that through; this module trusts the semver bump
|
|
14
|
+
* over heuristics when it is present and parseable.
|
|
15
|
+
*/
|
|
16
|
+
// ============================================================================
|
|
17
|
+
// Frontmatter parsing
|
|
18
|
+
// ============================================================================
|
|
19
|
+
/** Very thin YAML-style frontmatter reader — only extracts key: value pairs */
|
|
20
|
+
function parseFrontmatter(content) {
|
|
21
|
+
const result = {};
|
|
22
|
+
const match = /^---\r?\n([\s\S]*?)\r?\n---/.exec(content);
|
|
23
|
+
if (!match)
|
|
24
|
+
return result;
|
|
25
|
+
for (const line of match[1].split('\n')) {
|
|
26
|
+
const colonIdx = line.indexOf(':');
|
|
27
|
+
if (colonIdx === -1)
|
|
28
|
+
continue;
|
|
29
|
+
const key = line.slice(0, colonIdx).trim();
|
|
30
|
+
const value = line.slice(colonIdx + 1).trim();
|
|
31
|
+
if (key && value)
|
|
32
|
+
result[key] = value;
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
/** Extract a semver string from frontmatter if present */
|
|
37
|
+
function extractSemver(frontmatter) {
|
|
38
|
+
const raw = frontmatter['version'] ?? frontmatter['semver'] ?? null;
|
|
39
|
+
if (!raw)
|
|
40
|
+
return null;
|
|
41
|
+
// Accept bare semver: 1.2.3 or with optional v prefix
|
|
42
|
+
return /^\s*v?\d+\.\d+\.\d+/.test(raw) ? raw.replace(/^\s*v/, '') : null;
|
|
43
|
+
}
|
|
44
|
+
/** Parse semver into major/minor/patch numbers */
|
|
45
|
+
function parseSemverParts(v) {
|
|
46
|
+
const m = /^(\d+)\.(\d+)\.(\d+)/.exec(v);
|
|
47
|
+
if (!m)
|
|
48
|
+
return null;
|
|
49
|
+
return [Number(m[1]), Number(m[2]), Number(m[3])];
|
|
50
|
+
}
|
|
51
|
+
/** Derive ChangeType from two semver strings */
|
|
52
|
+
function classifyBySemver(oldSemver, newSemver) {
|
|
53
|
+
const oldParts = parseSemverParts(oldSemver);
|
|
54
|
+
const newParts = parseSemverParts(newSemver);
|
|
55
|
+
if (!oldParts || !newParts)
|
|
56
|
+
return null;
|
|
57
|
+
if (newParts[0] > oldParts[0])
|
|
58
|
+
return 'major';
|
|
59
|
+
if (newParts[0] < oldParts[0])
|
|
60
|
+
return 'major'; // downgrade also = major
|
|
61
|
+
if (newParts[1] > oldParts[1])
|
|
62
|
+
return 'minor';
|
|
63
|
+
if (newParts[1] < oldParts[1])
|
|
64
|
+
return 'minor'; // minor downgrade = minor
|
|
65
|
+
if (newParts[2] !== oldParts[2])
|
|
66
|
+
return 'patch';
|
|
67
|
+
return 'patch'; // identical semver → treat as patch (re-record)
|
|
68
|
+
}
|
|
69
|
+
// ============================================================================
|
|
70
|
+
// Heading extraction
|
|
71
|
+
// ============================================================================
|
|
72
|
+
/** Extract H2/H3 heading text from markdown */
|
|
73
|
+
function extractHeadings(content) {
|
|
74
|
+
const headings = new Set();
|
|
75
|
+
for (const line of content.split('\n')) {
|
|
76
|
+
const m = /^#{2,3}\s+(.+)/.exec(line);
|
|
77
|
+
if (m)
|
|
78
|
+
headings.add(m[1].trim().toLowerCase());
|
|
79
|
+
}
|
|
80
|
+
return headings;
|
|
81
|
+
}
|
|
82
|
+
// ============================================================================
|
|
83
|
+
// Dependency extraction
|
|
84
|
+
// ============================================================================
|
|
85
|
+
/**
|
|
86
|
+
* Extract dependency names from SKILL.md.
|
|
87
|
+
*
|
|
88
|
+
* Looks for lines that match common dependency list patterns:
|
|
89
|
+
* - `- dep-name` inside a "## Dependencies" or "## Requirements" section
|
|
90
|
+
* - `dependencies: [dep1, dep2]` in frontmatter
|
|
91
|
+
*/
|
|
92
|
+
function extractDependencies(content, frontmatter) {
|
|
93
|
+
const deps = new Set();
|
|
94
|
+
// Frontmatter array-style: dependencies: [a, b]
|
|
95
|
+
const fmDeps = frontmatter['dependencies'] ?? frontmatter['requires'] ?? '';
|
|
96
|
+
if (fmDeps) {
|
|
97
|
+
for (const d of fmDeps.replace(/[[\]]/g, '').split(',')) {
|
|
98
|
+
const trimmed = d.trim();
|
|
99
|
+
if (trimmed)
|
|
100
|
+
deps.add(trimmed.toLowerCase());
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
// Body: lines under a dependencies/requirements heading
|
|
104
|
+
let inDepsSection = false;
|
|
105
|
+
for (const line of content.split('\n')) {
|
|
106
|
+
if (/^#{1,3}\s+(dependencies|requirements|requires)/i.test(line)) {
|
|
107
|
+
inDepsSection = true;
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
if (/^#{1,3}\s+/.test(line)) {
|
|
111
|
+
inDepsSection = false;
|
|
112
|
+
continue;
|
|
113
|
+
}
|
|
114
|
+
if (inDepsSection) {
|
|
115
|
+
const m = /^[-*]\s+(\S+)/.exec(line);
|
|
116
|
+
if (m)
|
|
117
|
+
deps.add(m[1].trim().toLowerCase());
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return deps;
|
|
121
|
+
}
|
|
122
|
+
// ============================================================================
|
|
123
|
+
// Public API
|
|
124
|
+
// ============================================================================
|
|
125
|
+
/**
|
|
126
|
+
* Classify the change between two versions of a SKILL.md.
|
|
127
|
+
*
|
|
128
|
+
* Order of precedence:
|
|
129
|
+
* 1. Author-provided semver in frontmatter (trusted over heuristics)
|
|
130
|
+
* 2. Removed headings → 'major'
|
|
131
|
+
* 3. Risk score delta > 20 → upgrade to 'major'
|
|
132
|
+
* 4. Removed dependencies → 'major'
|
|
133
|
+
* 5. Added headings only → 'minor'
|
|
134
|
+
* 6. Added dependencies → 'minor'
|
|
135
|
+
* 7. Body edits with no structural changes → 'patch'
|
|
136
|
+
* 8. No detectable change → 'patch'
|
|
137
|
+
* 9. Error during classification → 'unknown'
|
|
138
|
+
*
|
|
139
|
+
* @param oldContent Previous SKILL.md content
|
|
140
|
+
* @param newContent Updated SKILL.md content
|
|
141
|
+
* @param oldRiskScore Risk score of the old version (0–100, optional)
|
|
142
|
+
* @param newRiskScore Risk score of the new version (0–100, optional)
|
|
143
|
+
* @returns Semantic change type
|
|
144
|
+
*/
|
|
145
|
+
export function classifyChange(oldContent, newContent, oldRiskScore, newRiskScore) {
|
|
146
|
+
try {
|
|
147
|
+
const oldFm = parseFrontmatter(oldContent);
|
|
148
|
+
const newFm = parseFrontmatter(newContent);
|
|
149
|
+
// 1. Trust author-provided semver — only when the semver actually changed
|
|
150
|
+
const oldSemver = extractSemver(oldFm);
|
|
151
|
+
const newSemver = extractSemver(newFm);
|
|
152
|
+
if (oldSemver && newSemver && oldSemver !== newSemver) {
|
|
153
|
+
const fromSemver = classifyBySemver(oldSemver, newSemver);
|
|
154
|
+
if (fromSemver)
|
|
155
|
+
return fromSemver;
|
|
156
|
+
}
|
|
157
|
+
// 2. Heading analysis
|
|
158
|
+
const oldHeadings = extractHeadings(oldContent);
|
|
159
|
+
const newHeadings = extractHeadings(newContent);
|
|
160
|
+
const removedHeadings = [...oldHeadings].filter((h) => !newHeadings.has(h));
|
|
161
|
+
const addedHeadings = [...newHeadings].filter((h) => !oldHeadings.has(h));
|
|
162
|
+
if (removedHeadings.length > 0)
|
|
163
|
+
return 'major';
|
|
164
|
+
// 3. Risk score delta — large increase signals a major change
|
|
165
|
+
if (typeof oldRiskScore === 'number' &&
|
|
166
|
+
typeof newRiskScore === 'number' &&
|
|
167
|
+
newRiskScore - oldRiskScore > 20) {
|
|
168
|
+
return 'major';
|
|
169
|
+
}
|
|
170
|
+
// 4. Dependency analysis
|
|
171
|
+
const oldDeps = extractDependencies(oldContent, oldFm);
|
|
172
|
+
const newDeps = extractDependencies(newContent, newFm);
|
|
173
|
+
const removedDeps = [...oldDeps].filter((d) => !newDeps.has(d));
|
|
174
|
+
const addedDeps = [...newDeps].filter((d) => !oldDeps.has(d));
|
|
175
|
+
if (removedDeps.length > 0)
|
|
176
|
+
return 'major';
|
|
177
|
+
// 5–6. Additions-only → minor
|
|
178
|
+
if (addedHeadings.length > 0 || addedDeps.length > 0)
|
|
179
|
+
return 'minor';
|
|
180
|
+
// 7–8. Any textual change or no change → patch
|
|
181
|
+
return 'patch';
|
|
182
|
+
}
|
|
183
|
+
catch {
|
|
184
|
+
return 'unknown';
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=change-classifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-classifier.js","sourceRoot":"","sources":["../../../src/versioning/change-classifier.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAQH,+EAA+E;AAC/E,sBAAsB;AACtB,+EAA+E;AAE/E,+EAA+E;AAC/E,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,MAAM,GAA2B,EAAE,CAAA;IACzC,MAAM,KAAK,GAAG,6BAA6B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;IACzD,IAAI,CAAC,KAAK;QAAE,OAAO,MAAM,CAAA;IAEzB,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAClC,IAAI,QAAQ,KAAK,CAAC,CAAC;YAAE,SAAQ;QAC7B,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAA;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QAC7C,IAAI,GAAG,IAAI,KAAK;YAAE,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAA;IACvC,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC;AAED,0DAA0D;AAC1D,SAAS,aAAa,CAAC,WAAmC;IACxD,MAAM,GAAG,GAAG,WAAW,CAAC,SAAS,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAA;IACnE,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAA;IACrB,sDAAsD;IACtD,OAAO,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;AAC1E,CAAC;AAED,kDAAkD;AAClD,SAAS,gBAAgB,CAAC,CAAS;IACjC,MAAM,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACxC,IAAI,CAAC,CAAC;QAAE,OAAO,IAAI,CAAA;IACnB,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;AACnD,CAAC;AAED,gDAAgD;AAChD,SAAS,gBAAgB,CAAC,SAAiB,EAAE,SAAiB;IAC5D,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAA;IAC5C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAA;IAC5C,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAA;IAEvC,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAA;IAC7C,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAA,CAAC,yBAAyB;IACvE,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAA;IAC7C,IAAI,QAAQ,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAA,CAAC,0BAA0B;IACxE,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,OAAO,CAAA;IAC/C,OAAO,OAAO,CAAA,CAAC,gDAAgD;AACjE,CAAC;AAED,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,+CAA+C;AAC/C,SAAS,eAAe,CAAC,OAAe;IACtC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAA;IAClC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,CAAC,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QACrC,IAAI,CAAC;YAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,QAAQ,CAAA;AACjB,CAAC;AAED,+EAA+E;AAC/E,wBAAwB;AACxB,+EAA+E;AAE/E;;;;;;GAMG;AACH,SAAS,mBAAmB,CAAC,OAAe,EAAE,WAAmC;IAC/E,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAE9B,gDAAgD;IAChD,MAAM,MAAM,GAAG,WAAW,CAAC,cAAc,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAA;IAC3E,IAAI,MAAM,EAAE,CAAC;QACX,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YACxD,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;YACxB,IAAI,OAAO;gBAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAA;QAC9C,CAAC;IACH,CAAC;IAED,wDAAwD;IACxD,IAAI,aAAa,GAAG,KAAK,CAAA;IACzB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,IAAI,iDAAiD,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACjE,aAAa,GAAG,IAAI,CAAA;YACpB,SAAQ;QACV,CAAC;QACD,IAAI,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5B,aAAa,GAAG,KAAK,CAAA;YACrB,SAAQ;QACV,CAAC;QACD,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;YACpC,IAAI,CAAC;gBAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAA;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAA;AACb,CAAC;AAED,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,cAAc,CAC5B,UAAkB,EAClB,UAAkB,EAClB,YAAqB,EACrB,YAAqB;IAErB,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAC1C,MAAM,KAAK,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAA;QAE1C,0EAA0E;QAC1E,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;QACtC,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,CAAC,CAAA;QACtC,IAAI,SAAS,IAAI,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YACtD,MAAM,UAAU,GAAG,gBAAgB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;YACzD,IAAI,UAAU;gBAAE,OAAO,UAAU,CAAA;QACnC,CAAC;QAED,sBAAsB;QACtB,MAAM,WAAW,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;QAC/C,MAAM,WAAW,GAAG,eAAe,CAAC,UAAU,CAAC,CAAA;QAE/C,MAAM,eAAe,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC3E,MAAM,aAAa,GAAG,CAAC,GAAG,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAEzE,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAA;QAE9C,8DAA8D;QAC9D,IACE,OAAO,YAAY,KAAK,QAAQ;YAChC,OAAO,YAAY,KAAK,QAAQ;YAChC,YAAY,GAAG,YAAY,GAAG,EAAE,EAChC,CAAC;YACD,OAAO,OAAO,CAAA;QAChB,CAAC;QAED,yBAAyB;QACzB,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;QACtD,MAAM,OAAO,GAAG,mBAAmB,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;QAEtD,MAAM,WAAW,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAC/D,MAAM,SAAS,GAAG,CAAC,GAAG,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QAE7D,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAA;QAE1C,8BAA8B;QAC9B,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,OAAO,CAAA;QAEpE,+CAA+C;QAC/C,OAAO,OAAO,CAAA;IAChB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAA;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-classifier.test.d.ts","sourceRoot":"","sources":["../../../src/versioning/change-classifier.test.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Tests for change-classifier.ts
|
|
3
|
+
* @see SMI-skill-version-tracking Wave 2
|
|
4
|
+
*/
|
|
5
|
+
import { describe, it, expect } from 'vitest';
|
|
6
|
+
import { classifyChange } from './change-classifier.js';
|
|
7
|
+
// ============================================================================
|
|
8
|
+
// Fixtures
|
|
9
|
+
// ============================================================================
|
|
10
|
+
const BASE_SKILL = `---
|
|
11
|
+
name: test-skill
|
|
12
|
+
version: 1.0.0
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Overview
|
|
16
|
+
|
|
17
|
+
This is a test skill.
|
|
18
|
+
|
|
19
|
+
## Usage
|
|
20
|
+
|
|
21
|
+
Run with /test.
|
|
22
|
+
|
|
23
|
+
## Configuration
|
|
24
|
+
|
|
25
|
+
Set env vars.
|
|
26
|
+
`;
|
|
27
|
+
const WITH_HEADING_REMOVED = `---
|
|
28
|
+
name: test-skill
|
|
29
|
+
version: 1.0.0
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## Overview
|
|
33
|
+
|
|
34
|
+
This is a test skill.
|
|
35
|
+
|
|
36
|
+
## Usage
|
|
37
|
+
|
|
38
|
+
Run with /test.
|
|
39
|
+
`;
|
|
40
|
+
const WITH_HEADING_ADDED = `---
|
|
41
|
+
name: test-skill
|
|
42
|
+
version: 1.0.0
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
## Overview
|
|
46
|
+
|
|
47
|
+
This is a test skill.
|
|
48
|
+
|
|
49
|
+
## Usage
|
|
50
|
+
|
|
51
|
+
Run with /test.
|
|
52
|
+
|
|
53
|
+
## Configuration
|
|
54
|
+
|
|
55
|
+
Set env vars.
|
|
56
|
+
|
|
57
|
+
## Examples
|
|
58
|
+
|
|
59
|
+
Here are examples.
|
|
60
|
+
`;
|
|
61
|
+
const WITH_BODY_EDIT_ONLY = `---
|
|
62
|
+
name: test-skill
|
|
63
|
+
version: 1.0.0
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Overview
|
|
67
|
+
|
|
68
|
+
This is an UPDATED test skill.
|
|
69
|
+
|
|
70
|
+
## Usage
|
|
71
|
+
|
|
72
|
+
Run with /test command.
|
|
73
|
+
|
|
74
|
+
## Configuration
|
|
75
|
+
|
|
76
|
+
Set your env vars here.
|
|
77
|
+
`;
|
|
78
|
+
const WITH_SEMVER_MAJOR = `---
|
|
79
|
+
name: test-skill
|
|
80
|
+
version: 2.0.0
|
|
81
|
+
---
|
|
82
|
+
|
|
83
|
+
## Overview
|
|
84
|
+
|
|
85
|
+
This is a test skill.
|
|
86
|
+
|
|
87
|
+
## Usage
|
|
88
|
+
|
|
89
|
+
Run with /test.
|
|
90
|
+
|
|
91
|
+
## Configuration
|
|
92
|
+
|
|
93
|
+
Set env vars.
|
|
94
|
+
`;
|
|
95
|
+
const WITH_SEMVER_MINOR = `---
|
|
96
|
+
name: test-skill
|
|
97
|
+
version: 1.1.0
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## Overview
|
|
101
|
+
|
|
102
|
+
This is a test skill.
|
|
103
|
+
|
|
104
|
+
## Usage
|
|
105
|
+
|
|
106
|
+
Run with /test.
|
|
107
|
+
|
|
108
|
+
## Configuration
|
|
109
|
+
|
|
110
|
+
Set env vars.
|
|
111
|
+
`;
|
|
112
|
+
const WITH_SEMVER_PATCH = `---
|
|
113
|
+
name: test-skill
|
|
114
|
+
version: 1.0.1
|
|
115
|
+
---
|
|
116
|
+
|
|
117
|
+
## Overview
|
|
118
|
+
|
|
119
|
+
This is a test skill.
|
|
120
|
+
|
|
121
|
+
## Usage
|
|
122
|
+
|
|
123
|
+
Run with /test.
|
|
124
|
+
|
|
125
|
+
## Configuration
|
|
126
|
+
|
|
127
|
+
Set env vars.
|
|
128
|
+
`;
|
|
129
|
+
const WITH_DEPENDENCY_REMOVED = `---
|
|
130
|
+
name: test-skill
|
|
131
|
+
version: 1.0.0
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Overview
|
|
135
|
+
|
|
136
|
+
A test skill with dependencies.
|
|
137
|
+
|
|
138
|
+
## Dependencies
|
|
139
|
+
|
|
140
|
+
- dep-b
|
|
141
|
+
|
|
142
|
+
## Usage
|
|
143
|
+
|
|
144
|
+
Run with /test.
|
|
145
|
+
`;
|
|
146
|
+
const WITH_DEPENDENCY_ADDED = `---
|
|
147
|
+
name: test-skill
|
|
148
|
+
version: 1.0.0
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## Overview
|
|
152
|
+
|
|
153
|
+
A test skill with dependencies.
|
|
154
|
+
|
|
155
|
+
## Dependencies
|
|
156
|
+
|
|
157
|
+
- dep-a
|
|
158
|
+
- dep-b
|
|
159
|
+
- dep-c
|
|
160
|
+
|
|
161
|
+
## Usage
|
|
162
|
+
|
|
163
|
+
Run with /test.
|
|
164
|
+
`;
|
|
165
|
+
const BASE_WITH_DEPS = `---
|
|
166
|
+
name: test-skill
|
|
167
|
+
version: 1.0.0
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## Overview
|
|
171
|
+
|
|
172
|
+
A test skill with dependencies.
|
|
173
|
+
|
|
174
|
+
## Dependencies
|
|
175
|
+
|
|
176
|
+
- dep-a
|
|
177
|
+
- dep-b
|
|
178
|
+
|
|
179
|
+
## Usage
|
|
180
|
+
|
|
181
|
+
Run with /test.
|
|
182
|
+
`;
|
|
183
|
+
// ============================================================================
|
|
184
|
+
// Tests
|
|
185
|
+
// ============================================================================
|
|
186
|
+
describe('classifyChange', () => {
|
|
187
|
+
describe('heading removal → major', () => {
|
|
188
|
+
it('returns major when a heading is removed', () => {
|
|
189
|
+
expect(classifyChange(BASE_SKILL, WITH_HEADING_REMOVED)).toBe('major');
|
|
190
|
+
});
|
|
191
|
+
it('returns major when multiple headings are removed', () => {
|
|
192
|
+
const twoHeadingsGone = `---
|
|
193
|
+
name: test-skill
|
|
194
|
+
version: 1.0.0
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## Overview
|
|
198
|
+
|
|
199
|
+
Only this remains.
|
|
200
|
+
`;
|
|
201
|
+
expect(classifyChange(BASE_SKILL, twoHeadingsGone)).toBe('major');
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
describe('heading addition only → minor', () => {
|
|
205
|
+
it('returns minor when a heading is added with no removals', () => {
|
|
206
|
+
expect(classifyChange(BASE_SKILL, WITH_HEADING_ADDED)).toBe('minor');
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
describe('body edits only → patch', () => {
|
|
210
|
+
it('returns patch when only body text changes', () => {
|
|
211
|
+
expect(classifyChange(BASE_SKILL, WITH_BODY_EDIT_ONLY)).toBe('patch');
|
|
212
|
+
});
|
|
213
|
+
it('returns patch when content is identical', () => {
|
|
214
|
+
expect(classifyChange(BASE_SKILL, BASE_SKILL)).toBe('patch');
|
|
215
|
+
});
|
|
216
|
+
});
|
|
217
|
+
describe('semver in frontmatter overrides heuristic', () => {
|
|
218
|
+
it('returns major when semver major bumps', () => {
|
|
219
|
+
// semver overrides even if headings look like minor
|
|
220
|
+
expect(classifyChange(BASE_SKILL, WITH_SEMVER_MAJOR)).toBe('major');
|
|
221
|
+
});
|
|
222
|
+
it('returns minor when semver minor bumps', () => {
|
|
223
|
+
expect(classifyChange(BASE_SKILL, WITH_SEMVER_MINOR)).toBe('minor');
|
|
224
|
+
});
|
|
225
|
+
it('returns patch when semver patch bumps', () => {
|
|
226
|
+
expect(classifyChange(BASE_SKILL, WITH_SEMVER_PATCH)).toBe('patch');
|
|
227
|
+
});
|
|
228
|
+
it('semver override applies even when headings were removed (semver wins)', () => {
|
|
229
|
+
// new content: semver 2.0.0 + heading removed — semver says major, heuristic also says major
|
|
230
|
+
const newContent = `---
|
|
231
|
+
name: test-skill
|
|
232
|
+
version: 2.0.0
|
|
233
|
+
---
|
|
234
|
+
|
|
235
|
+
## Overview
|
|
236
|
+
|
|
237
|
+
Only overview.
|
|
238
|
+
`;
|
|
239
|
+
expect(classifyChange(BASE_SKILL, newContent)).toBe('major');
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
describe('risk score delta > 20 → major', () => {
|
|
243
|
+
it('upgrades to major when risk delta exceeds 20', () => {
|
|
244
|
+
// No heading changes but risk jumped significantly
|
|
245
|
+
expect(classifyChange(BASE_SKILL, WITH_BODY_EDIT_ONLY, 10, 35)).toBe('major');
|
|
246
|
+
});
|
|
247
|
+
it('does not upgrade when risk delta is exactly 20', () => {
|
|
248
|
+
expect(classifyChange(BASE_SKILL, WITH_BODY_EDIT_ONLY, 10, 30)).toBe('patch');
|
|
249
|
+
});
|
|
250
|
+
it('does not upgrade when risk decreases', () => {
|
|
251
|
+
expect(classifyChange(BASE_SKILL, WITH_BODY_EDIT_ONLY, 50, 20)).toBe('patch');
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
describe('dependency changes', () => {
|
|
255
|
+
it('returns major when a dependency is removed', () => {
|
|
256
|
+
// No semver change, no heading change, but dep removed
|
|
257
|
+
const base = BASE_WITH_DEPS;
|
|
258
|
+
expect(classifyChange(base, WITH_DEPENDENCY_REMOVED)).toBe('major');
|
|
259
|
+
});
|
|
260
|
+
it('returns minor when a dependency is added', () => {
|
|
261
|
+
const base = BASE_WITH_DEPS;
|
|
262
|
+
expect(classifyChange(base, WITH_DEPENDENCY_ADDED)).toBe('minor');
|
|
263
|
+
});
|
|
264
|
+
});
|
|
265
|
+
describe('error / unknown content', () => {
|
|
266
|
+
it('returns patch for empty content (no headings or semver)', () => {
|
|
267
|
+
expect(classifyChange('', '')).toBe('patch');
|
|
268
|
+
});
|
|
269
|
+
it('returns unknown when classifier throws (simulated by invalid regex-triggering content)', () => {
|
|
270
|
+
// Pass valid strings — classifier should not throw, returns patch
|
|
271
|
+
expect(classifyChange('hello', 'world')).toBe('patch');
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
//# sourceMappingURL=change-classifier.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"change-classifier.test.js","sourceRoot":"","sources":["../../../src/versioning/change-classifier.test.ts"],"names":[],"mappings":"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"}
|