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,60 @@
1
+ export function parseEditorCommand(editor) {
2
+ const tokens = splitCommand(editor);
3
+ if (tokens.length === 0) {
4
+ throw new Error('Editor command is empty.');
5
+ }
6
+ return {
7
+ command: tokens[0],
8
+ args: tokens.slice(1),
9
+ };
10
+ }
11
+ function splitCommand(input) {
12
+ const tokens = [];
13
+ let current = '';
14
+ let quote = null;
15
+ let escape = false;
16
+ for (let i = 0; i < input.length; i++) {
17
+ const char = input[i];
18
+ if (escape) {
19
+ current += char;
20
+ escape = false;
21
+ continue;
22
+ }
23
+ if (char === '\\' && quote !== "'") {
24
+ const nextChar = input[i + 1];
25
+ if (nextChar === '"' ||
26
+ nextChar === "'" ||
27
+ nextChar === '\\' ||
28
+ (typeof nextChar === 'string' && /\s/.test(nextChar))) {
29
+ escape = true;
30
+ continue;
31
+ }
32
+ }
33
+ if (quote) {
34
+ if (char === quote) {
35
+ quote = null;
36
+ }
37
+ else {
38
+ current += char;
39
+ }
40
+ continue;
41
+ }
42
+ if (char === '"' || char === "'") {
43
+ quote = char;
44
+ continue;
45
+ }
46
+ if (/\s/.test(char)) {
47
+ if (current.length > 0) {
48
+ tokens.push(current);
49
+ current = '';
50
+ }
51
+ continue;
52
+ }
53
+ current += char;
54
+ }
55
+ if (current.length > 0) {
56
+ tokens.push(current);
57
+ }
58
+ return tokens;
59
+ }
60
+ //# sourceMappingURL=editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor.js","sourceRoot":"","sources":["../../src/lib/editor.ts"],"names":[],"mappings":"AAKA,MAAM,UAAU,kBAAkB,CAAC,MAAc;IAC/C,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC9C,CAAC;IAED,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,KAAK,GAAqB,IAAI,CAAC;IACnC,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QAEtB,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,IAAI,IAAI,CAAC;YAChB,MAAM,GAAG,KAAK,CAAC;YACf,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACnC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9B,IACE,QAAQ,KAAK,GAAG;gBAChB,QAAQ,KAAK,GAAG;gBAChB,QAAQ,KAAK,IAAI;gBACjB,CAAC,OAAO,QAAQ,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,EACrD,CAAC;gBACD,MAAM,GAAG,IAAI,CAAC;gBACd,SAAS;YACX,CAAC;QACH,CAAC;QAED,IAAI,KAAK,EAAE,CAAC;YACV,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;gBACnB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;iBAAM,CAAC;gBACN,OAAO,IAAI,IAAI,CAAC;YAClB,CAAC;YACD,SAAS;QACX,CAAC;QAED,IAAI,IAAI,KAAK,GAAG,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YACjC,KAAK,GAAG,IAAI,CAAC;YACb,SAAS;QACX,CAAC;QAED,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpB,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;gBACrB,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;YACD,SAAS;QACX,CAAC;QAED,OAAO,IAAI,IAAI,CAAC;IAClB,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACvB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,74 @@
1
+ import type { SkillMeta, SyncSkillResponse } from '../types.js';
2
+ /**
3
+ * Ensure a directory exists
4
+ */
5
+ export declare function ensureDir(dirPath: string): void;
6
+ /**
7
+ * Get the skill directory path
8
+ */
9
+ export declare function getSkillDir(slug: string): string;
10
+ /**
11
+ * Get the system skill directory path
12
+ */
13
+ export declare function getSystemDir(): string;
14
+ /**
15
+ * Write a skill to disk
16
+ */
17
+ export declare function writeSkill(skill: SyncSkillResponse, meta: Omit<SkillMeta, 'sha256'>): void;
18
+ /**
19
+ * Read a skill's content from disk
20
+ */
21
+ export declare function readSkillContent(slug: string): string | null;
22
+ /**
23
+ * Read a skill's metadata from disk
24
+ */
25
+ export declare function readSkillMeta(slug: string): SkillMeta | null;
26
+ /**
27
+ * Delete a skill from disk
28
+ */
29
+ export declare function deleteSkill(slug: string): void;
30
+ /**
31
+ * Check if a skill exists on disk
32
+ */
33
+ export declare function skillExists(slug: string): boolean;
34
+ /**
35
+ * List all skills on disk
36
+ */
37
+ export declare function listLocalSkills(): string[];
38
+ /**
39
+ * Check if a skill is modified locally
40
+ */
41
+ export declare function isSkillModified(slug: string): boolean;
42
+ /**
43
+ * Mark a skill as modified
44
+ */
45
+ export declare function markSkillModified(slug: string): void;
46
+ /**
47
+ * Unmark a skill as modified
48
+ */
49
+ export declare function unmarkSkillModified(slug: string): void;
50
+ /**
51
+ * Write the system (meta) skill
52
+ */
53
+ export declare function writeSystemSkill(content: string): void;
54
+ /**
55
+ * Add .skills/ to .gitignore if not present
56
+ */
57
+ export declare function updateGitignore(installPath: string): void;
58
+ /**
59
+ * Add or update the Overskill section in CLAUDE.md
60
+ */
61
+ export declare function updateClaudeMd(installPath: string): void;
62
+ /**
63
+ * Add or update the Overskill section in AGENTS.md
64
+ */
65
+ export declare function updateAgentsMd(installPath: string): void;
66
+ /**
67
+ * Add or update the Overskill rule in .cursor/rules/
68
+ */
69
+ export declare function updateCursorRules(installPath: string): void;
70
+ /**
71
+ * Compute SHA256 hash of content
72
+ */
73
+ export declare function computeHash(content: string): Promise<string>;
74
+ //# sourceMappingURL=fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.d.ts","sourceRoot":"","sources":["../../src/lib/fs.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhE;;GAEG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAI/C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,MAAM,CAErC;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,KAAK,EAAE,iBAAiB,EACxB,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,GAC9B,IAAI,CAeN;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAM5D;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,IAAI,CAO5D;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAK9C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGjD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,EAAE,CAe1C;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAGpD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAKtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAMtD;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAmBzD;AA+CD;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAIxD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAIxD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAsB3D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAMlE"}
package/dist/lib/fs.js ADDED
@@ -0,0 +1,235 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import * as yaml from 'yaml';
4
+ import { getInstallPath, findProjectRoot } from './config.js';
5
+ /**
6
+ * Ensure a directory exists
7
+ */
8
+ export function ensureDir(dirPath) {
9
+ if (!fs.existsSync(dirPath)) {
10
+ fs.mkdirSync(dirPath, { recursive: true });
11
+ }
12
+ }
13
+ /**
14
+ * Get the skill directory path
15
+ */
16
+ export function getSkillDir(slug) {
17
+ return path.join(getInstallPath(), slug);
18
+ }
19
+ /**
20
+ * Get the system skill directory path
21
+ */
22
+ export function getSystemDir() {
23
+ return path.join(getInstallPath(), '_system');
24
+ }
25
+ /**
26
+ * Write a skill to disk
27
+ */
28
+ export function writeSkill(skill, meta) {
29
+ const skillDir = getSkillDir(skill.slug);
30
+ ensureDir(skillDir);
31
+ // Write SKILL.md
32
+ const skillPath = path.join(skillDir, 'SKILL.md');
33
+ fs.writeFileSync(skillPath, skill.content, 'utf-8');
34
+ // Write meta.yaml
35
+ const metaPath = path.join(skillDir, 'meta.yaml');
36
+ const fullMeta = {
37
+ ...meta,
38
+ sha256: skill.sha256,
39
+ };
40
+ fs.writeFileSync(metaPath, yaml.stringify(fullMeta), 'utf-8');
41
+ }
42
+ /**
43
+ * Read a skill's content from disk
44
+ */
45
+ export function readSkillContent(slug) {
46
+ const skillPath = path.join(getSkillDir(slug), 'SKILL.md');
47
+ if (!fs.existsSync(skillPath)) {
48
+ return null;
49
+ }
50
+ return fs.readFileSync(skillPath, 'utf-8');
51
+ }
52
+ /**
53
+ * Read a skill's metadata from disk
54
+ */
55
+ export function readSkillMeta(slug) {
56
+ const metaPath = path.join(getSkillDir(slug), 'meta.yaml');
57
+ if (!fs.existsSync(metaPath)) {
58
+ return null;
59
+ }
60
+ const content = fs.readFileSync(metaPath, 'utf-8');
61
+ return yaml.parse(content);
62
+ }
63
+ /**
64
+ * Delete a skill from disk
65
+ */
66
+ export function deleteSkill(slug) {
67
+ const skillDir = getSkillDir(slug);
68
+ if (fs.existsSync(skillDir)) {
69
+ fs.rmSync(skillDir, { recursive: true });
70
+ }
71
+ }
72
+ /**
73
+ * Check if a skill exists on disk
74
+ */
75
+ export function skillExists(slug) {
76
+ const skillPath = path.join(getSkillDir(slug), 'SKILL.md');
77
+ return fs.existsSync(skillPath);
78
+ }
79
+ /**
80
+ * List all skills on disk
81
+ */
82
+ export function listLocalSkills() {
83
+ const installPath = getInstallPath();
84
+ if (!fs.existsSync(installPath)) {
85
+ return [];
86
+ }
87
+ return fs.readdirSync(installPath)
88
+ .filter(name => {
89
+ // Skip system folder and index
90
+ if (name === '_system' || name === 'SKILLS_INDEX.md') {
91
+ return false;
92
+ }
93
+ const skillPath = path.join(installPath, name, 'SKILL.md');
94
+ return fs.existsSync(skillPath);
95
+ });
96
+ }
97
+ /**
98
+ * Check if a skill is modified locally
99
+ */
100
+ export function isSkillModified(slug) {
101
+ const markerPath = path.join(getSkillDir(slug), '.modified');
102
+ return fs.existsSync(markerPath);
103
+ }
104
+ /**
105
+ * Mark a skill as modified
106
+ */
107
+ export function markSkillModified(slug) {
108
+ const markerPath = path.join(getSkillDir(slug), '.modified');
109
+ fs.writeFileSync(markerPath, new Date().toISOString(), 'utf-8');
110
+ }
111
+ /**
112
+ * Unmark a skill as modified
113
+ */
114
+ export function unmarkSkillModified(slug) {
115
+ const markerPath = path.join(getSkillDir(slug), '.modified');
116
+ if (fs.existsSync(markerPath)) {
117
+ fs.unlinkSync(markerPath);
118
+ }
119
+ }
120
+ /**
121
+ * Write the system (meta) skill
122
+ */
123
+ export function writeSystemSkill(content) {
124
+ const systemDir = getSystemDir();
125
+ ensureDir(systemDir);
126
+ const skillPath = path.join(systemDir, 'SKILL.md');
127
+ fs.writeFileSync(skillPath, content, 'utf-8');
128
+ }
129
+ /**
130
+ * Add .skills/ to .gitignore if not present
131
+ */
132
+ export function updateGitignore(installPath) {
133
+ const projectRoot = findProjectRoot() || process.cwd();
134
+ const gitignorePath = path.join(projectRoot, '.gitignore');
135
+ const entry = `${installPath}/`;
136
+ let content = '';
137
+ if (fs.existsSync(gitignorePath)) {
138
+ content = fs.readFileSync(gitignorePath, 'utf-8');
139
+ if (content.includes(entry) || content.includes(installPath)) {
140
+ return; // Already present
141
+ }
142
+ if (!content.endsWith('\n')) {
143
+ content += '\n';
144
+ }
145
+ }
146
+ content += `\n# Skills (synced files, not committed)\n${entry}\n`;
147
+ fs.writeFileSync(gitignorePath, content, 'utf-8');
148
+ }
149
+ /**
150
+ * Upsert a managed section (between start/end markers) in a markdown file.
151
+ * Creates the file if it doesn't exist, appends if no section found, replaces if found.
152
+ */
153
+ function upsertManagedSection(filePath, startMarker, endMarker, section) {
154
+ if (!fs.existsSync(filePath)) {
155
+ fs.writeFileSync(filePath, section + '\n', 'utf-8');
156
+ return;
157
+ }
158
+ let content = fs.readFileSync(filePath, 'utf-8');
159
+ const startIdx = content.indexOf(startMarker);
160
+ const endIdx = content.indexOf(endMarker);
161
+ if (startIdx !== -1 && endIdx !== -1) {
162
+ content = content.slice(0, startIdx) + section + content.slice(endIdx + endMarker.length);
163
+ }
164
+ else {
165
+ if (!content.endsWith('\n')) {
166
+ content += '\n';
167
+ }
168
+ content += '\n' + section + '\n';
169
+ }
170
+ fs.writeFileSync(filePath, content, 'utf-8');
171
+ }
172
+ function overskillMdSection(installPath) {
173
+ const startMarker = '<!-- overskill-start -->';
174
+ const endMarker = '<!-- overskill-end -->';
175
+ return `${startMarker}
176
+ ## Overskill Skills
177
+
178
+ This project uses Overskill to manage reusable AI skills.
179
+
180
+ Before starting any task, read \`${installPath}/SKILLS_INDEX.md\` to discover available skills. When a skill is relevant to your current task, read its full SKILL.md file and follow its instructions.
181
+
182
+ To manage skills, use the \`skill\` CLI command (run \`skill --help\` for usage).
183
+ ${endMarker}`;
184
+ }
185
+ /**
186
+ * Add or update the Overskill section in CLAUDE.md
187
+ */
188
+ export function updateClaudeMd(installPath) {
189
+ const projectRoot = findProjectRoot() || process.cwd();
190
+ const filePath = path.join(projectRoot, 'CLAUDE.md');
191
+ upsertManagedSection(filePath, '<!-- overskill-start -->', '<!-- overskill-end -->', overskillMdSection(installPath));
192
+ }
193
+ /**
194
+ * Add or update the Overskill section in AGENTS.md
195
+ */
196
+ export function updateAgentsMd(installPath) {
197
+ const projectRoot = findProjectRoot() || process.cwd();
198
+ const filePath = path.join(projectRoot, 'AGENTS.md');
199
+ upsertManagedSection(filePath, '<!-- overskill-start -->', '<!-- overskill-end -->', overskillMdSection(installPath));
200
+ }
201
+ /**
202
+ * Add or update the Overskill rule in .cursor/rules/
203
+ */
204
+ export function updateCursorRules(installPath) {
205
+ const projectRoot = findProjectRoot() || process.cwd();
206
+ const rulesDir = path.join(projectRoot, '.cursor', 'rules');
207
+ ensureDir(rulesDir);
208
+ const rulePath = path.join(rulesDir, 'overskill.mdc');
209
+ const content = `---
210
+ description: Discover and apply Overskill skills for this project
211
+ globs:
212
+ alwaysApply: true
213
+ ---
214
+
215
+ ## Overskill Skills
216
+
217
+ This project uses Overskill to manage reusable AI skills.
218
+
219
+ Before starting any task, read \`${installPath}/SKILLS_INDEX.md\` to discover available skills. When a skill is relevant to your current task, read its full SKILL.md file and follow its instructions.
220
+
221
+ To manage skills, use the \`skill\` CLI command (run \`skill --help\` for usage).
222
+ `;
223
+ fs.writeFileSync(rulePath, content, 'utf-8');
224
+ }
225
+ /**
226
+ * Compute SHA256 hash of content
227
+ */
228
+ export async function computeHash(content) {
229
+ const encoder = new TextEncoder();
230
+ const data = encoder.encode(content);
231
+ const hashBuffer = await crypto.subtle.digest('SHA-256', data);
232
+ const hashArray = Array.from(new Uint8Array(hashBuffer));
233
+ return hashArray.map(b => b.toString(16).padStart(2, '0')).join('');
234
+ }
235
+ //# sourceMappingURL=fs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fs.js","sourceRoot":"","sources":["../../src/lib/fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { SkillMeta } from '../types.js';
2
+ /**
3
+ * Generate the SKILLS_INDEX.md content
4
+ */
5
+ export declare function generateIndexContent(skills: SkillMeta[]): string;
6
+ /**
7
+ * Write the SKILLS_INDEX.md file
8
+ */
9
+ export declare function writeIndex(skills: SkillMeta[]): void;
10
+ /**
11
+ * Regenerate SKILLS_INDEX.md from installed skills
12
+ */
13
+ export declare function regenerateIndex(): void;
14
+ /**
15
+ * Read the current index file
16
+ */
17
+ export declare function readIndex(): string | null;
18
+ //# sourceMappingURL=index-gen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-gen.d.ts","sourceRoot":"","sources":["../../src/lib/index-gen.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE7C;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAqChE;AAED;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAMpD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,IAAI,CAetC;AAED;;GAEG;AACH,wBAAgB,SAAS,IAAI,MAAM,GAAG,IAAI,CASzC"}
@@ -0,0 +1,75 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { getInstallPath } from './config.js';
4
+ import { listLocalSkills, readSkillMeta } from './fs.js';
5
+ /**
6
+ * Generate the SKILLS_INDEX.md content
7
+ */
8
+ export function generateIndexContent(skills) {
9
+ const lines = [
10
+ '# Available Skills',
11
+ '',
12
+ 'This file is auto-generated by the skills CLI. Do not edit manually.',
13
+ '',
14
+ ];
15
+ // Add system skill reference first
16
+ lines.push('## _system (Meta-Skill)');
17
+ lines.push('- **Description:** Instructions for AI agents on how to use the skills system');
18
+ lines.push('- **File:** _system/SKILL.md');
19
+ lines.push('');
20
+ // Add each skill
21
+ for (const skill of skills) {
22
+ lines.push(`## ${skill.slug}`);
23
+ lines.push(`- **Source:** ${skill.registry}`);
24
+ lines.push(`- **Version:** ${skill.version}`);
25
+ if (skill.description) {
26
+ lines.push(`- **Description:** ${skill.description}`);
27
+ }
28
+ if (skill.tags.length > 0) {
29
+ lines.push(`- **Tags:** ${skill.tags.join(', ')}`);
30
+ }
31
+ if (skill.compat.length > 0) {
32
+ lines.push(`- **Compatibility:** ${skill.compat.join(', ')}`);
33
+ }
34
+ lines.push(`- **File:** ${skill.slug}/SKILL.md`);
35
+ lines.push('');
36
+ }
37
+ return lines.join('\n');
38
+ }
39
+ /**
40
+ * Write the SKILLS_INDEX.md file
41
+ */
42
+ export function writeIndex(skills) {
43
+ const installPath = getInstallPath();
44
+ const indexPath = path.join(installPath, 'SKILLS_INDEX.md');
45
+ const content = generateIndexContent(skills);
46
+ fs.writeFileSync(indexPath, content, 'utf-8');
47
+ }
48
+ /**
49
+ * Regenerate SKILLS_INDEX.md from installed skills
50
+ */
51
+ export function regenerateIndex() {
52
+ const slugs = listLocalSkills();
53
+ const skills = [];
54
+ for (const slug of slugs) {
55
+ const meta = readSkillMeta(slug);
56
+ if (meta) {
57
+ skills.push(meta);
58
+ }
59
+ }
60
+ // Sort by slug
61
+ skills.sort((a, b) => a.slug.localeCompare(b.slug));
62
+ writeIndex(skills);
63
+ }
64
+ /**
65
+ * Read the current index file
66
+ */
67
+ export function readIndex() {
68
+ const installPath = getInstallPath();
69
+ const indexPath = path.join(installPath, 'SKILLS_INDEX.md');
70
+ if (!fs.existsSync(indexPath)) {
71
+ return null;
72
+ }
73
+ return fs.readFileSync(indexPath, 'utf-8');
74
+ }
75
+ //# sourceMappingURL=index-gen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-gen.js","sourceRoot":"","sources":["../../src/lib/index-gen.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Local Registry Module
3
+ *
4
+ * Provides content-addressed storage for skills with:
5
+ * - Deduplication via SHA256 hashing
6
+ * - Integrity verification on read
7
+ * - Atomic writes to prevent corruption
8
+ * - Semver-based version resolution
9
+ */
10
+ export type { Provenance, VersionEntry, VersionsFile, LocalSkillMeta, PutVersionParams, GetVersionResult, SkillSummary, SearchResult, } from './types.js';
11
+ export { getRoot, getObjectsDir, getObjectPath, getSkillsDir, getSkillDir, getMetaPath, getVersionsPath, ensureDir, ensureRegistryStructure, registryExists, skillExists as pathExists, objectExists as objectPathExists, } from './paths.js';
12
+ export { computeHash, writeObject, readObject, objectExists, deleteObject, listObjects, verifyAllObjects, cleanupTempFiles, } from './objects.js';
13
+ export { readVersionsFile, writeVersionsFile, getAllVersions, getVersionStrings, getLatestVersion, getVersionEntry, resolveVersion, addVersionEntry, removeVersionEntry, versionExists, getVersionCount, createLocalProvenance, } from './versions.js';
14
+ export { readMeta, writeMeta, putVersion, getVersion, getLatest, resolveAndGet, skillExists, listSkills, searchSkills, searchByTags, searchByCompat, deleteSkill, getSkillInfo, } from './skills.js';
15
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/local-registry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,YAAY,EACV,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,YAAY,GACb,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,OAAO,EACP,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,EACX,WAAW,EACX,eAAe,EACf,SAAS,EACT,uBAAuB,EACvB,cAAc,EACd,WAAW,IAAI,UAAU,EACzB,YAAY,IAAI,gBAAgB,GACjC,MAAM,YAAY,CAAC;AAGpB,OAAO,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAGtB,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,qBAAqB,GACtB,MAAM,eAAe,CAAC;AAGvB,OAAO,EACL,QAAQ,EACR,SAAS,EACT,UAAU,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,WAAW,EACX,YAAY,GACb,MAAM,aAAa,CAAC"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Local Registry Module
3
+ *
4
+ * Provides content-addressed storage for skills with:
5
+ * - Deduplication via SHA256 hashing
6
+ * - Integrity verification on read
7
+ * - Atomic writes to prevent corruption
8
+ * - Semver-based version resolution
9
+ */
10
+ // Re-export path utilities
11
+ export { getRoot, getObjectsDir, getObjectPath, getSkillsDir, getSkillDir, getMetaPath, getVersionsPath, ensureDir, ensureRegistryStructure, registryExists, skillExists as pathExists, objectExists as objectPathExists, } from './paths.js';
12
+ // Re-export object operations
13
+ export { computeHash, writeObject, readObject, objectExists, deleteObject, listObjects, verifyAllObjects, cleanupTempFiles, } from './objects.js';
14
+ // Re-export version operations
15
+ export { readVersionsFile, writeVersionsFile, getAllVersions, getVersionStrings, getLatestVersion, getVersionEntry, resolveVersion, addVersionEntry, removeVersionEntry, versionExists, getVersionCount, createLocalProvenance, } from './versions.js';
16
+ // Re-export skill operations (main API)
17
+ export { readMeta, writeMeta, putVersion, getVersion, getLatest, resolveAndGet, skillExists, listSkills, searchSkills, searchByTags, searchByCompat, deleteSkill, getSkillInfo, } from './skills.js';
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/local-registry/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAcH,2BAA2B;AAC3B,OAAO,EACL,OAAO,EACP,aAAa,EACb,aAAa,EACb,YAAY,EACZ,WAAW,EACX,WAAW,EACX,eAAe,EACf,SAAS,EACT,uBAAuB,EACvB,cAAc,EACd,WAAW,IAAI,UAAU,EACzB,YAAY,IAAI,gBAAgB,GACjC,MAAM,YAAY,CAAC;AAEpB,8BAA8B;AAC9B,OAAO,EACL,WAAW,EACX,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,gBAAgB,EAChB,gBAAgB,GACjB,MAAM,cAAc,CAAC;AAEtB,+BAA+B;AAC/B,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,iBAAiB,EACjB,gBAAgB,EAChB,eAAe,EACf,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,aAAa,EACb,eAAe,EACf,qBAAqB,GACtB,MAAM,eAAe,CAAC;AAEvB,wCAAwC;AACxC,OAAO,EACL,QAAQ,EACR,SAAS,EACT,UAAU,EACV,UAAU,EACV,SAAS,EACT,aAAa,EACb,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,WAAW,EACX,YAAY,GACb,MAAM,aAAa,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Content-addressed object storage for skill content
3
+ *
4
+ * Objects are stored by their SHA256 hash, providing:
5
+ * - Deduplication across versions
6
+ * - Integrity verification on read
7
+ * - Atomic writes using temp file + rename
8
+ */
9
+ /**
10
+ * Compute SHA256 hash of content
11
+ */
12
+ export declare function computeHash(content: string): string;
13
+ /**
14
+ * Write content to the object store.
15
+ * Uses atomic write (temp file + rename) to prevent corruption.
16
+ *
17
+ * @returns The SHA256 hash of the content
18
+ */
19
+ export declare function writeObject(content: string): string;
20
+ /**
21
+ * Read content from the object store.
22
+ * Verifies integrity by checking the hash matches the filename.
23
+ *
24
+ * @returns The content, or null if object doesn't exist or is corrupted
25
+ */
26
+ export declare function readObject(sha256: string): string | null;
27
+ /**
28
+ * Check if an object exists in the store
29
+ */
30
+ export declare function objectExists(sha256: string): boolean;
31
+ /**
32
+ * Delete an object from the store
33
+ *
34
+ * @returns true if deleted, false if didn't exist
35
+ */
36
+ export declare function deleteObject(sha256: string): boolean;
37
+ /**
38
+ * List all objects in the store
39
+ */
40
+ export declare function listObjects(): string[];
41
+ /**
42
+ * Verify integrity of all objects
43
+ *
44
+ * @returns Array of corrupted object hashes
45
+ */
46
+ export declare function verifyAllObjects(): string[];
47
+ /**
48
+ * Clean up orphaned temp files
49
+ */
50
+ export declare function cleanupTempFiles(): number;
51
+ //# sourceMappingURL=objects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"objects.d.ts","sourceRoot":"","sources":["../../../src/lib/local-registry/objects.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH;;GAEG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CA8BnD;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoBxD;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEpD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CASpD;AAED;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,EAAE,CAWtC;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,EAAE,CAc3C;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAwBzC"}