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.
Files changed (59) hide show
  1. package/README.md +484 -0
  2. package/bin/sd.js +3 -0
  3. package/dist/commands/auth.d.ts +3 -0
  4. package/dist/commands/auth.d.ts.map +1 -0
  5. package/dist/commands/auth.js +148 -0
  6. package/dist/commands/auth.js.map +1 -0
  7. package/dist/commands/clone.d.ts +3 -0
  8. package/dist/commands/clone.d.ts.map +1 -0
  9. package/dist/commands/clone.js +86 -0
  10. package/dist/commands/clone.js.map +1 -0
  11. package/dist/commands/collection.d.ts +3 -0
  12. package/dist/commands/collection.d.ts.map +1 -0
  13. package/dist/commands/collection.js +206 -0
  14. package/dist/commands/collection.js.map +1 -0
  15. package/dist/commands/diff.d.ts +3 -0
  16. package/dist/commands/diff.d.ts.map +1 -0
  17. package/dist/commands/diff.js +93 -0
  18. package/dist/commands/diff.js.map +1 -0
  19. package/dist/commands/pr.d.ts +3 -0
  20. package/dist/commands/pr.d.ts.map +1 -0
  21. package/dist/commands/pr.js +230 -0
  22. package/dist/commands/pr.js.map +1 -0
  23. package/dist/commands/pull.d.ts +3 -0
  24. package/dist/commands/pull.d.ts.map +1 -0
  25. package/dist/commands/pull.js +136 -0
  26. package/dist/commands/pull.js.map +1 -0
  27. package/dist/commands/push.d.ts +3 -0
  28. package/dist/commands/push.d.ts.map +1 -0
  29. package/dist/commands/push.js +129 -0
  30. package/dist/commands/push.js.map +1 -0
  31. package/dist/commands/search.d.ts +3 -0
  32. package/dist/commands/search.d.ts.map +1 -0
  33. package/dist/commands/search.js +55 -0
  34. package/dist/commands/search.js.map +1 -0
  35. package/dist/commands/skill.d.ts +3 -0
  36. package/dist/commands/skill.d.ts.map +1 -0
  37. package/dist/commands/skill.js +270 -0
  38. package/dist/commands/skill.js.map +1 -0
  39. package/dist/commands/status.d.ts +8 -0
  40. package/dist/commands/status.d.ts.map +1 -0
  41. package/dist/commands/status.js +115 -0
  42. package/dist/commands/status.js.map +1 -0
  43. package/dist/index.d.ts +3 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +214 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/lib/api.d.ts +208 -0
  48. package/dist/lib/api.d.ts.map +1 -0
  49. package/dist/lib/api.js +216 -0
  50. package/dist/lib/api.js.map +1 -0
  51. package/dist/lib/auth.d.ts +13 -0
  52. package/dist/lib/auth.d.ts.map +1 -0
  53. package/dist/lib/auth.js +181 -0
  54. package/dist/lib/auth.js.map +1 -0
  55. package/dist/lib/config.d.ts +58 -0
  56. package/dist/lib/config.d.ts.map +1 -0
  57. package/dist/lib/config.js +144 -0
  58. package/dist/lib/config.js.map +1 -0
  59. 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":"AAEA,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC;IAC5B,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,QAAQ,CAAC;CAClB;AAED,MAAM,WAAW,iBAAiB,CAAC,CAAC;IAClC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,cAAM,SAAS;IACb,OAAO,CAAC,OAAO,CAAS;;YAMV,oBAAoB;YAyCpB,cAAc;IAmBtB,OAAO,CAAC,CAAC,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,GAAE;QACP,MAAM,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,CAAC;QAC3C,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;KAC1D,GACL,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IA2DpB,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;QAChE,WAAW,EAAE,MAAM,CAAC;QACpB,YAAY,EAAE,MAAM,CAAC;QACrB,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QACpC,QAAQ,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC7D,CAAC,CAAC;IAQG,EAAE,IAAI,OAAO,CAAC,WAAW,CAAC;QAC9B,IAAI,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QACpC,QAAQ,EAAE,KAAK,CAAC;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC3E,CAAC,CAAC;IAIG,eAAe,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;QACxD,OAAO,EAAE,MAAM,CAAC;QAChB,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC,CAAC;IAQG,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;QACpD,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,SAAS,CAAC;QAC3C,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;QACtB,IAAI,CAAC,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QACrC,OAAO,CAAC,EAAE;YAAE,EAAE,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAA;SAAE,CAAC;KACtD,CAAC,CAAC;IAOG,eAAe,CAAC,OAAO,CAAC,EAAE;QAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;KAChD,GAAG,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC,CAAC;IAMjD,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAI3D,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAIlG,gBAAgB,CAAC,IAAI,EAAE;QAC3B,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;KAChD,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAO9B,cAAc,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAMtE,gBAAgB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAMxD,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;QAClE,UAAU,EAAE,UAAU,CAAC;QACvB,MAAM,EAAE,MAAM,CAAC;QACf,SAAS,EAAE,MAAM,CAAC;QAClB,KAAK,EAAE,KAAK,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,GAAG,EAAE,MAAM,CAAC;YACZ,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC,CAAC;KACJ,CAAC,CAAC;IAIG,aAAa,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE;QAC9C,OAAO,EAAE,MAAM,CAAC;QAChB,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,KAAK,CAAC;YACb,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;YACvC,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC,CAAC;KACJ,GAAG,OAAO,CAAC,WAAW,CAAC;QACtB,WAAW,EAAE,WAAW,CAAC;KAC1B,CAAC,CAAC;IAQG,UAAU,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;IAM5C,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE;QAC5C,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;IAOzB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAM9E,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAChD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,GAAG,OAAO,CAAC,WAAW,CAAC;QACtB,MAAM,EAAE,KAAK,CAAC,KAAK,GAAG;YACpB,UAAU,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;YACvD,OAAO,EAAE;gBAAE,EAAE,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAC;gBAAC,IAAI,EAAE,MAAM,CAAA;aAAE,CAAC;YACpD,QAAQ,EAAE,MAAM,CAAC;SAClB,CAAC,CAAC;QACH,UAAU,EAAE;YACV,IAAI,EAAE,MAAM,CAAC;YACb,KAAK,EAAE,MAAM,CAAC;YACd,KAAK,EAAE,MAAM,CAAC;YACd,UAAU,EAAE,MAAM,CAAC;SACpB,CAAC;KACH,CAAC,CAAC;IAQG,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QACrD,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,MAAM,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;KACvC,GAAG,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC;IAMlD,cAAc,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,WAAW,GAAG;QAC5F,KAAK,EAAE,KAAK,CAAC;YACX,IAAI,EAAE,MAAM,CAAC;YACb,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;YACvC,OAAO,CAAC,EAAE,MAAM,CAAC;SAClB,CAAC,CAAC;KACJ,CAAC,CAAC;IAIG,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,cAAc,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAO1H,gBAAgB,CAAC,YAAY,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;CAKzF;AAGD,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE;QACR,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,IAAI,EAAE,MAAM,CAAC;KACd,CAAC;CACH;AAED,MAAM,WAAW,KAAK;IACpB,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,YAAY,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACrC,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,eAAO,MAAM,GAAG,WAAkB,CAAC"}
@@ -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"}
@@ -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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"}