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.
- package/LICENSE +21 -0
- package/README.md +261 -0
- package/dist/commands/add.d.ts +3 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +121 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/bundle.d.ts +3 -0
- package/dist/commands/bundle.d.ts.map +1 -0
- package/dist/commands/bundle.js +58 -0
- package/dist/commands/bundle.js.map +1 -0
- package/dist/commands/config.d.ts +3 -0
- package/dist/commands/config.d.ts.map +1 -0
- package/dist/commands/config.js +109 -0
- package/dist/commands/config.js.map +1 -0
- package/dist/commands/delete.d.ts +3 -0
- package/dist/commands/delete.d.ts.map +1 -0
- package/dist/commands/delete.js +64 -0
- package/dist/commands/delete.js.map +1 -0
- package/dist/commands/diff.d.ts +3 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +93 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/edit.d.ts +3 -0
- package/dist/commands/edit.d.ts.map +1 -0
- package/dist/commands/edit.js +69 -0
- package/dist/commands/edit.js.map +1 -0
- package/dist/commands/import.d.ts +3 -0
- package/dist/commands/import.d.ts.map +1 -0
- package/dist/commands/import.js +514 -0
- package/dist/commands/import.js.map +1 -0
- package/dist/commands/info.d.ts +3 -0
- package/dist/commands/info.d.ts.map +1 -0
- package/dist/commands/info.js +89 -0
- package/dist/commands/info.js.map +1 -0
- package/dist/commands/init.d.ts +3 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +88 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/list.d.ts +3 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +84 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/login.d.ts +3 -0
- package/dist/commands/login.d.ts.map +1 -0
- package/dist/commands/login.js +143 -0
- package/dist/commands/login.js.map +1 -0
- package/dist/commands/new.d.ts +3 -0
- package/dist/commands/new.d.ts.map +1 -0
- package/dist/commands/new.js +262 -0
- package/dist/commands/new.js.map +1 -0
- package/dist/commands/publish.d.ts +3 -0
- package/dist/commands/publish.d.ts.map +1 -0
- package/dist/commands/publish.js +215 -0
- package/dist/commands/publish.js.map +1 -0
- package/dist/commands/push.d.ts +3 -0
- package/dist/commands/push.d.ts.map +1 -0
- package/dist/commands/push.js +151 -0
- package/dist/commands/push.js.map +1 -0
- package/dist/commands/registry.d.ts +3 -0
- package/dist/commands/registry.d.ts.map +1 -0
- package/dist/commands/registry.js +169 -0
- package/dist/commands/registry.js.map +1 -0
- package/dist/commands/remove.d.ts +3 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +48 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/search.d.ts +3 -0
- package/dist/commands/search.d.ts.map +1 -0
- package/dist/commands/search.js +48 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/sync.d.ts +3 -0
- package/dist/commands/sync.d.ts.map +1 -0
- package/dist/commands/sync.js +160 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/commands/update.d.ts +3 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +130 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/validate.d.ts +3 -0
- package/dist/commands/validate.d.ts.map +1 -0
- package/dist/commands/validate.js +94 -0
- package/dist/commands/validate.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +60 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +340 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auth.d.ts +78 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +241 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/config.d.ts +94 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +294 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/editor.d.ts +6 -0
- package/dist/lib/editor.d.ts.map +1 -0
- package/dist/lib/editor.js +60 -0
- package/dist/lib/editor.js.map +1 -0
- package/dist/lib/fs.d.ts +74 -0
- package/dist/lib/fs.d.ts.map +1 -0
- package/dist/lib/fs.js +235 -0
- package/dist/lib/fs.js.map +1 -0
- package/dist/lib/index-gen.d.ts +18 -0
- package/dist/lib/index-gen.d.ts.map +1 -0
- package/dist/lib/index-gen.js +75 -0
- package/dist/lib/index-gen.js.map +1 -0
- package/dist/lib/local-registry/index.d.ts +15 -0
- package/dist/lib/local-registry/index.d.ts.map +1 -0
- package/dist/lib/local-registry/index.js +18 -0
- package/dist/lib/local-registry/index.js.map +1 -0
- package/dist/lib/local-registry/objects.d.ts +51 -0
- package/dist/lib/local-registry/objects.d.ts.map +1 -0
- package/dist/lib/local-registry/objects.js +148 -0
- package/dist/lib/local-registry/objects.js.map +1 -0
- package/dist/lib/local-registry/paths.d.ts +53 -0
- package/dist/lib/local-registry/paths.d.ts.map +1 -0
- package/dist/lib/local-registry/paths.js +85 -0
- package/dist/lib/local-registry/paths.js.map +1 -0
- package/dist/lib/local-registry/skills.d.ts +83 -0
- package/dist/lib/local-registry/skills.d.ts.map +1 -0
- package/dist/lib/local-registry/skills.js +261 -0
- package/dist/lib/local-registry/skills.js.map +1 -0
- package/dist/lib/local-registry/types.d.ts +79 -0
- package/dist/lib/local-registry/types.d.ts.map +1 -0
- package/dist/lib/local-registry/types.js +5 -0
- package/dist/lib/local-registry/types.js.map +1 -0
- package/dist/lib/local-registry/versions.d.ts +61 -0
- package/dist/lib/local-registry/versions.d.ts.map +1 -0
- package/dist/lib/local-registry/versions.js +163 -0
- package/dist/lib/local-registry/versions.js.map +1 -0
- package/dist/lib/lockfile.d.ts +38 -0
- package/dist/lib/lockfile.d.ts.map +1 -0
- package/dist/lib/lockfile.js +102 -0
- package/dist/lib/lockfile.js.map +1 -0
- package/dist/lib/meta-skill.d.ts +6 -0
- package/dist/lib/meta-skill.d.ts.map +1 -0
- package/dist/lib/meta-skill.js +72 -0
- package/dist/lib/meta-skill.js.map +1 -0
- package/dist/lib/semver.d.ts +63 -0
- package/dist/lib/semver.d.ts.map +1 -0
- package/dist/lib/semver.js +107 -0
- package/dist/lib/semver.js.map +1 -0
- package/dist/types.d.ts +147 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/types.js.map +1 -0
- 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"}
|
package/dist/lib/fs.d.ts
ADDED
|
@@ -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"}
|