overskill 1.0.0

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.
Files changed (151) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +261 -0
  3. package/dist/commands/add.d.ts +3 -0
  4. package/dist/commands/add.d.ts.map +1 -0
  5. package/dist/commands/add.js +121 -0
  6. package/dist/commands/add.js.map +1 -0
  7. package/dist/commands/bundle.d.ts +3 -0
  8. package/dist/commands/bundle.d.ts.map +1 -0
  9. package/dist/commands/bundle.js +58 -0
  10. package/dist/commands/bundle.js.map +1 -0
  11. package/dist/commands/config.d.ts +3 -0
  12. package/dist/commands/config.d.ts.map +1 -0
  13. package/dist/commands/config.js +109 -0
  14. package/dist/commands/config.js.map +1 -0
  15. package/dist/commands/delete.d.ts +3 -0
  16. package/dist/commands/delete.d.ts.map +1 -0
  17. package/dist/commands/delete.js +64 -0
  18. package/dist/commands/delete.js.map +1 -0
  19. package/dist/commands/diff.d.ts +3 -0
  20. package/dist/commands/diff.d.ts.map +1 -0
  21. package/dist/commands/diff.js +93 -0
  22. package/dist/commands/diff.js.map +1 -0
  23. package/dist/commands/edit.d.ts +3 -0
  24. package/dist/commands/edit.d.ts.map +1 -0
  25. package/dist/commands/edit.js +69 -0
  26. package/dist/commands/edit.js.map +1 -0
  27. package/dist/commands/import.d.ts +3 -0
  28. package/dist/commands/import.d.ts.map +1 -0
  29. package/dist/commands/import.js +514 -0
  30. package/dist/commands/import.js.map +1 -0
  31. package/dist/commands/info.d.ts +3 -0
  32. package/dist/commands/info.d.ts.map +1 -0
  33. package/dist/commands/info.js +89 -0
  34. package/dist/commands/info.js.map +1 -0
  35. package/dist/commands/init.d.ts +3 -0
  36. package/dist/commands/init.d.ts.map +1 -0
  37. package/dist/commands/init.js +88 -0
  38. package/dist/commands/init.js.map +1 -0
  39. package/dist/commands/list.d.ts +3 -0
  40. package/dist/commands/list.d.ts.map +1 -0
  41. package/dist/commands/list.js +84 -0
  42. package/dist/commands/list.js.map +1 -0
  43. package/dist/commands/login.d.ts +3 -0
  44. package/dist/commands/login.d.ts.map +1 -0
  45. package/dist/commands/login.js +143 -0
  46. package/dist/commands/login.js.map +1 -0
  47. package/dist/commands/new.d.ts +3 -0
  48. package/dist/commands/new.d.ts.map +1 -0
  49. package/dist/commands/new.js +262 -0
  50. package/dist/commands/new.js.map +1 -0
  51. package/dist/commands/publish.d.ts +3 -0
  52. package/dist/commands/publish.d.ts.map +1 -0
  53. package/dist/commands/publish.js +215 -0
  54. package/dist/commands/publish.js.map +1 -0
  55. package/dist/commands/push.d.ts +3 -0
  56. package/dist/commands/push.d.ts.map +1 -0
  57. package/dist/commands/push.js +151 -0
  58. package/dist/commands/push.js.map +1 -0
  59. package/dist/commands/registry.d.ts +3 -0
  60. package/dist/commands/registry.d.ts.map +1 -0
  61. package/dist/commands/registry.js +169 -0
  62. package/dist/commands/registry.js.map +1 -0
  63. package/dist/commands/remove.d.ts +3 -0
  64. package/dist/commands/remove.d.ts.map +1 -0
  65. package/dist/commands/remove.js +48 -0
  66. package/dist/commands/remove.js.map +1 -0
  67. package/dist/commands/search.d.ts +3 -0
  68. package/dist/commands/search.d.ts.map +1 -0
  69. package/dist/commands/search.js +48 -0
  70. package/dist/commands/search.js.map +1 -0
  71. package/dist/commands/sync.d.ts +3 -0
  72. package/dist/commands/sync.d.ts.map +1 -0
  73. package/dist/commands/sync.js +160 -0
  74. package/dist/commands/sync.js.map +1 -0
  75. package/dist/commands/update.d.ts +3 -0
  76. package/dist/commands/update.d.ts.map +1 -0
  77. package/dist/commands/update.js +130 -0
  78. package/dist/commands/update.js.map +1 -0
  79. package/dist/commands/validate.d.ts +3 -0
  80. package/dist/commands/validate.d.ts.map +1 -0
  81. package/dist/commands/validate.js +94 -0
  82. package/dist/commands/validate.js.map +1 -0
  83. package/dist/index.d.ts +3 -0
  84. package/dist/index.d.ts.map +1 -0
  85. package/dist/index.js +56 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/lib/api.d.ts +60 -0
  88. package/dist/lib/api.d.ts.map +1 -0
  89. package/dist/lib/api.js +340 -0
  90. package/dist/lib/api.js.map +1 -0
  91. package/dist/lib/auth.d.ts +78 -0
  92. package/dist/lib/auth.d.ts.map +1 -0
  93. package/dist/lib/auth.js +241 -0
  94. package/dist/lib/auth.js.map +1 -0
  95. package/dist/lib/config.d.ts +94 -0
  96. package/dist/lib/config.d.ts.map +1 -0
  97. package/dist/lib/config.js +294 -0
  98. package/dist/lib/config.js.map +1 -0
  99. package/dist/lib/editor.d.ts +6 -0
  100. package/dist/lib/editor.d.ts.map +1 -0
  101. package/dist/lib/editor.js +60 -0
  102. package/dist/lib/editor.js.map +1 -0
  103. package/dist/lib/fs.d.ts +74 -0
  104. package/dist/lib/fs.d.ts.map +1 -0
  105. package/dist/lib/fs.js +235 -0
  106. package/dist/lib/fs.js.map +1 -0
  107. package/dist/lib/index-gen.d.ts +18 -0
  108. package/dist/lib/index-gen.d.ts.map +1 -0
  109. package/dist/lib/index-gen.js +75 -0
  110. package/dist/lib/index-gen.js.map +1 -0
  111. package/dist/lib/local-registry/index.d.ts +15 -0
  112. package/dist/lib/local-registry/index.d.ts.map +1 -0
  113. package/dist/lib/local-registry/index.js +18 -0
  114. package/dist/lib/local-registry/index.js.map +1 -0
  115. package/dist/lib/local-registry/objects.d.ts +51 -0
  116. package/dist/lib/local-registry/objects.d.ts.map +1 -0
  117. package/dist/lib/local-registry/objects.js +148 -0
  118. package/dist/lib/local-registry/objects.js.map +1 -0
  119. package/dist/lib/local-registry/paths.d.ts +53 -0
  120. package/dist/lib/local-registry/paths.d.ts.map +1 -0
  121. package/dist/lib/local-registry/paths.js +85 -0
  122. package/dist/lib/local-registry/paths.js.map +1 -0
  123. package/dist/lib/local-registry/skills.d.ts +83 -0
  124. package/dist/lib/local-registry/skills.d.ts.map +1 -0
  125. package/dist/lib/local-registry/skills.js +261 -0
  126. package/dist/lib/local-registry/skills.js.map +1 -0
  127. package/dist/lib/local-registry/types.d.ts +79 -0
  128. package/dist/lib/local-registry/types.d.ts.map +1 -0
  129. package/dist/lib/local-registry/types.js +5 -0
  130. package/dist/lib/local-registry/types.js.map +1 -0
  131. package/dist/lib/local-registry/versions.d.ts +61 -0
  132. package/dist/lib/local-registry/versions.d.ts.map +1 -0
  133. package/dist/lib/local-registry/versions.js +163 -0
  134. package/dist/lib/local-registry/versions.js.map +1 -0
  135. package/dist/lib/lockfile.d.ts +38 -0
  136. package/dist/lib/lockfile.d.ts.map +1 -0
  137. package/dist/lib/lockfile.js +102 -0
  138. package/dist/lib/lockfile.js.map +1 -0
  139. package/dist/lib/meta-skill.d.ts +6 -0
  140. package/dist/lib/meta-skill.d.ts.map +1 -0
  141. package/dist/lib/meta-skill.js +72 -0
  142. package/dist/lib/meta-skill.js.map +1 -0
  143. package/dist/lib/semver.d.ts +63 -0
  144. package/dist/lib/semver.d.ts.map +1 -0
  145. package/dist/lib/semver.js +107 -0
  146. package/dist/lib/semver.js.map +1 -0
  147. package/dist/types.d.ts +147 -0
  148. package/dist/types.d.ts.map +1 -0
  149. package/dist/types.js +8 -0
  150. package/dist/types.js.map +1 -0
  151. package/package.json +57 -0
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Types for the local registry module
3
+ */
4
+ /**
5
+ * Provenance information - tracks where a skill version came from
6
+ */
7
+ export interface Provenance {
8
+ kind: 'local' | 'cloud';
9
+ source: string;
10
+ fetchedAt?: string;
11
+ publishedBy?: string;
12
+ }
13
+ /**
14
+ * A single version entry in versions.yaml
15
+ */
16
+ export interface VersionEntry {
17
+ version: string;
18
+ sha256: string;
19
+ createdAt: string;
20
+ provenance: Provenance;
21
+ changelog?: string;
22
+ }
23
+ /**
24
+ * The structure of versions.yaml
25
+ */
26
+ export interface VersionsFile {
27
+ versions: VersionEntry[];
28
+ }
29
+ /**
30
+ * Skill metadata stored in meta.yaml
31
+ */
32
+ export interface LocalSkillMeta {
33
+ slug: string;
34
+ name: string;
35
+ description?: string;
36
+ tags: string[];
37
+ compat: string[];
38
+ updatedAt: string;
39
+ }
40
+ /**
41
+ * Parameters for putting a new version
42
+ */
43
+ export interface PutVersionParams {
44
+ slug: string;
45
+ version: string;
46
+ content: string;
47
+ meta: Omit<LocalSkillMeta, 'slug' | 'updatedAt'>;
48
+ provenance?: Partial<Provenance>;
49
+ changelog?: string;
50
+ }
51
+ /**
52
+ * Result of getting a version
53
+ */
54
+ export interface GetVersionResult {
55
+ content: string;
56
+ meta: LocalSkillMeta;
57
+ sha256: string;
58
+ version: string;
59
+ provenance: Provenance;
60
+ }
61
+ /**
62
+ * Summary of a skill in the registry
63
+ */
64
+ export interface SkillSummary {
65
+ slug: string;
66
+ latestVersion: string;
67
+ meta: LocalSkillMeta;
68
+ versionCount: number;
69
+ }
70
+ /**
71
+ * Search result
72
+ */
73
+ export interface SearchResult {
74
+ slug: string;
75
+ latestVersion: string;
76
+ meta: LocalSkillMeta;
77
+ matchedOn: 'slug' | 'name' | 'tags' | 'description';
78
+ }
79
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/local-registry/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,UAAU,CAAC;IACvB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,WAAW,CAAC,CAAC;IACjD,UAAU,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,cAAc,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,UAAU,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,cAAc,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,cAAc,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,aAAa,CAAC;CACrD"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Types for the local registry module
3
+ */
4
+ export {};
5
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/local-registry/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -0,0 +1,61 @@
1
+ /**
2
+ * Version management for skills in the local registry
3
+ */
4
+ import type { VersionEntry, VersionsFile, Provenance } from './types.js';
5
+ /**
6
+ * Read versions.yaml for a skill
7
+ */
8
+ export declare function readVersionsFile(slug: string): VersionsFile | null;
9
+ /**
10
+ * Write versions.yaml for a skill (atomic)
11
+ */
12
+ export declare function writeVersionsFile(slug: string, data: VersionsFile): void;
13
+ /**
14
+ * Get all versions for a skill
15
+ */
16
+ export declare function getAllVersions(slug: string): VersionEntry[];
17
+ /**
18
+ * Get all version strings for a skill (sorted descending)
19
+ */
20
+ export declare function getVersionStrings(slug: string): string[];
21
+ /**
22
+ * Get the latest version for a skill (highest semver)
23
+ */
24
+ export declare function getLatestVersion(slug: string): string | null;
25
+ /**
26
+ * Get a specific version entry
27
+ */
28
+ export declare function getVersionEntry(slug: string, version: string): VersionEntry | null;
29
+ /**
30
+ * Resolve a version based on a constraint
31
+ *
32
+ * @param slug - Skill slug
33
+ * @param constraint - Optional semver constraint (e.g., "^1.0.0", ">=2.0.0")
34
+ * @returns The resolved version, or null if no match
35
+ */
36
+ export declare function resolveVersion(slug: string, constraint?: string): string | null;
37
+ /**
38
+ * Add a new version entry
39
+ */
40
+ export declare function addVersionEntry(slug: string, entry: Omit<VersionEntry, 'createdAt'> & {
41
+ createdAt?: string;
42
+ }): void;
43
+ /**
44
+ * Remove a version entry
45
+ *
46
+ * @returns true if removed, false if didn't exist
47
+ */
48
+ export declare function removeVersionEntry(slug: string, version: string): boolean;
49
+ /**
50
+ * Check if a specific version exists
51
+ */
52
+ export declare function versionExists(slug: string, version: string): boolean;
53
+ /**
54
+ * Get version count for a skill
55
+ */
56
+ export declare function getVersionCount(slug: string): number;
57
+ /**
58
+ * Create default provenance for a locally created skill
59
+ */
60
+ export declare function createLocalProvenance(source?: string): Provenance;
61
+ //# sourceMappingURL=versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../../src/lib/local-registry/versions.ts"],"names":[],"mappings":"AAAA;;GAEG;AAMH,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAEzE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CASlE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,IAAI,CAqBxE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,EAAE,CAG3D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAIxD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAG5D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAGlF;AAED;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc/E;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC9D,IAAI,CA8BN;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAazE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAEpE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,GAAE,MAAkB,GAAG,UAAU,CAK5E"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Version management for skills in the local registry
3
+ */
4
+ import * as fs from 'fs';
5
+ import * as yaml from 'yaml';
6
+ import { getVersionsPath, ensureDir, getSkillDir } from './paths.js';
7
+ import { sortVersionsDesc, maxSatisfying, isValidVersion } from '../semver.js';
8
+ /**
9
+ * Read versions.yaml for a skill
10
+ */
11
+ export function readVersionsFile(slug) {
12
+ const versionsPath = getVersionsPath(slug);
13
+ if (!fs.existsSync(versionsPath)) {
14
+ return null;
15
+ }
16
+ const content = fs.readFileSync(versionsPath, 'utf-8');
17
+ return yaml.parse(content);
18
+ }
19
+ /**
20
+ * Write versions.yaml for a skill (atomic)
21
+ */
22
+ export function writeVersionsFile(slug, data) {
23
+ const versionsPath = getVersionsPath(slug);
24
+ ensureDir(getSkillDir(slug));
25
+ const content = yaml.stringify(data, { lineWidth: 0 });
26
+ // Atomic write
27
+ const tempPath = `${versionsPath}.tmp.${process.pid}.${Date.now()}`;
28
+ try {
29
+ fs.writeFileSync(tempPath, content, 'utf-8');
30
+ fs.renameSync(tempPath, versionsPath);
31
+ }
32
+ catch (error) {
33
+ try {
34
+ if (fs.existsSync(tempPath)) {
35
+ fs.unlinkSync(tempPath);
36
+ }
37
+ }
38
+ catch {
39
+ // Ignore cleanup errors
40
+ }
41
+ throw error;
42
+ }
43
+ }
44
+ /**
45
+ * Get all versions for a skill
46
+ */
47
+ export function getAllVersions(slug) {
48
+ const file = readVersionsFile(slug);
49
+ return file?.versions || [];
50
+ }
51
+ /**
52
+ * Get all version strings for a skill (sorted descending)
53
+ */
54
+ export function getVersionStrings(slug) {
55
+ const entries = getAllVersions(slug);
56
+ const versions = entries.map((e) => e.version);
57
+ return sortVersionsDesc(versions);
58
+ }
59
+ /**
60
+ * Get the latest version for a skill (highest semver)
61
+ */
62
+ export function getLatestVersion(slug) {
63
+ const versions = getVersionStrings(slug);
64
+ return versions[0] || null;
65
+ }
66
+ /**
67
+ * Get a specific version entry
68
+ */
69
+ export function getVersionEntry(slug, version) {
70
+ const entries = getAllVersions(slug);
71
+ return entries.find((e) => e.version === version) || null;
72
+ }
73
+ /**
74
+ * Resolve a version based on a constraint
75
+ *
76
+ * @param slug - Skill slug
77
+ * @param constraint - Optional semver constraint (e.g., "^1.0.0", ">=2.0.0")
78
+ * @returns The resolved version, or null if no match
79
+ */
80
+ export function resolveVersion(slug, constraint) {
81
+ const versions = getVersionStrings(slug);
82
+ if (versions.length === 0) {
83
+ return null;
84
+ }
85
+ if (!constraint) {
86
+ // No constraint = latest version
87
+ return versions[0];
88
+ }
89
+ // Use semver to find the best match
90
+ return maxSatisfying(versions, constraint);
91
+ }
92
+ /**
93
+ * Add a new version entry
94
+ */
95
+ export function addVersionEntry(slug, entry) {
96
+ const file = readVersionsFile(slug) || { versions: [] };
97
+ // Check if version already exists
98
+ const existingIndex = file.versions.findIndex((v) => v.version === entry.version);
99
+ const fullEntry = {
100
+ ...entry,
101
+ createdAt: entry.createdAt || new Date().toISOString(),
102
+ };
103
+ if (existingIndex >= 0) {
104
+ // Update existing version
105
+ file.versions[existingIndex] = fullEntry;
106
+ }
107
+ else {
108
+ // Add new version
109
+ file.versions.push(fullEntry);
110
+ }
111
+ // Sort versions descending (newest first)
112
+ file.versions.sort((a, b) => {
113
+ const aValid = isValidVersion(a.version);
114
+ const bValid = isValidVersion(b.version);
115
+ if (!aValid && !bValid)
116
+ return 0;
117
+ if (!aValid)
118
+ return 1;
119
+ if (!bValid)
120
+ return -1;
121
+ return sortVersionsDesc([a.version, b.version])[0] === a.version ? -1 : 1;
122
+ });
123
+ writeVersionsFile(slug, file);
124
+ }
125
+ /**
126
+ * Remove a version entry
127
+ *
128
+ * @returns true if removed, false if didn't exist
129
+ */
130
+ export function removeVersionEntry(slug, version) {
131
+ const file = readVersionsFile(slug);
132
+ if (!file)
133
+ return false;
134
+ const initialLength = file.versions.length;
135
+ file.versions = file.versions.filter((v) => v.version !== version);
136
+ if (file.versions.length < initialLength) {
137
+ writeVersionsFile(slug, file);
138
+ return true;
139
+ }
140
+ return false;
141
+ }
142
+ /**
143
+ * Check if a specific version exists
144
+ */
145
+ export function versionExists(slug, version) {
146
+ return getVersionEntry(slug, version) !== null;
147
+ }
148
+ /**
149
+ * Get version count for a skill
150
+ */
151
+ export function getVersionCount(slug) {
152
+ return getAllVersions(slug).length;
153
+ }
154
+ /**
155
+ * Create default provenance for a locally created skill
156
+ */
157
+ export function createLocalProvenance(source = 'created') {
158
+ return {
159
+ kind: 'local',
160
+ source,
161
+ };
162
+ }
163
+ //# sourceMappingURL=versions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.js","sourceRoot":"","sources":["../../../src/lib/local-registry/versions.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,38 @@
1
+ import type { SkillsLock, LockedSkill } from '../types.js';
2
+ /**
3
+ * Get the path to .skills.lock
4
+ */
5
+ export declare function getLockfilePath(): string;
6
+ /**
7
+ * Check if lockfile exists
8
+ */
9
+ export declare function lockfileExists(): boolean;
10
+ /**
11
+ * Read .skills.lock
12
+ */
13
+ export declare function readLockfile(): SkillsLock | null;
14
+ /**
15
+ * Write .skills.lock
16
+ */
17
+ export declare function writeLockfile(lock: SkillsLock): void;
18
+ /**
19
+ * Create a new lockfile
20
+ */
21
+ export declare function createLockfile(skills: LockedSkill[]): SkillsLock;
22
+ /**
23
+ * Get a locked skill by slug
24
+ */
25
+ export declare function getLockedSkill(slug: string): LockedSkill | undefined;
26
+ /**
27
+ * Update or add a skill in the lockfile
28
+ */
29
+ export declare function updateLockedSkill(skill: LockedSkill): void;
30
+ /**
31
+ * Remove a skill from the lockfile
32
+ */
33
+ export declare function removeLockedSkill(slug: string, registry?: string): void;
34
+ /**
35
+ * Check if a skill has changed (compare hash)
36
+ */
37
+ export declare function hasSkillChanged(slug: string, registry: string, newHash: string): boolean;
38
+ //# sourceMappingURL=lockfile.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile.d.ts","sourceRoot":"","sources":["../../src/lib/lockfile.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE3D;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAGxC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,UAAU,GAAG,IAAI,CAShD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAMpD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,GAAG,UAAU,CAKhE;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAIpE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,CAoB1D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAcvE;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAIxF"}
@@ -0,0 +1,102 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as yaml from 'yaml';
4
+ import { findProjectRoot } from './config.js';
5
+ /**
6
+ * Get the path to .skills.lock
7
+ */
8
+ export function getLockfilePath() {
9
+ const projectRoot = findProjectRoot() || process.cwd();
10
+ return path.join(projectRoot, '.skills.lock');
11
+ }
12
+ /**
13
+ * Check if lockfile exists
14
+ */
15
+ export function lockfileExists() {
16
+ return fs.existsSync(getLockfilePath());
17
+ }
18
+ /**
19
+ * Read .skills.lock
20
+ */
21
+ export function readLockfile() {
22
+ const lockfilePath = getLockfilePath();
23
+ if (!fs.existsSync(lockfilePath)) {
24
+ return null;
25
+ }
26
+ const content = fs.readFileSync(lockfilePath, 'utf-8');
27
+ return yaml.parse(content);
28
+ }
29
+ /**
30
+ * Write .skills.lock
31
+ */
32
+ export function writeLockfile(lock) {
33
+ const lockfilePath = getLockfilePath();
34
+ const content = `# .skills.lock — auto-generated, commit to repo\n${yaml.stringify(lock, {
35
+ lineWidth: 0,
36
+ })}`;
37
+ fs.writeFileSync(lockfilePath, content, 'utf-8');
38
+ }
39
+ /**
40
+ * Create a new lockfile
41
+ */
42
+ export function createLockfile(skills) {
43
+ return {
44
+ locked_at: new Date().toISOString(),
45
+ skills,
46
+ };
47
+ }
48
+ /**
49
+ * Get a locked skill by slug
50
+ */
51
+ export function getLockedSkill(slug) {
52
+ const lock = readLockfile();
53
+ if (!lock)
54
+ return undefined;
55
+ return lock.skills.find(s => s.slug === slug);
56
+ }
57
+ /**
58
+ * Update or add a skill in the lockfile
59
+ */
60
+ export function updateLockedSkill(skill) {
61
+ let lock = readLockfile();
62
+ if (!lock) {
63
+ lock = createLockfile([skill]);
64
+ }
65
+ else {
66
+ const existingIndex = lock.skills.findIndex(s => s.slug === skill.slug && s.registry === skill.registry);
67
+ if (existingIndex >= 0) {
68
+ lock.skills[existingIndex] = skill;
69
+ }
70
+ else {
71
+ lock.skills.push(skill);
72
+ }
73
+ lock.locked_at = new Date().toISOString();
74
+ }
75
+ writeLockfile(lock);
76
+ }
77
+ /**
78
+ * Remove a skill from the lockfile
79
+ */
80
+ export function removeLockedSkill(slug, registry) {
81
+ const lock = readLockfile();
82
+ if (!lock)
83
+ return;
84
+ if (registry) {
85
+ lock.skills = lock.skills.filter(s => !(s.slug === slug && s.registry === registry));
86
+ }
87
+ else {
88
+ lock.skills = lock.skills.filter(s => s.slug !== slug);
89
+ }
90
+ lock.locked_at = new Date().toISOString();
91
+ writeLockfile(lock);
92
+ }
93
+ /**
94
+ * Check if a skill has changed (compare hash)
95
+ */
96
+ export function hasSkillChanged(slug, registry, newHash) {
97
+ const locked = getLockedSkill(slug);
98
+ if (!locked || locked.registry !== registry)
99
+ return true;
100
+ return locked.sha256 !== newHash;
101
+ }
102
+ //# sourceMappingURL=lockfile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../src/lib/lockfile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * The meta-skill content that teaches AI agents how to use the skills system.
3
+ * This is bundled with the CLI and installed to _system/SKILL.md during sync.
4
+ */
5
+ export declare const META_SKILL_CONTENT = "# Skills System \u2014 Agent Instructions\n\nYou have access to a skills system that provides curated instruction files\nto guide your work. This file explains how to use it.\n\n## Discovering Skills\n\nCheck the file `SKILLS_INDEX.md` in this directory. It lists every skill\ninstalled in this project with its name, description, tags, and file path.\n\nBefore starting any task, scan SKILLS_INDEX.md to identify relevant skills.\nMatch skills to your task by:\n- Name and description (most reliable)\n- Tags (e.g. if working with Supabase, look for \"supabase\" tag)\n- Compatibility (check if your agent type is listed)\n\n## Using Skills\n\nWhen you find a relevant skill:\n1. Read the full SKILL.md file at the path listed in SKILLS_INDEX.md\n2. Follow its instructions as authoritative guidance for your work\n3. If multiple skills are relevant, read all of them before starting\n4. Skills take precedence over your default patterns when they conflict\n\n## Managing Skills (When Asked by the User)\n\nIf the user asks you to manage skills, you have these CLI commands available.\nRun them in the terminal:\n\n### Viewing Available Skills\n- `skills list` \u2014 Show all skills available in remote registries\n- `skills list --installed` \u2014 Show skills installed in this project\n- `skills search <query>` \u2014 Search for skills by keyword\n- `skills info <name>` \u2014 Show full details about a skill\n\n### Installing and Removing\n- `skills add <name>` \u2014 Add a skill to this project and sync it\n- `skills remove <name>` \u2014 Remove a skill from this project\n- `skills sync` \u2014 Re-sync all installed skills from remote\n- `skills update` \u2014 Pull latest versions of all skills\n\n### Editing and Publishing\n- `skills edit <name>` \u2014 Open a skill for editing in the default editor\n- `skills push <name>` \u2014 Publish local edits to the remote registry\n- `skills diff <name>` \u2014 See what changed between local and remote\n- `skills validate <name>` \u2014 Check skill file structure\n\n### Creating New Skills\nTo create a new skill:\n1. Write a SKILL.md file following the format of existing skills\n2. Run `skills push <name> --from-stdin` piping in the content, or\n3. Create the file in the skills folder and run `skills push <name>`\n\nA good SKILL.md includes:\n- A clear title (# heading)\n- A description of what the skill covers\n- Specific, actionable instructions\n- Code examples where relevant\n- Common pitfalls or anti-patterns to avoid\n\n## Rules\n\n- Do NOT modify .skills.yaml directly \u2014 use the CLI commands\n- Do NOT delete or rename skill folders manually\n- Do NOT assume a skill exists without checking SKILLS_INDEX.md\n- The _system folder (where this file lives) is managed by the CLI \u2014 do not modify it\n";
6
+ //# sourceMappingURL=meta-skill.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-skill.d.ts","sourceRoot":"","sources":["../../src/lib/meta-skill.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,kBAAkB,quFAkE9B,CAAC"}
@@ -0,0 +1,72 @@
1
+ /**
2
+ * The meta-skill content that teaches AI agents how to use the skills system.
3
+ * This is bundled with the CLI and installed to _system/SKILL.md during sync.
4
+ */
5
+ export const META_SKILL_CONTENT = `# Skills System — Agent Instructions
6
+
7
+ You have access to a skills system that provides curated instruction files
8
+ to guide your work. This file explains how to use it.
9
+
10
+ ## Discovering Skills
11
+
12
+ Check the file \`SKILLS_INDEX.md\` in this directory. It lists every skill
13
+ installed in this project with its name, description, tags, and file path.
14
+
15
+ Before starting any task, scan SKILLS_INDEX.md to identify relevant skills.
16
+ Match skills to your task by:
17
+ - Name and description (most reliable)
18
+ - Tags (e.g. if working with Supabase, look for "supabase" tag)
19
+ - Compatibility (check if your agent type is listed)
20
+
21
+ ## Using Skills
22
+
23
+ When you find a relevant skill:
24
+ 1. Read the full SKILL.md file at the path listed in SKILLS_INDEX.md
25
+ 2. Follow its instructions as authoritative guidance for your work
26
+ 3. If multiple skills are relevant, read all of them before starting
27
+ 4. Skills take precedence over your default patterns when they conflict
28
+
29
+ ## Managing Skills (When Asked by the User)
30
+
31
+ If the user asks you to manage skills, you have these CLI commands available.
32
+ Run them in the terminal:
33
+
34
+ ### Viewing Available Skills
35
+ - \`skills list\` — Show all skills available in remote registries
36
+ - \`skills list --installed\` — Show skills installed in this project
37
+ - \`skills search <query>\` — Search for skills by keyword
38
+ - \`skills info <name>\` — Show full details about a skill
39
+
40
+ ### Installing and Removing
41
+ - \`skills add <name>\` — Add a skill to this project and sync it
42
+ - \`skills remove <name>\` — Remove a skill from this project
43
+ - \`skills sync\` — Re-sync all installed skills from remote
44
+ - \`skills update\` — Pull latest versions of all skills
45
+
46
+ ### Editing and Publishing
47
+ - \`skills edit <name>\` — Open a skill for editing in the default editor
48
+ - \`skills push <name>\` — Publish local edits to the remote registry
49
+ - \`skills diff <name>\` — See what changed between local and remote
50
+ - \`skills validate <name>\` — Check skill file structure
51
+
52
+ ### Creating New Skills
53
+ To create a new skill:
54
+ 1. Write a SKILL.md file following the format of existing skills
55
+ 2. Run \`skills push <name> --from-stdin\` piping in the content, or
56
+ 3. Create the file in the skills folder and run \`skills push <name>\`
57
+
58
+ A good SKILL.md includes:
59
+ - A clear title (# heading)
60
+ - A description of what the skill covers
61
+ - Specific, actionable instructions
62
+ - Code examples where relevant
63
+ - Common pitfalls or anti-patterns to avoid
64
+
65
+ ## Rules
66
+
67
+ - Do NOT modify .skills.yaml directly — use the CLI commands
68
+ - Do NOT delete or rename skill folders manually
69
+ - Do NOT assume a skill exists without checking SKILLS_INDEX.md
70
+ - The _system folder (where this file lives) is managed by the CLI — do not modify it
71
+ `;
72
+ //# sourceMappingURL=meta-skill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta-skill.js","sourceRoot":"","sources":["../../src/lib/meta-skill.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkEjC,CAAC"}
@@ -0,0 +1,63 @@
1
+ import semver from 'semver';
2
+ /**
3
+ * Check if a version string is valid semver
4
+ */
5
+ export declare function isValidVersion(version: string): boolean;
6
+ /**
7
+ * Parse a version string
8
+ */
9
+ export declare function parseVersion(version: string): semver.SemVer | null;
10
+ /**
11
+ * Compare two versions
12
+ * Returns: -1 if v1 < v2, 0 if equal, 1 if v1 > v2
13
+ */
14
+ export declare function compareVersions(v1: string, v2: string): number;
15
+ /**
16
+ * Check if a version satisfies a constraint
17
+ */
18
+ export declare function satisfies(version: string, constraint: string): boolean;
19
+ /**
20
+ * Get the highest version from a list that satisfies a constraint
21
+ */
22
+ export declare function maxSatisfying(versions: string[], constraint: string): string | null;
23
+ /**
24
+ * Bump a version by type
25
+ */
26
+ export declare function bumpVersion(version: string, type: 'major' | 'minor' | 'patch'): string | null;
27
+ /**
28
+ * Auto-bump version (patch by default)
29
+ */
30
+ export declare function autoBump(version: string): string;
31
+ /**
32
+ * Check if v1 is greater than v2
33
+ */
34
+ export declare function isGreaterThan(v1: string, v2: string): boolean;
35
+ /**
36
+ * Check if v1 is less than v2
37
+ */
38
+ export declare function isLessThan(v1: string, v2: string): boolean;
39
+ /**
40
+ * Check if two versions are equal
41
+ */
42
+ export declare function isEqual(v1: string, v2: string): boolean;
43
+ /**
44
+ * Parse a version constraint
45
+ * Supports: exact (1.0.0), range (>=1.0.0, ^1.0.0, ~1.0.0)
46
+ */
47
+ export declare function parseConstraint(constraint: string): {
48
+ type: 'exact' | 'range';
49
+ value: string;
50
+ };
51
+ /**
52
+ * Resolve a version from a list based on constraint
53
+ */
54
+ export declare function resolveVersion(versions: string[], constraint?: string): string | null;
55
+ /**
56
+ * Sort versions in descending order (newest first)
57
+ */
58
+ export declare function sortVersionsDesc(versions: string[]): string[];
59
+ /**
60
+ * Sort versions in ascending order (oldest first)
61
+ */
62
+ export declare function sortVersionsAsc(versions: string[]): string[];
63
+ //# sourceMappingURL=semver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"semver.d.ts","sourceRoot":"","sources":["../../src/lib/semver.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,QAAQ,CAAC;AAE5B;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,IAAI,CAElE;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAE9D;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAEtE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEnF;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAE7F;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAGhD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAE7D;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED;;GAEG;AACH,wBAAgB,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAEvD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG;IACnD,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;CACf,CAeA;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAAE,EAClB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAcf;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE7D;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAE5D"}