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
package/dist/lib/auth.js
ADDED
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import * as fs from "fs";
|
|
2
|
+
import * as path from "path";
|
|
3
|
+
import * as os from "os";
|
|
4
|
+
/**
|
|
5
|
+
* Get the ~/.overskill directory path (cross-platform)
|
|
6
|
+
*/
|
|
7
|
+
function getOverskillDir() {
|
|
8
|
+
return path.join(os.homedir(), ".overskill");
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Get legacy config paths (from conf package)
|
|
12
|
+
* macOS: ~/Library/Preferences/overskill-nodejs/
|
|
13
|
+
* Linux: ~/.config/overskill/
|
|
14
|
+
* Windows: %APPDATA%/overskill-nodejs/
|
|
15
|
+
*/
|
|
16
|
+
function getLegacyConfigPaths() {
|
|
17
|
+
const platform = os.platform();
|
|
18
|
+
const homeDir = os.homedir();
|
|
19
|
+
if (platform === "darwin") {
|
|
20
|
+
return [path.join(homeDir, "Library", "Preferences", "overskill-nodejs", "config.json")];
|
|
21
|
+
}
|
|
22
|
+
else if (platform === "win32") {
|
|
23
|
+
const appData = process.env.APPDATA || path.join(homeDir, "AppData", "Roaming");
|
|
24
|
+
return [path.join(appData, "overskill-nodejs", "config.json")];
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
// Linux and other Unix-like systems
|
|
28
|
+
return [path.join(homeDir, ".config", "overskill", "config.json")];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Migrate config from legacy location to ~/.overskill/
|
|
33
|
+
* Called automatically on first read if new config doesn't exist
|
|
34
|
+
*/
|
|
35
|
+
function migrateLegacyConfig() {
|
|
36
|
+
const newConfigPath = getConfigPath();
|
|
37
|
+
// Don't migrate if new config already exists
|
|
38
|
+
if (fs.existsSync(newConfigPath)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Check each legacy path
|
|
42
|
+
for (const legacyPath of getLegacyConfigPaths()) {
|
|
43
|
+
if (fs.existsSync(legacyPath)) {
|
|
44
|
+
try {
|
|
45
|
+
// Read legacy config
|
|
46
|
+
const legacyContent = fs.readFileSync(legacyPath, "utf-8");
|
|
47
|
+
const legacyConfig = JSON.parse(legacyContent);
|
|
48
|
+
// Write to new location
|
|
49
|
+
ensureOverskillDir();
|
|
50
|
+
fs.writeFileSync(newConfigPath, JSON.stringify(legacyConfig, null, 2), "utf-8");
|
|
51
|
+
console.log(`Migrated config from ${legacyPath} to ${newConfigPath}`);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error(`Failed to migrate config from ${legacyPath}:`, error);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Get the config file path (~/.overskill/config.json)
|
|
62
|
+
*/
|
|
63
|
+
export function getConfigPath() {
|
|
64
|
+
return path.join(getOverskillDir(), "config.json");
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Ensure the ~/.overskill directory exists
|
|
68
|
+
*/
|
|
69
|
+
function ensureOverskillDir() {
|
|
70
|
+
const dir = getOverskillDir();
|
|
71
|
+
if (!fs.existsSync(dir)) {
|
|
72
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Read config from ~/.overskill/config.json
|
|
77
|
+
*/
|
|
78
|
+
function readConfig() {
|
|
79
|
+
const configPath = getConfigPath();
|
|
80
|
+
// Migrate from legacy location if needed
|
|
81
|
+
if (!fs.existsSync(configPath)) {
|
|
82
|
+
migrateLegacyConfig();
|
|
83
|
+
}
|
|
84
|
+
// Read config if it exists
|
|
85
|
+
if (!fs.existsSync(configPath)) {
|
|
86
|
+
return {};
|
|
87
|
+
}
|
|
88
|
+
try {
|
|
89
|
+
const content = fs.readFileSync(configPath, "utf-8");
|
|
90
|
+
return JSON.parse(content);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
console.error(`Failed to read config from ${configPath}:`, error);
|
|
94
|
+
return {};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Write config to ~/.overskill/config.json
|
|
99
|
+
*/
|
|
100
|
+
function writeConfig(config) {
|
|
101
|
+
ensureOverskillDir();
|
|
102
|
+
const configPath = getConfigPath();
|
|
103
|
+
try {
|
|
104
|
+
fs.writeFileSync(configPath, JSON.stringify(config, null, 2), "utf-8");
|
|
105
|
+
}
|
|
106
|
+
catch (error) {
|
|
107
|
+
console.error(`Failed to write config to ${configPath}:`, error);
|
|
108
|
+
throw error;
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Get the API URL
|
|
113
|
+
*/
|
|
114
|
+
export function getApiUrl() {
|
|
115
|
+
return readConfig().api_url;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Set the API URL
|
|
119
|
+
*/
|
|
120
|
+
export function setApiUrl(url) {
|
|
121
|
+
const config = readConfig();
|
|
122
|
+
config.api_url = url;
|
|
123
|
+
writeConfig(config);
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Get the web app URL
|
|
127
|
+
*/
|
|
128
|
+
export function getWebAppUrl() {
|
|
129
|
+
return readConfig().web_app_url;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Set the web app URL
|
|
133
|
+
*/
|
|
134
|
+
export function setWebAppUrl(url) {
|
|
135
|
+
const config = readConfig();
|
|
136
|
+
config.web_app_url = url;
|
|
137
|
+
writeConfig(config);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Get the access token
|
|
141
|
+
*/
|
|
142
|
+
export function getAccessToken() {
|
|
143
|
+
return readConfig().access_token;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Get the refresh token
|
|
147
|
+
*/
|
|
148
|
+
export function getRefreshToken() {
|
|
149
|
+
return readConfig().refresh_token;
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Get token expiration time
|
|
153
|
+
*/
|
|
154
|
+
export function getExpiresAt() {
|
|
155
|
+
return readConfig().expires_at;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Store authentication tokens
|
|
159
|
+
*/
|
|
160
|
+
export function setTokens(accessToken, refreshToken, expiresIn) {
|
|
161
|
+
const config = readConfig();
|
|
162
|
+
config.access_token = accessToken;
|
|
163
|
+
config.refresh_token = refreshToken;
|
|
164
|
+
config.expires_at = Date.now() + expiresIn * 1000;
|
|
165
|
+
writeConfig(config);
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Clear authentication tokens
|
|
169
|
+
*/
|
|
170
|
+
export function clearTokens() {
|
|
171
|
+
const config = readConfig();
|
|
172
|
+
delete config.access_token;
|
|
173
|
+
delete config.refresh_token;
|
|
174
|
+
delete config.expires_at;
|
|
175
|
+
writeConfig(config);
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Check if tokens are expired
|
|
179
|
+
*/
|
|
180
|
+
export function isTokenExpired() {
|
|
181
|
+
const expiresAt = getExpiresAt();
|
|
182
|
+
if (!expiresAt)
|
|
183
|
+
return true;
|
|
184
|
+
// Add 60 second buffer
|
|
185
|
+
return Date.now() > expiresAt - 60000;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Check if user is logged in
|
|
189
|
+
*/
|
|
190
|
+
export function isLoggedIn() {
|
|
191
|
+
return !!getAccessToken() && !!getRefreshToken();
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get preferred editor
|
|
195
|
+
*/
|
|
196
|
+
export function getEditor() {
|
|
197
|
+
return (readConfig().editor || process.env.VISUAL || process.env.EDITOR || "vim");
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Set preferred editor
|
|
201
|
+
*/
|
|
202
|
+
export function setEditor(editor) {
|
|
203
|
+
const config = readConfig();
|
|
204
|
+
config.editor = editor;
|
|
205
|
+
writeConfig(config);
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Get default install path
|
|
209
|
+
*/
|
|
210
|
+
export function getDefaultInstallPath() {
|
|
211
|
+
return readConfig().install_path || ".skills";
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Set default install path
|
|
215
|
+
*/
|
|
216
|
+
export function setDefaultInstallPath(installPath) {
|
|
217
|
+
const config = readConfig();
|
|
218
|
+
config.install_path = installPath;
|
|
219
|
+
writeConfig(config);
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get a config value
|
|
223
|
+
*/
|
|
224
|
+
export function get(key) {
|
|
225
|
+
return readConfig()[key];
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Set a config value
|
|
229
|
+
*/
|
|
230
|
+
export function set(key, value) {
|
|
231
|
+
const config = readConfig();
|
|
232
|
+
config[key] = value;
|
|
233
|
+
writeConfig(config);
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get all config
|
|
237
|
+
*/
|
|
238
|
+
export function getAll() {
|
|
239
|
+
return readConfig();
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=auth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.js","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { SkillsConfig, SkillEntry, SkillSource, LocalSource, CloudSource } from '../types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Find the project root by looking for .skills.yaml
|
|
4
|
+
*/
|
|
5
|
+
export declare function findProjectRoot(): string | null;
|
|
6
|
+
/**
|
|
7
|
+
* Get the path to .skills.yaml
|
|
8
|
+
*/
|
|
9
|
+
export declare function getConfigPath(): string;
|
|
10
|
+
/**
|
|
11
|
+
* Check if skills config exists
|
|
12
|
+
*/
|
|
13
|
+
export declare function configExists(): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Read .skills.yaml config
|
|
16
|
+
*/
|
|
17
|
+
export declare function readConfig(): SkillsConfig;
|
|
18
|
+
/**
|
|
19
|
+
* Write .skills.yaml config
|
|
20
|
+
*/
|
|
21
|
+
export declare function writeConfig(config: SkillsConfig): void;
|
|
22
|
+
/**
|
|
23
|
+
* Add a source to the config
|
|
24
|
+
*/
|
|
25
|
+
export declare function addSource(source: SkillSource): void;
|
|
26
|
+
/**
|
|
27
|
+
* Add a skill to the config
|
|
28
|
+
*/
|
|
29
|
+
export declare function addSkill(skill: SkillEntry): void;
|
|
30
|
+
/**
|
|
31
|
+
* Remove a skill from the config
|
|
32
|
+
*/
|
|
33
|
+
export declare function removeSkill(slug: string, source?: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* Get the install path (absolute)
|
|
36
|
+
*/
|
|
37
|
+
export declare function getInstallPath(): string;
|
|
38
|
+
/**
|
|
39
|
+
* Get a source by name
|
|
40
|
+
*/
|
|
41
|
+
export declare function getSource(name: string): SkillSource | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Get the default source (prefer local, then first)
|
|
44
|
+
*/
|
|
45
|
+
export declare function getDefaultSource(): SkillSource | undefined;
|
|
46
|
+
/**
|
|
47
|
+
* Get the first local source
|
|
48
|
+
*/
|
|
49
|
+
export declare function getLocalSource(): LocalSource | undefined;
|
|
50
|
+
/**
|
|
51
|
+
* Get all cloud sources
|
|
52
|
+
*/
|
|
53
|
+
export declare function getCloudSources(): CloudSource[];
|
|
54
|
+
/**
|
|
55
|
+
* Check if config has a local source
|
|
56
|
+
*/
|
|
57
|
+
export declare function hasLocalSource(): boolean;
|
|
58
|
+
/**
|
|
59
|
+
* Check if config has any cloud sources
|
|
60
|
+
*/
|
|
61
|
+
export declare function hasCloudSource(): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Find a skill in config
|
|
64
|
+
*/
|
|
65
|
+
export declare function findSkill(slug: string): SkillEntry | undefined;
|
|
66
|
+
/**
|
|
67
|
+
* Get source for a skill entry (resolves default if not specified)
|
|
68
|
+
*/
|
|
69
|
+
export declare function getSourceForSkill(skill: SkillEntry): SkillSource | undefined;
|
|
70
|
+
/**
|
|
71
|
+
* Create a default local source
|
|
72
|
+
*/
|
|
73
|
+
export declare function createLocalSource(name?: string): LocalSource;
|
|
74
|
+
/**
|
|
75
|
+
* Create a cloud source
|
|
76
|
+
*/
|
|
77
|
+
export declare function createCloudSource(name: string, registry: string, url: string): CloudSource;
|
|
78
|
+
/**
|
|
79
|
+
* Get registry slug from a source (only for cloud sources)
|
|
80
|
+
* Returns undefined for local sources
|
|
81
|
+
*/
|
|
82
|
+
export declare function getSourceRegistry(source: SkillSource): string | undefined;
|
|
83
|
+
/**
|
|
84
|
+
* Get URL from a source (only for cloud sources)
|
|
85
|
+
* Returns undefined for local sources
|
|
86
|
+
*/
|
|
87
|
+
export declare function getSourceUrl(source: SkillSource): string | undefined;
|
|
88
|
+
/**
|
|
89
|
+
* Require a cloud source or throw an error
|
|
90
|
+
* Used for operations that only work with cloud sources
|
|
91
|
+
*/
|
|
92
|
+
export declare function requireCloudSource(source: SkillSource | undefined, operation: string): CloudSource;
|
|
93
|
+
export { isLocalSource, isCloudSource } from '../types.js';
|
|
94
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,WAAW,EACX,WAAW,EACX,WAAW,EAEZ,MAAM,aAAa,CAAC;AASrB;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,GAAG,IAAI,CAa/C;AAED;;GAEG;AACH,wBAAgB,aAAa,IAAI,MAAM,CAMtC;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAwCD;;GAEG;AACH,wBAAgB,UAAU,IAAI,YAAY,CAmBzC;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,YAAY,GAAG,IAAI,CAQtD;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI,CAYnD;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAkBhD;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAgBlE;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAIvC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS,CAG/D;AAcD;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,WAAW,GAAG,SAAS,CAQ1D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,WAAW,GAAG,SAAS,CAGxD;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,EAAE,CAG/C;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAGxC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAGxC;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAG9D;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,UAAU,GAAG,WAAW,GAAG,SAAS,CAK5E;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,GAAE,MAAgB,GAAG,WAAW,CAKrE;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,GACV,WAAW,CAOb;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAKzE;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,WAAW,GAAG,MAAM,GAAG,SAAS,CAKpE;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,EAAE,SAAS,EAAE,MAAM,GAAG,WAAW,CAWlG;AAGD,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
import * as yaml from 'yaml';
|
|
4
|
+
import { isLocalSource, isCloudSource } from '../types.js';
|
|
5
|
+
const DEFAULT_CONFIG = {
|
|
6
|
+
sources: [],
|
|
7
|
+
install_path: '.skills',
|
|
8
|
+
skills: [],
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Find the project root by looking for .skills.yaml
|
|
12
|
+
*/
|
|
13
|
+
export function findProjectRoot() {
|
|
14
|
+
let currentDir = process.cwd();
|
|
15
|
+
const root = path.parse(currentDir).root;
|
|
16
|
+
while (currentDir !== root) {
|
|
17
|
+
const configPath = path.join(currentDir, '.skills.yaml');
|
|
18
|
+
if (fs.existsSync(configPath)) {
|
|
19
|
+
return currentDir;
|
|
20
|
+
}
|
|
21
|
+
currentDir = path.dirname(currentDir);
|
|
22
|
+
}
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get the path to .skills.yaml
|
|
27
|
+
*/
|
|
28
|
+
export function getConfigPath() {
|
|
29
|
+
const projectRoot = findProjectRoot();
|
|
30
|
+
if (projectRoot) {
|
|
31
|
+
return path.join(projectRoot, '.skills.yaml');
|
|
32
|
+
}
|
|
33
|
+
return path.join(process.cwd(), '.skills.yaml');
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Check if skills config exists
|
|
37
|
+
*/
|
|
38
|
+
export function configExists() {
|
|
39
|
+
return fs.existsSync(getConfigPath());
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Check if a source is in legacy format (has url/registry but no kind)
|
|
43
|
+
*/
|
|
44
|
+
function isLegacySource(source) {
|
|
45
|
+
return (typeof source === 'object' &&
|
|
46
|
+
source !== null &&
|
|
47
|
+
'name' in source &&
|
|
48
|
+
'registry' in source &&
|
|
49
|
+
'url' in source &&
|
|
50
|
+
!('kind' in source));
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Convert a legacy source to cloud source
|
|
54
|
+
*/
|
|
55
|
+
function convertLegacySource(legacy) {
|
|
56
|
+
return {
|
|
57
|
+
name: legacy.name,
|
|
58
|
+
kind: 'cloud',
|
|
59
|
+
registry: legacy.registry,
|
|
60
|
+
url: legacy.url,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Normalize sources (convert legacy format to new format)
|
|
65
|
+
*/
|
|
66
|
+
function normalizeSources(sources) {
|
|
67
|
+
return sources.map((source) => {
|
|
68
|
+
if (isLegacySource(source)) {
|
|
69
|
+
return convertLegacySource(source);
|
|
70
|
+
}
|
|
71
|
+
return source;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Read .skills.yaml config
|
|
76
|
+
*/
|
|
77
|
+
export function readConfig() {
|
|
78
|
+
const configPath = getConfigPath();
|
|
79
|
+
if (!fs.existsSync(configPath)) {
|
|
80
|
+
return { ...DEFAULT_CONFIG };
|
|
81
|
+
}
|
|
82
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
83
|
+
const parsed = yaml.parse(content);
|
|
84
|
+
// Normalize sources (handle legacy format)
|
|
85
|
+
const rawSources = parsed.sources || [];
|
|
86
|
+
const sources = normalizeSources(rawSources);
|
|
87
|
+
return {
|
|
88
|
+
sources,
|
|
89
|
+
install_path: parsed.install_path || '.skills',
|
|
90
|
+
skills: parsed.skills || [],
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Write .skills.yaml config
|
|
95
|
+
*/
|
|
96
|
+
export function writeConfig(config) {
|
|
97
|
+
const configPath = getConfigPath();
|
|
98
|
+
const content = yaml.stringify(config, {
|
|
99
|
+
lineWidth: 0,
|
|
100
|
+
defaultStringType: 'QUOTE_DOUBLE',
|
|
101
|
+
defaultKeyType: 'PLAIN',
|
|
102
|
+
});
|
|
103
|
+
fs.writeFileSync(configPath, content, 'utf-8');
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Add a source to the config
|
|
107
|
+
*/
|
|
108
|
+
export function addSource(source) {
|
|
109
|
+
const config = readConfig();
|
|
110
|
+
// Check if source already exists
|
|
111
|
+
const existingIndex = config.sources.findIndex((s) => s.name === source.name);
|
|
112
|
+
if (existingIndex >= 0) {
|
|
113
|
+
config.sources[existingIndex] = source;
|
|
114
|
+
}
|
|
115
|
+
else {
|
|
116
|
+
config.sources.push(source);
|
|
117
|
+
}
|
|
118
|
+
writeConfig(config);
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Add a skill to the config
|
|
122
|
+
*/
|
|
123
|
+
export function addSkill(skill) {
|
|
124
|
+
const config = readConfig();
|
|
125
|
+
// Normalize source to compare (use default if not specified)
|
|
126
|
+
const skillSource = skill.source || getDefaultSourceName(config);
|
|
127
|
+
// Check if skill already exists
|
|
128
|
+
const existingIndex = config.skills.findIndex((s) => s.slug === skill.slug && (s.source || getDefaultSourceName(config)) === skillSource);
|
|
129
|
+
if (existingIndex >= 0) {
|
|
130
|
+
config.skills[existingIndex] = skill;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
config.skills.push(skill);
|
|
134
|
+
}
|
|
135
|
+
writeConfig(config);
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Remove a skill from the config
|
|
139
|
+
*/
|
|
140
|
+
export function removeSkill(slug, source) {
|
|
141
|
+
const config = readConfig();
|
|
142
|
+
const initialLength = config.skills.length;
|
|
143
|
+
if (source) {
|
|
144
|
+
config.skills = config.skills.filter((s) => !(s.slug === slug && s.source === source));
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
config.skills = config.skills.filter((s) => s.slug !== slug);
|
|
148
|
+
}
|
|
149
|
+
if (config.skills.length < initialLength) {
|
|
150
|
+
writeConfig(config);
|
|
151
|
+
return true;
|
|
152
|
+
}
|
|
153
|
+
return false;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get the install path (absolute)
|
|
157
|
+
*/
|
|
158
|
+
export function getInstallPath() {
|
|
159
|
+
const config = readConfig();
|
|
160
|
+
const projectRoot = findProjectRoot() || process.cwd();
|
|
161
|
+
return path.join(projectRoot, config.install_path);
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Get a source by name
|
|
165
|
+
*/
|
|
166
|
+
export function getSource(name) {
|
|
167
|
+
const config = readConfig();
|
|
168
|
+
return config.sources.find((s) => s.name === name);
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Get the default source name from config
|
|
172
|
+
*/
|
|
173
|
+
function getDefaultSourceName(config) {
|
|
174
|
+
// Prefer local source as default
|
|
175
|
+
const localSource = config.sources.find((s) => isLocalSource(s));
|
|
176
|
+
if (localSource)
|
|
177
|
+
return localSource.name;
|
|
178
|
+
// Fall back to first source
|
|
179
|
+
return config.sources[0]?.name;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Get the default source (prefer local, then first)
|
|
183
|
+
*/
|
|
184
|
+
export function getDefaultSource() {
|
|
185
|
+
const config = readConfig();
|
|
186
|
+
// Prefer local source as default
|
|
187
|
+
const localSource = config.sources.find((s) => isLocalSource(s));
|
|
188
|
+
if (localSource)
|
|
189
|
+
return localSource;
|
|
190
|
+
// Fall back to first source
|
|
191
|
+
return config.sources[0];
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Get the first local source
|
|
195
|
+
*/
|
|
196
|
+
export function getLocalSource() {
|
|
197
|
+
const config = readConfig();
|
|
198
|
+
return config.sources.find((s) => isLocalSource(s));
|
|
199
|
+
}
|
|
200
|
+
/**
|
|
201
|
+
* Get all cloud sources
|
|
202
|
+
*/
|
|
203
|
+
export function getCloudSources() {
|
|
204
|
+
const config = readConfig();
|
|
205
|
+
return config.sources.filter((s) => isCloudSource(s));
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Check if config has a local source
|
|
209
|
+
*/
|
|
210
|
+
export function hasLocalSource() {
|
|
211
|
+
const config = readConfig();
|
|
212
|
+
return config.sources.some((s) => isLocalSource(s));
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Check if config has any cloud sources
|
|
216
|
+
*/
|
|
217
|
+
export function hasCloudSource() {
|
|
218
|
+
const config = readConfig();
|
|
219
|
+
return config.sources.some((s) => isCloudSource(s));
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Find a skill in config
|
|
223
|
+
*/
|
|
224
|
+
export function findSkill(slug) {
|
|
225
|
+
const config = readConfig();
|
|
226
|
+
return config.skills.find((s) => s.slug === slug);
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Get source for a skill entry (resolves default if not specified)
|
|
230
|
+
*/
|
|
231
|
+
export function getSourceForSkill(skill) {
|
|
232
|
+
const config = readConfig();
|
|
233
|
+
const sourceName = skill.source || getDefaultSourceName(config);
|
|
234
|
+
if (!sourceName)
|
|
235
|
+
return undefined;
|
|
236
|
+
return config.sources.find((s) => s.name === sourceName);
|
|
237
|
+
}
|
|
238
|
+
/**
|
|
239
|
+
* Create a default local source
|
|
240
|
+
*/
|
|
241
|
+
export function createLocalSource(name = 'local') {
|
|
242
|
+
return {
|
|
243
|
+
name,
|
|
244
|
+
kind: 'local',
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Create a cloud source
|
|
249
|
+
*/
|
|
250
|
+
export function createCloudSource(name, registry, url) {
|
|
251
|
+
return {
|
|
252
|
+
name,
|
|
253
|
+
kind: 'cloud',
|
|
254
|
+
registry,
|
|
255
|
+
url,
|
|
256
|
+
};
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Get registry slug from a source (only for cloud sources)
|
|
260
|
+
* Returns undefined for local sources
|
|
261
|
+
*/
|
|
262
|
+
export function getSourceRegistry(source) {
|
|
263
|
+
if (isCloudSource(source)) {
|
|
264
|
+
return source.registry;
|
|
265
|
+
}
|
|
266
|
+
return undefined;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* Get URL from a source (only for cloud sources)
|
|
270
|
+
* Returns undefined for local sources
|
|
271
|
+
*/
|
|
272
|
+
export function getSourceUrl(source) {
|
|
273
|
+
if (isCloudSource(source)) {
|
|
274
|
+
return source.url;
|
|
275
|
+
}
|
|
276
|
+
return undefined;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Require a cloud source or throw an error
|
|
280
|
+
* Used for operations that only work with cloud sources
|
|
281
|
+
*/
|
|
282
|
+
export function requireCloudSource(source, operation) {
|
|
283
|
+
if (!source) {
|
|
284
|
+
throw new Error(`No source configured. Add a source in .skills.yaml`);
|
|
285
|
+
}
|
|
286
|
+
if (!isCloudSource(source)) {
|
|
287
|
+
throw new Error(`Operation '${operation}' requires a cloud source, but '${source.name}' is a local source. ` +
|
|
288
|
+
`Use a cloud source with --source or configure one in .skills.yaml`);
|
|
289
|
+
}
|
|
290
|
+
return source;
|
|
291
|
+
}
|
|
292
|
+
// Re-export type guards
|
|
293
|
+
export { isLocalSource, isCloudSource } from '../types.js';
|
|
294
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/lib/config.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"editor.d.ts","sourceRoot":"","sources":["../../src/lib/editor.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB,CAAC;AAEF,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa,CAUhE"}
|