skillsd 0.1.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/README.md +484 -0
- package/bin/sd.js +3 -0
- package/dist/commands/auth.d.ts +3 -0
- package/dist/commands/auth.d.ts.map +1 -0
- package/dist/commands/auth.js +148 -0
- package/dist/commands/auth.js.map +1 -0
- package/dist/commands/clone.d.ts +3 -0
- package/dist/commands/clone.d.ts.map +1 -0
- package/dist/commands/clone.js +86 -0
- package/dist/commands/clone.js.map +1 -0
- package/dist/commands/collection.d.ts +3 -0
- package/dist/commands/collection.d.ts.map +1 -0
- package/dist/commands/collection.js +206 -0
- package/dist/commands/collection.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/pr.d.ts +3 -0
- package/dist/commands/pr.d.ts.map +1 -0
- package/dist/commands/pr.js +230 -0
- package/dist/commands/pr.js.map +1 -0
- package/dist/commands/pull.d.ts +3 -0
- package/dist/commands/pull.d.ts.map +1 -0
- package/dist/commands/pull.js +136 -0
- package/dist/commands/pull.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 +129 -0
- package/dist/commands/push.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 +55 -0
- package/dist/commands/search.js.map +1 -0
- package/dist/commands/skill.d.ts +3 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +270 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/status.d.ts +8 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +115 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +214 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/api.d.ts +208 -0
- package/dist/lib/api.d.ts.map +1 -0
- package/dist/lib/api.js +216 -0
- package/dist/lib/api.js.map +1 -0
- package/dist/lib/auth.d.ts +13 -0
- package/dist/lib/auth.d.ts.map +1 -0
- package/dist/lib/auth.js +181 -0
- package/dist/lib/auth.js.map +1 -0
- package/dist/lib/config.d.ts +58 -0
- package/dist/lib/config.d.ts.map +1 -0
- package/dist/lib/config.js +144 -0
- package/dist/lib/config.js.map +1 -0
- package/package.json +48 -0
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
export interface ApiError {
|
|
2
|
+
message: string;
|
|
3
|
+
code?: string;
|
|
4
|
+
status?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface ApiResponse<T> {
|
|
7
|
+
data?: T;
|
|
8
|
+
error?: ApiError;
|
|
9
|
+
}
|
|
10
|
+
export interface PaginatedResponse<T> {
|
|
11
|
+
items: T[];
|
|
12
|
+
total: number;
|
|
13
|
+
page: number;
|
|
14
|
+
limit: number;
|
|
15
|
+
totalPages: number;
|
|
16
|
+
}
|
|
17
|
+
declare class ApiClient {
|
|
18
|
+
private baseUrl;
|
|
19
|
+
constructor();
|
|
20
|
+
private refreshTokenIfNeeded;
|
|
21
|
+
private getAuthHeaders;
|
|
22
|
+
request<T>(path: string, options?: {
|
|
23
|
+
method?: 'GET' | 'POST' | 'PUT' | 'DELETE';
|
|
24
|
+
body?: unknown;
|
|
25
|
+
auth?: boolean;
|
|
26
|
+
query?: Record<string, string | number | boolean | undefined>;
|
|
27
|
+
}): Promise<ApiResponse<T>>;
|
|
28
|
+
login(email: string, password: string): Promise<ApiResponse<{
|
|
29
|
+
accessToken: string;
|
|
30
|
+
refreshToken: string;
|
|
31
|
+
user: {
|
|
32
|
+
id: string;
|
|
33
|
+
email: string;
|
|
34
|
+
};
|
|
35
|
+
accounts: Array<{
|
|
36
|
+
id: string;
|
|
37
|
+
slug: string;
|
|
38
|
+
name: string;
|
|
39
|
+
}>;
|
|
40
|
+
}>>;
|
|
41
|
+
me(): Promise<ApiResponse<{
|
|
42
|
+
user: {
|
|
43
|
+
id: string;
|
|
44
|
+
email: string;
|
|
45
|
+
};
|
|
46
|
+
accounts: Array<{
|
|
47
|
+
id: string;
|
|
48
|
+
slug: string;
|
|
49
|
+
name: string;
|
|
50
|
+
role: string;
|
|
51
|
+
}>;
|
|
52
|
+
}>>;
|
|
53
|
+
initiateCliAuth(state: string): Promise<ApiResponse<{
|
|
54
|
+
authUrl: string;
|
|
55
|
+
pollUrl: string;
|
|
56
|
+
}>>;
|
|
57
|
+
pollCliAuth(state: string): Promise<ApiResponse<{
|
|
58
|
+
status: 'pending' | 'complete' | 'expired';
|
|
59
|
+
accessToken?: string;
|
|
60
|
+
refreshToken?: string;
|
|
61
|
+
user?: {
|
|
62
|
+
id: string;
|
|
63
|
+
email: string;
|
|
64
|
+
};
|
|
65
|
+
account?: {
|
|
66
|
+
id: string;
|
|
67
|
+
slug: string;
|
|
68
|
+
name: string;
|
|
69
|
+
};
|
|
70
|
+
}>>;
|
|
71
|
+
listCollections(options?: {
|
|
72
|
+
page?: number;
|
|
73
|
+
limit?: number;
|
|
74
|
+
visibility?: 'public' | 'private' | 'unlisted';
|
|
75
|
+
}): Promise<ApiResponse<PaginatedResponse<Collection>>>;
|
|
76
|
+
getCollection(id: string): Promise<ApiResponse<Collection>>;
|
|
77
|
+
getCollectionBySlug(accountSlug: string, collectionSlug: string): Promise<ApiResponse<Collection>>;
|
|
78
|
+
createCollection(data: {
|
|
79
|
+
name: string;
|
|
80
|
+
slug?: string;
|
|
81
|
+
description?: string;
|
|
82
|
+
visibility?: 'public' | 'private' | 'unlisted';
|
|
83
|
+
}): Promise<ApiResponse<Collection>>;
|
|
84
|
+
forkCollection(collectionId: string): Promise<ApiResponse<Collection>>;
|
|
85
|
+
deleteCollection(id: string): Promise<ApiResponse<void>>;
|
|
86
|
+
getCollectionFiles(collectionId: string): Promise<ApiResponse<{
|
|
87
|
+
collection: Collection;
|
|
88
|
+
branch: string;
|
|
89
|
+
commitSha: string;
|
|
90
|
+
files: Array<{
|
|
91
|
+
path: string;
|
|
92
|
+
sha: string;
|
|
93
|
+
content: string;
|
|
94
|
+
}>;
|
|
95
|
+
}>>;
|
|
96
|
+
submitChanges(collectionId: string, data: {
|
|
97
|
+
baseSha: string;
|
|
98
|
+
title: string;
|
|
99
|
+
description?: string;
|
|
100
|
+
changes: Array<{
|
|
101
|
+
path: string;
|
|
102
|
+
action: 'create' | 'modify' | 'delete';
|
|
103
|
+
content?: string;
|
|
104
|
+
}>;
|
|
105
|
+
}): Promise<ApiResponse<{
|
|
106
|
+
pullRequest: PullRequest;
|
|
107
|
+
}>>;
|
|
108
|
+
listSkills(collectionId: string, options?: {
|
|
109
|
+
page?: number;
|
|
110
|
+
limit?: number;
|
|
111
|
+
search?: string;
|
|
112
|
+
}): Promise<ApiResponse<PaginatedResponse<Skill>>>;
|
|
113
|
+
createSkill(collectionId: string, data: {
|
|
114
|
+
name: string;
|
|
115
|
+
path: string;
|
|
116
|
+
description?: string;
|
|
117
|
+
content: string;
|
|
118
|
+
}): Promise<ApiResponse<Skill>>;
|
|
119
|
+
deleteSkill(collectionId: string, skillId: string): Promise<ApiResponse<void>>;
|
|
120
|
+
searchPublicSkills(query: string, options?: {
|
|
121
|
+
page?: number;
|
|
122
|
+
limit?: number;
|
|
123
|
+
}): Promise<ApiResponse<{
|
|
124
|
+
skills: Array<Skill & {
|
|
125
|
+
collection: {
|
|
126
|
+
id: string;
|
|
127
|
+
slug: string;
|
|
128
|
+
name: string;
|
|
129
|
+
};
|
|
130
|
+
account: {
|
|
131
|
+
id: string;
|
|
132
|
+
slug: string;
|
|
133
|
+
name: string;
|
|
134
|
+
};
|
|
135
|
+
fullPath: string;
|
|
136
|
+
}>;
|
|
137
|
+
pagination: {
|
|
138
|
+
page: number;
|
|
139
|
+
limit: number;
|
|
140
|
+
total: number;
|
|
141
|
+
totalPages: number;
|
|
142
|
+
};
|
|
143
|
+
}>>;
|
|
144
|
+
listPullRequests(collectionId: string, options?: {
|
|
145
|
+
page?: number;
|
|
146
|
+
limit?: number;
|
|
147
|
+
status?: 'open' | 'merged' | 'closed';
|
|
148
|
+
}): Promise<ApiResponse<PaginatedResponse<PullRequest>>>;
|
|
149
|
+
getPullRequest(collectionId: string, number: number): Promise<ApiResponse<PullRequest & {
|
|
150
|
+
files: Array<{
|
|
151
|
+
path: string;
|
|
152
|
+
action: 'create' | 'modify' | 'delete';
|
|
153
|
+
content?: string;
|
|
154
|
+
}>;
|
|
155
|
+
}>>;
|
|
156
|
+
mergePullRequest(collectionId: string, number: number, options?: {
|
|
157
|
+
allowDeletions?: boolean;
|
|
158
|
+
}): Promise<ApiResponse<void>>;
|
|
159
|
+
closePullRequest(collectionId: string, number: number): Promise<ApiResponse<void>>;
|
|
160
|
+
}
|
|
161
|
+
export interface Collection {
|
|
162
|
+
id: string;
|
|
163
|
+
accountId: string;
|
|
164
|
+
slug: string;
|
|
165
|
+
name: string;
|
|
166
|
+
description?: string;
|
|
167
|
+
visibility: 'public' | 'private' | 'unlisted';
|
|
168
|
+
skillCount: number;
|
|
169
|
+
starCount: number;
|
|
170
|
+
forkCount: number;
|
|
171
|
+
forkedFromId?: string;
|
|
172
|
+
createdAt: string;
|
|
173
|
+
modifiedAt: string;
|
|
174
|
+
account?: {
|
|
175
|
+
id: string;
|
|
176
|
+
slug: string;
|
|
177
|
+
name: string;
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
export interface Skill {
|
|
181
|
+
id: string;
|
|
182
|
+
collectionId: string;
|
|
183
|
+
path: string;
|
|
184
|
+
name: string;
|
|
185
|
+
description?: string;
|
|
186
|
+
metadata: Record<string, unknown>;
|
|
187
|
+
dependencies: string[];
|
|
188
|
+
createdAt: string;
|
|
189
|
+
modifiedAt: string;
|
|
190
|
+
}
|
|
191
|
+
export interface PullRequest {
|
|
192
|
+
id: string;
|
|
193
|
+
collectionId: string;
|
|
194
|
+
number: number;
|
|
195
|
+
title: string;
|
|
196
|
+
description?: string;
|
|
197
|
+
status: 'open' | 'merged' | 'closed';
|
|
198
|
+
sourceBranch: string;
|
|
199
|
+
targetBranch: string;
|
|
200
|
+
sourceCommitSha: string;
|
|
201
|
+
targetCommitSha: string;
|
|
202
|
+
createdById: string;
|
|
203
|
+
createdAt: string;
|
|
204
|
+
modifiedAt: string;
|
|
205
|
+
}
|
|
206
|
+
export declare const api: ApiClient;
|
|
207
|
+
export {};
|
|
208
|
+
//# sourceMappingURL=api.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.d.ts","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/api.js
ADDED
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { getApiUrl, getCredentials, saveCredentials } from './config.js';
|
|
2
|
+
class ApiClient {
|
|
3
|
+
baseUrl;
|
|
4
|
+
constructor() {
|
|
5
|
+
this.baseUrl = getApiUrl();
|
|
6
|
+
}
|
|
7
|
+
async refreshTokenIfNeeded() {
|
|
8
|
+
const creds = getCredentials();
|
|
9
|
+
if (!creds) {
|
|
10
|
+
return null;
|
|
11
|
+
}
|
|
12
|
+
// Check if token expires within 5 minutes
|
|
13
|
+
if (creds.expiresAt > Date.now() + 5 * 60 * 1000) {
|
|
14
|
+
return creds.accessToken;
|
|
15
|
+
}
|
|
16
|
+
// Try to refresh
|
|
17
|
+
try {
|
|
18
|
+
const response = await fetch(`${this.baseUrl}/api/auth/refresh`, {
|
|
19
|
+
method: 'POST',
|
|
20
|
+
headers: {
|
|
21
|
+
'Content-Type': 'application/json',
|
|
22
|
+
},
|
|
23
|
+
body: JSON.stringify({
|
|
24
|
+
refreshToken: creds.refreshToken,
|
|
25
|
+
}),
|
|
26
|
+
});
|
|
27
|
+
if (!response.ok) {
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
const data = await response.json();
|
|
31
|
+
const newCreds = {
|
|
32
|
+
...creds,
|
|
33
|
+
accessToken: data.accessToken,
|
|
34
|
+
refreshToken: data.refreshToken || creds.refreshToken,
|
|
35
|
+
expiresAt: Date.now() + 15 * 60 * 1000, // 15 minutes
|
|
36
|
+
};
|
|
37
|
+
saveCredentials(newCreds);
|
|
38
|
+
return newCreds.accessToken;
|
|
39
|
+
}
|
|
40
|
+
catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
async getAuthHeaders() {
|
|
45
|
+
// Check for environment token first
|
|
46
|
+
const envToken = process.env.SKILLSDOJO_TOKEN;
|
|
47
|
+
if (envToken) {
|
|
48
|
+
return {
|
|
49
|
+
Authorization: `Bearer ${envToken}`,
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
const token = await this.refreshTokenIfNeeded();
|
|
53
|
+
if (token) {
|
|
54
|
+
return {
|
|
55
|
+
Authorization: `Bearer ${token}`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
return {};
|
|
59
|
+
}
|
|
60
|
+
async request(path, options = {}) {
|
|
61
|
+
const { method = 'GET', body, auth = true, query } = options;
|
|
62
|
+
let url = `${this.baseUrl}${path}`;
|
|
63
|
+
// Add query parameters
|
|
64
|
+
if (query) {
|
|
65
|
+
const params = new URLSearchParams();
|
|
66
|
+
for (const [key, value] of Object.entries(query)) {
|
|
67
|
+
if (value !== undefined) {
|
|
68
|
+
params.append(key, String(value));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const queryString = params.toString();
|
|
72
|
+
if (queryString) {
|
|
73
|
+
url += `?${queryString}`;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
const headers = {
|
|
77
|
+
'Content-Type': 'application/json',
|
|
78
|
+
};
|
|
79
|
+
if (auth) {
|
|
80
|
+
const authHeaders = await this.getAuthHeaders();
|
|
81
|
+
Object.assign(headers, authHeaders);
|
|
82
|
+
}
|
|
83
|
+
try {
|
|
84
|
+
const response = await fetch(url, {
|
|
85
|
+
method,
|
|
86
|
+
headers,
|
|
87
|
+
body: body ? JSON.stringify(body) : undefined,
|
|
88
|
+
});
|
|
89
|
+
const data = await response.json().catch(() => null);
|
|
90
|
+
if (!response.ok) {
|
|
91
|
+
return {
|
|
92
|
+
error: {
|
|
93
|
+
message: data?.message || data?.error || 'Request failed',
|
|
94
|
+
code: data?.code,
|
|
95
|
+
status: response.status,
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
return { data: data };
|
|
100
|
+
}
|
|
101
|
+
catch (error) {
|
|
102
|
+
return {
|
|
103
|
+
error: {
|
|
104
|
+
message: error instanceof Error ? error.message : 'Network error',
|
|
105
|
+
code: 'NETWORK_ERROR',
|
|
106
|
+
},
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
// Auth endpoints
|
|
111
|
+
async login(email, password) {
|
|
112
|
+
return this.request('/api/auth/login', {
|
|
113
|
+
method: 'POST',
|
|
114
|
+
body: { email, password },
|
|
115
|
+
auth: false,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
async me() {
|
|
119
|
+
return this.request('/api/auth/me');
|
|
120
|
+
}
|
|
121
|
+
async initiateCliAuth(state) {
|
|
122
|
+
return this.request('/api/auth/cli/initiate', {
|
|
123
|
+
method: 'POST',
|
|
124
|
+
body: { state },
|
|
125
|
+
auth: false,
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
async pollCliAuth(state) {
|
|
129
|
+
return this.request(`/api/auth/cli/poll/${state}`, {
|
|
130
|
+
auth: false,
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
// Collection endpoints
|
|
134
|
+
async listCollections(options) {
|
|
135
|
+
return this.request('/api/collections', {
|
|
136
|
+
query: options,
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
async getCollection(id) {
|
|
140
|
+
return this.request(`/api/collections/${id}`);
|
|
141
|
+
}
|
|
142
|
+
async getCollectionBySlug(accountSlug, collectionSlug) {
|
|
143
|
+
return this.request(`/api/collections/by-slug/${accountSlug}/${collectionSlug}`);
|
|
144
|
+
}
|
|
145
|
+
async createCollection(data) {
|
|
146
|
+
return this.request('/api/collections', {
|
|
147
|
+
method: 'POST',
|
|
148
|
+
body: data,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
async forkCollection(collectionId) {
|
|
152
|
+
return this.request(`/api/collections/${collectionId}/fork`, {
|
|
153
|
+
method: 'POST',
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
async deleteCollection(id) {
|
|
157
|
+
return this.request(`/api/collections/${id}`, {
|
|
158
|
+
method: 'DELETE',
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
async getCollectionFiles(collectionId) {
|
|
162
|
+
return this.request(`/api/collections/${collectionId}/files`);
|
|
163
|
+
}
|
|
164
|
+
async submitChanges(collectionId, data) {
|
|
165
|
+
return this.request(`/api/collections/${collectionId}/changes`, {
|
|
166
|
+
method: 'POST',
|
|
167
|
+
body: data,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// Skill endpoints
|
|
171
|
+
async listSkills(collectionId, options) {
|
|
172
|
+
return this.request(`/api/collections/${collectionId}/skills`, {
|
|
173
|
+
query: options,
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
async createSkill(collectionId, data) {
|
|
177
|
+
return this.request(`/api/collections/${collectionId}/skills`, {
|
|
178
|
+
method: 'POST',
|
|
179
|
+
body: data,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
async deleteSkill(collectionId, skillId) {
|
|
183
|
+
return this.request(`/api/collections/${collectionId}/skills/${skillId}`, {
|
|
184
|
+
method: 'DELETE',
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
async searchPublicSkills(query, options) {
|
|
188
|
+
return this.request('/api/skills/public', {
|
|
189
|
+
query: { q: query, ...options },
|
|
190
|
+
auth: false,
|
|
191
|
+
});
|
|
192
|
+
}
|
|
193
|
+
// PR endpoints
|
|
194
|
+
async listPullRequests(collectionId, options) {
|
|
195
|
+
return this.request(`/api/collections/${collectionId}/pulls`, {
|
|
196
|
+
query: options,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
async getPullRequest(collectionId, number) {
|
|
200
|
+
return this.request(`/api/collections/${collectionId}/pulls/${number}`);
|
|
201
|
+
}
|
|
202
|
+
async mergePullRequest(collectionId, number, options) {
|
|
203
|
+
return this.request(`/api/collections/${collectionId}/pulls/${number}/merge`, {
|
|
204
|
+
method: 'POST',
|
|
205
|
+
query: options?.allowDeletions ? { allowDeletions: 'true' } : undefined,
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
async closePullRequest(collectionId, number) {
|
|
209
|
+
return this.request(`/api/collections/${collectionId}/pulls/${number}/close`, {
|
|
210
|
+
method: 'POST',
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Export singleton instance
|
|
215
|
+
export const api = new ApiClient();
|
|
216
|
+
//# sourceMappingURL=api.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.js","sourceRoot":"","sources":["../../src/lib/api.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Credentials } from './config.js';
|
|
2
|
+
export interface AuthResult {
|
|
3
|
+
success: boolean;
|
|
4
|
+
message: string;
|
|
5
|
+
credentials?: Credentials;
|
|
6
|
+
}
|
|
7
|
+
export declare function loginWithBrowser(): Promise<AuthResult>;
|
|
8
|
+
export declare function loginWithCredentials(email: string, password: string): Promise<AuthResult>;
|
|
9
|
+
export declare function loginWithToken(token: string): Promise<AuthResult>;
|
|
10
|
+
export declare function logout(): void;
|
|
11
|
+
export declare function getCurrentUser(): Credentials | null;
|
|
12
|
+
export declare function requireAuth(): Credentials;
|
|
13
|
+
//# sourceMappingURL=auth.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../../src/lib/auth.ts"],"names":[],"mappings":"AAMA,OAAO,EAAqD,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7F,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,wBAAsB,gBAAgB,IAAI,OAAO,CAAC,UAAU,CAAC,CA0F5D;AAED,wBAAsB,oBAAoB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA0C/F;AAED,wBAAsB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CA+CvE;AAED,wBAAgB,MAAM,IAAI,IAAI,CAE7B;AAED,wBAAgB,cAAc,IAAI,WAAW,GAAG,IAAI,CAEnD;AAED,wBAAgB,WAAW,IAAI,WAAW,CAiBzC"}
|
package/dist/lib/auth.js
ADDED
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { randomBytes } from 'crypto';
|
|
2
|
+
import open from 'open';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import ora from 'ora';
|
|
5
|
+
import { api } from './api.js';
|
|
6
|
+
import { saveCredentials, clearCredentials, getCredentials } from './config.js';
|
|
7
|
+
export async function loginWithBrowser() {
|
|
8
|
+
const state = randomBytes(16).toString('hex');
|
|
9
|
+
const spinner = ora('Initiating authentication...').start();
|
|
10
|
+
// Initiate CLI auth flow
|
|
11
|
+
const initResponse = await api.initiateCliAuth(state);
|
|
12
|
+
if (initResponse.error || !initResponse.data) {
|
|
13
|
+
spinner.fail('Failed to initiate authentication');
|
|
14
|
+
return {
|
|
15
|
+
success: false,
|
|
16
|
+
message: initResponse.error?.message || 'Failed to initiate authentication',
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
// Open browser
|
|
20
|
+
spinner.text = 'Opening browser for authentication...';
|
|
21
|
+
try {
|
|
22
|
+
await open(initResponse.data.authUrl);
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
spinner.warn('Could not open browser automatically');
|
|
26
|
+
console.log(chalk.yellow('\nPlease open this URL in your browser:'));
|
|
27
|
+
console.log(chalk.cyan(initResponse.data.authUrl));
|
|
28
|
+
}
|
|
29
|
+
spinner.text = 'Waiting for authentication...';
|
|
30
|
+
// Poll for completion
|
|
31
|
+
const maxAttempts = 60; // 5 minutes with 5 second intervals
|
|
32
|
+
let attempts = 0;
|
|
33
|
+
while (attempts < maxAttempts) {
|
|
34
|
+
await sleep(5000);
|
|
35
|
+
attempts++;
|
|
36
|
+
const pollResponse = await api.pollCliAuth(state);
|
|
37
|
+
if (pollResponse.error) {
|
|
38
|
+
spinner.fail('Authentication failed');
|
|
39
|
+
return {
|
|
40
|
+
success: false,
|
|
41
|
+
message: pollResponse.error.message,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
if (pollResponse.data?.status === 'complete') {
|
|
45
|
+
const { accessToken, refreshToken, user, account } = pollResponse.data;
|
|
46
|
+
if (!accessToken || !refreshToken || !user || !account) {
|
|
47
|
+
spinner.fail('Invalid authentication response');
|
|
48
|
+
return {
|
|
49
|
+
success: false,
|
|
50
|
+
message: 'Invalid authentication response',
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const credentials = {
|
|
54
|
+
accessToken,
|
|
55
|
+
refreshToken,
|
|
56
|
+
expiresAt: Date.now() + 15 * 60 * 1000, // 15 minutes
|
|
57
|
+
user,
|
|
58
|
+
account,
|
|
59
|
+
};
|
|
60
|
+
saveCredentials(credentials);
|
|
61
|
+
spinner.succeed(`Logged in as ${chalk.green(user.email)}`);
|
|
62
|
+
return {
|
|
63
|
+
success: true,
|
|
64
|
+
message: `Logged in as ${user.email}`,
|
|
65
|
+
credentials,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
if (pollResponse.data?.status === 'expired') {
|
|
69
|
+
spinner.fail('Authentication session expired');
|
|
70
|
+
return {
|
|
71
|
+
success: false,
|
|
72
|
+
message: 'Authentication session expired. Please try again.',
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
spinner.fail('Authentication timed out');
|
|
77
|
+
return {
|
|
78
|
+
success: false,
|
|
79
|
+
message: 'Authentication timed out. Please try again.',
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
export async function loginWithCredentials(email, password) {
|
|
83
|
+
const spinner = ora('Logging in...').start();
|
|
84
|
+
const response = await api.login(email, password);
|
|
85
|
+
if (response.error || !response.data) {
|
|
86
|
+
spinner.fail('Login failed');
|
|
87
|
+
return {
|
|
88
|
+
success: false,
|
|
89
|
+
message: response.error?.message || 'Login failed',
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
const { accessToken, refreshToken, user, accounts } = response.data;
|
|
93
|
+
// Use first account as default
|
|
94
|
+
const account = accounts[0];
|
|
95
|
+
if (!account) {
|
|
96
|
+
spinner.fail('No accounts found');
|
|
97
|
+
return {
|
|
98
|
+
success: false,
|
|
99
|
+
message: 'No accounts found for this user',
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
const credentials = {
|
|
103
|
+
accessToken,
|
|
104
|
+
refreshToken,
|
|
105
|
+
expiresAt: Date.now() + 15 * 60 * 1000, // 15 minutes
|
|
106
|
+
user,
|
|
107
|
+
account,
|
|
108
|
+
};
|
|
109
|
+
saveCredentials(credentials);
|
|
110
|
+
spinner.succeed(`Logged in as ${chalk.green(user.email)}`);
|
|
111
|
+
return {
|
|
112
|
+
success: true,
|
|
113
|
+
message: `Logged in as ${user.email}`,
|
|
114
|
+
credentials,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
export async function loginWithToken(token) {
|
|
118
|
+
const spinner = ora('Validating token...').start();
|
|
119
|
+
// Temporarily set the token to test it
|
|
120
|
+
process.env.SKILLSDOJO_TOKEN = token;
|
|
121
|
+
const response = await api.me();
|
|
122
|
+
if (response.error || !response.data) {
|
|
123
|
+
delete process.env.SKILLSDOJO_TOKEN;
|
|
124
|
+
spinner.fail('Invalid token');
|
|
125
|
+
return {
|
|
126
|
+
success: false,
|
|
127
|
+
message: response.error?.message || 'Invalid token',
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const { user, accounts } = response.data;
|
|
131
|
+
const account = accounts[0];
|
|
132
|
+
if (!account) {
|
|
133
|
+
delete process.env.SKILLSDOJO_TOKEN;
|
|
134
|
+
spinner.fail('No accounts found');
|
|
135
|
+
return {
|
|
136
|
+
success: false,
|
|
137
|
+
message: 'No accounts found for this token',
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
// Store as credentials (with long expiry since it's an API key)
|
|
141
|
+
const credentials = {
|
|
142
|
+
accessToken: token,
|
|
143
|
+
refreshToken: '',
|
|
144
|
+
expiresAt: Date.now() + 365 * 24 * 60 * 60 * 1000, // 1 year
|
|
145
|
+
user,
|
|
146
|
+
account,
|
|
147
|
+
};
|
|
148
|
+
saveCredentials(credentials);
|
|
149
|
+
delete process.env.SKILLSDOJO_TOKEN;
|
|
150
|
+
spinner.succeed(`Logged in as ${chalk.green(user.email)}`);
|
|
151
|
+
return {
|
|
152
|
+
success: true,
|
|
153
|
+
message: `Logged in as ${user.email}`,
|
|
154
|
+
credentials,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
export function logout() {
|
|
158
|
+
clearCredentials();
|
|
159
|
+
}
|
|
160
|
+
export function getCurrentUser() {
|
|
161
|
+
return getCredentials();
|
|
162
|
+
}
|
|
163
|
+
export function requireAuth() {
|
|
164
|
+
const creds = getCredentials();
|
|
165
|
+
if (!creds || !creds.accessToken) {
|
|
166
|
+
console.error(chalk.red('Error: Not authenticated'));
|
|
167
|
+
console.error(chalk.gray('Run `sdojo auth login` to authenticate'));
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
// Check if token is expired
|
|
171
|
+
if (creds.expiresAt < Date.now()) {
|
|
172
|
+
console.error(chalk.red('Error: Session expired'));
|
|
173
|
+
console.error(chalk.gray('Run `sdojo auth login` to re-authenticate'));
|
|
174
|
+
process.exit(1);
|
|
175
|
+
}
|
|
176
|
+
return creds;
|
|
177
|
+
}
|
|
178
|
+
function sleep(ms) {
|
|
179
|
+
return new Promise(resolve => setTimeout(resolve, ms));
|
|
180
|
+
}
|
|
181
|
+
//# 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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"}
|