@coralai/sps-cli 0.6.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 (145) hide show
  1. package/dist/commands/cardAdd.d.ts +2 -0
  2. package/dist/commands/cardAdd.d.ts.map +1 -0
  3. package/dist/commands/cardAdd.js +65 -0
  4. package/dist/commands/cardAdd.js.map +1 -0
  5. package/dist/commands/doctor.d.ts +9 -0
  6. package/dist/commands/doctor.d.ts.map +1 -0
  7. package/dist/commands/doctor.js +264 -0
  8. package/dist/commands/doctor.js.map +1 -0
  9. package/dist/commands/monitorTick.d.ts +2 -0
  10. package/dist/commands/monitorTick.d.ts.map +1 -0
  11. package/dist/commands/monitorTick.js +47 -0
  12. package/dist/commands/monitorTick.js.map +1 -0
  13. package/dist/commands/pipelineTick.d.ts +2 -0
  14. package/dist/commands/pipelineTick.d.ts.map +1 -0
  15. package/dist/commands/pipelineTick.js +44 -0
  16. package/dist/commands/pipelineTick.js.map +1 -0
  17. package/dist/commands/pmCommand.d.ts +2 -0
  18. package/dist/commands/pmCommand.d.ts.map +1 -0
  19. package/dist/commands/pmCommand.js +159 -0
  20. package/dist/commands/pmCommand.js.map +1 -0
  21. package/dist/commands/projectInit.d.ts +2 -0
  22. package/dist/commands/projectInit.d.ts.map +1 -0
  23. package/dist/commands/projectInit.js +75 -0
  24. package/dist/commands/projectInit.js.map +1 -0
  25. package/dist/commands/qaTick.d.ts +2 -0
  26. package/dist/commands/qaTick.d.ts.map +1 -0
  27. package/dist/commands/qaTick.js +43 -0
  28. package/dist/commands/qaTick.js.map +1 -0
  29. package/dist/commands/schedulerTick.d.ts +2 -0
  30. package/dist/commands/schedulerTick.d.ts.map +1 -0
  31. package/dist/commands/schedulerTick.js +45 -0
  32. package/dist/commands/schedulerTick.js.map +1 -0
  33. package/dist/commands/tick.d.ts +14 -0
  34. package/dist/commands/tick.d.ts.map +1 -0
  35. package/dist/commands/tick.js +251 -0
  36. package/dist/commands/tick.js.map +1 -0
  37. package/dist/commands/workerLaunch.d.ts +2 -0
  38. package/dist/commands/workerLaunch.d.ts.map +1 -0
  39. package/dist/commands/workerLaunch.js +56 -0
  40. package/dist/commands/workerLaunch.js.map +1 -0
  41. package/dist/core/config.d.ts +38 -0
  42. package/dist/core/config.d.ts.map +1 -0
  43. package/dist/core/config.js +131 -0
  44. package/dist/core/config.js.map +1 -0
  45. package/dist/core/context.d.ts +23 -0
  46. package/dist/core/context.d.ts.map +1 -0
  47. package/dist/core/context.js +28 -0
  48. package/dist/core/context.js.map +1 -0
  49. package/dist/core/lock.d.ts +14 -0
  50. package/dist/core/lock.d.ts.map +1 -0
  51. package/dist/core/lock.js +65 -0
  52. package/dist/core/lock.js.map +1 -0
  53. package/dist/core/logger.d.ts +24 -0
  54. package/dist/core/logger.d.ts.map +1 -0
  55. package/dist/core/logger.js +62 -0
  56. package/dist/core/logger.js.map +1 -0
  57. package/dist/core/paths.d.ts +27 -0
  58. package/dist/core/paths.d.ts.map +1 -0
  59. package/dist/core/paths.js +29 -0
  60. package/dist/core/paths.js.map +1 -0
  61. package/dist/core/queue.d.ts +14 -0
  62. package/dist/core/queue.d.ts.map +1 -0
  63. package/dist/core/queue.js +38 -0
  64. package/dist/core/queue.js.map +1 -0
  65. package/dist/core/state.d.ts +32 -0
  66. package/dist/core/state.d.ts.map +1 -0
  67. package/dist/core/state.js +52 -0
  68. package/dist/core/state.js.map +1 -0
  69. package/dist/engines/CloseoutEngine.d.ts +60 -0
  70. package/dist/engines/CloseoutEngine.d.ts.map +1 -0
  71. package/dist/engines/CloseoutEngine.js +596 -0
  72. package/dist/engines/CloseoutEngine.js.map +1 -0
  73. package/dist/engines/ExecutionEngine.d.ts +65 -0
  74. package/dist/engines/ExecutionEngine.d.ts.map +1 -0
  75. package/dist/engines/ExecutionEngine.js +603 -0
  76. package/dist/engines/ExecutionEngine.js.map +1 -0
  77. package/dist/engines/MonitorEngine.d.ts +39 -0
  78. package/dist/engines/MonitorEngine.d.ts.map +1 -0
  79. package/dist/engines/MonitorEngine.js +473 -0
  80. package/dist/engines/MonitorEngine.js.map +1 -0
  81. package/dist/engines/SchedulerEngine.d.ts +24 -0
  82. package/dist/engines/SchedulerEngine.d.ts.map +1 -0
  83. package/dist/engines/SchedulerEngine.js +195 -0
  84. package/dist/engines/SchedulerEngine.js.map +1 -0
  85. package/dist/interfaces/HookProvider.d.ts +9 -0
  86. package/dist/interfaces/HookProvider.d.ts.map +1 -0
  87. package/dist/interfaces/HookProvider.js +2 -0
  88. package/dist/interfaces/HookProvider.js.map +1 -0
  89. package/dist/interfaces/Notifier.d.ts +11 -0
  90. package/dist/interfaces/Notifier.d.ts.map +1 -0
  91. package/dist/interfaces/Notifier.js +2 -0
  92. package/dist/interfaces/Notifier.js.map +1 -0
  93. package/dist/interfaces/RepoBackend.d.ts +23 -0
  94. package/dist/interfaces/RepoBackend.d.ts.map +1 -0
  95. package/dist/interfaces/RepoBackend.js +2 -0
  96. package/dist/interfaces/RepoBackend.js.map +1 -0
  97. package/dist/interfaces/TaskBackend.d.ts +24 -0
  98. package/dist/interfaces/TaskBackend.d.ts.map +1 -0
  99. package/dist/interfaces/TaskBackend.js +2 -0
  100. package/dist/interfaces/TaskBackend.js.map +1 -0
  101. package/dist/interfaces/WorkerProvider.d.ts +23 -0
  102. package/dist/interfaces/WorkerProvider.d.ts.map +1 -0
  103. package/dist/interfaces/WorkerProvider.js +2 -0
  104. package/dist/interfaces/WorkerProvider.js.map +1 -0
  105. package/dist/main.d.ts +3 -0
  106. package/dist/main.d.ts.map +1 -0
  107. package/dist/main.js +226 -0
  108. package/dist/main.js.map +1 -0
  109. package/dist/models/types.d.ts +68 -0
  110. package/dist/models/types.d.ts.map +1 -0
  111. package/dist/models/types.js +2 -0
  112. package/dist/models/types.js.map +1 -0
  113. package/dist/providers/ClaudeWorkerProvider.d.ts +84 -0
  114. package/dist/providers/ClaudeWorkerProvider.d.ts.map +1 -0
  115. package/dist/providers/ClaudeWorkerProvider.js +293 -0
  116. package/dist/providers/ClaudeWorkerProvider.js.map +1 -0
  117. package/dist/providers/CodexWorkerProvider.d.ts +50 -0
  118. package/dist/providers/CodexWorkerProvider.d.ts.map +1 -0
  119. package/dist/providers/CodexWorkerProvider.js +275 -0
  120. package/dist/providers/CodexWorkerProvider.js.map +1 -0
  121. package/dist/providers/GitLabRepoBackend.d.ts +42 -0
  122. package/dist/providers/GitLabRepoBackend.d.ts.map +1 -0
  123. package/dist/providers/GitLabRepoBackend.js +280 -0
  124. package/dist/providers/GitLabRepoBackend.js.map +1 -0
  125. package/dist/providers/MarkdownTaskBackend.d.ts +88 -0
  126. package/dist/providers/MarkdownTaskBackend.d.ts.map +1 -0
  127. package/dist/providers/MarkdownTaskBackend.js +414 -0
  128. package/dist/providers/MarkdownTaskBackend.js.map +1 -0
  129. package/dist/providers/MatrixNotifier.d.ts +30 -0
  130. package/dist/providers/MatrixNotifier.d.ts.map +1 -0
  131. package/dist/providers/MatrixNotifier.js +82 -0
  132. package/dist/providers/MatrixNotifier.js.map +1 -0
  133. package/dist/providers/PlaneTaskBackend.d.ts +86 -0
  134. package/dist/providers/PlaneTaskBackend.d.ts.map +1 -0
  135. package/dist/providers/PlaneTaskBackend.js +409 -0
  136. package/dist/providers/PlaneTaskBackend.js.map +1 -0
  137. package/dist/providers/TrelloTaskBackend.d.ts +53 -0
  138. package/dist/providers/TrelloTaskBackend.d.ts.map +1 -0
  139. package/dist/providers/TrelloTaskBackend.js +300 -0
  140. package/dist/providers/TrelloTaskBackend.js.map +1 -0
  141. package/dist/providers/registry.d.ts +10 -0
  142. package/dist/providers/registry.d.ts.map +1 -0
  143. package/dist/providers/registry.js +29 -0
  144. package/dist/providers/registry.js.map +1 -0
  145. package/package.json +36 -0
@@ -0,0 +1,300 @@
1
+ const ALL_STATES = ['Planning', 'Backlog', 'Todo', 'Inprogress', 'QA', 'Done'];
2
+ /**
3
+ * Trello-backed TaskBackend.
4
+ *
5
+ * Uses Trello REST API via Node.js built-in fetch.
6
+ * Cards are identified by shortLink (seq). Lists represent states.
7
+ * Metadata is stored in card comments with [JARVIS-META] prefix.
8
+ */
9
+ export class TrelloTaskBackend {
10
+ apiBase = 'https://api.trello.com/1';
11
+ apiKey;
12
+ apiToken;
13
+ boardId;
14
+ /** CardState → Trello list ID */
15
+ listMap;
16
+ /** Trello list ID → CardState */
17
+ reverseListMap;
18
+ /** Cache: label name → label ID */
19
+ labelCache = null;
20
+ constructor(config) {
21
+ const raw = config.raw;
22
+ this.apiKey = required(raw, 'TRELLO_API_KEY');
23
+ this.apiToken = required(raw, 'TRELLO_TOKEN');
24
+ this.boardId = required(raw, 'TRELLO_BOARD_ID');
25
+ this.listMap = {
26
+ Planning: required(raw, 'TRELLO_LIST_PLANNING'),
27
+ Backlog: required(raw, 'TRELLO_LIST_BACKLOG'),
28
+ Todo: required(raw, 'TRELLO_LIST_TODO'),
29
+ Inprogress: required(raw, 'TRELLO_LIST_INPROGRESS'),
30
+ QA: required(raw, 'TRELLO_LIST_QA'),
31
+ Done: required(raw, 'TRELLO_LIST_DONE'),
32
+ };
33
+ this.reverseListMap = new Map();
34
+ for (const state of ALL_STATES) {
35
+ this.reverseListMap.set(this.listMap[state], state);
36
+ }
37
+ }
38
+ get authParams() {
39
+ return `key=${this.apiKey}&token=${this.apiToken}`;
40
+ }
41
+ // ─── API helpers ──────────────────────────────────────────────
42
+ async get(path, params = '') {
43
+ const sep = path.includes('?') ? '&' : '?';
44
+ const url = `${this.apiBase}${path}${sep}${this.authParams}${params ? '&' + params : ''}`;
45
+ const res = await fetch(url);
46
+ if (!res.ok) {
47
+ const text = await res.text().catch(() => '');
48
+ throw new Error(`Trello GET ${path} failed (${res.status}): ${text}`);
49
+ }
50
+ return (await res.json());
51
+ }
52
+ async post(path, body = {}) {
53
+ const url = `${this.apiBase}${path}?${this.authParams}`;
54
+ const res = await fetch(url, {
55
+ method: 'POST',
56
+ headers: { 'Content-Type': 'application/json' },
57
+ body: JSON.stringify(body),
58
+ });
59
+ if (!res.ok) {
60
+ const text = await res.text().catch(() => '');
61
+ throw new Error(`Trello POST ${path} failed (${res.status}): ${text}`);
62
+ }
63
+ return (await res.json());
64
+ }
65
+ async put(path, body = {}) {
66
+ const url = `${this.apiBase}${path}?${this.authParams}`;
67
+ const res = await fetch(url, {
68
+ method: 'PUT',
69
+ headers: { 'Content-Type': 'application/json' },
70
+ body: JSON.stringify(body),
71
+ });
72
+ if (!res.ok) {
73
+ const text = await res.text().catch(() => '');
74
+ throw new Error(`Trello PUT ${path} failed (${res.status}): ${text}`);
75
+ }
76
+ return (await res.json());
77
+ }
78
+ async del(path) {
79
+ const url = `${this.apiBase}${path}?${this.authParams}`;
80
+ const res = await fetch(url, { method: 'DELETE' });
81
+ if (!res.ok) {
82
+ const text = await res.text().catch(() => '');
83
+ throw new Error(`Trello DELETE ${path} failed (${res.status}): ${text}`);
84
+ }
85
+ }
86
+ // ─── Card mapping ─────────────────────────────────────────────
87
+ cardToCard(tc) {
88
+ const state = this.reverseListMap.get(tc.idList) ?? 'Backlog';
89
+ return {
90
+ id: tc.id,
91
+ seq: String(tc.idShort),
92
+ name: tc.name,
93
+ desc: tc.desc || '',
94
+ state,
95
+ labels: (tc.labels || []).map((l) => l.name),
96
+ meta: {},
97
+ };
98
+ }
99
+ // ─── TaskBackend implementation ───────────────────────────────
100
+ async bootstrap() {
101
+ // Verify board access
102
+ await this.get(`/boards/${this.boardId}`, 'fields=id');
103
+ // Ensure standard labels exist
104
+ for (const name of ['AI-PIPELINE', 'CLAIMED', 'BLOCKED', 'NEEDS-FIX', 'CONFLICT']) {
105
+ await this.ensureLabel(name);
106
+ }
107
+ }
108
+ async listByState(state) {
109
+ const listId = this.listMap[state];
110
+ if (!listId)
111
+ throw new Error(`No Trello list mapping for ${state}`);
112
+ const cards = await this.get(`/lists/${listId}/cards`, 'fields=id,idShort,name,desc,idList,labels');
113
+ return cards.map((c) => this.cardToCard(c));
114
+ }
115
+ async getBySeq(seq) {
116
+ // Trello doesn't have a direct idShort lookup API.
117
+ // Search all lists for the card.
118
+ for (const state of ALL_STATES) {
119
+ const cards = await this.listByState(state);
120
+ const match = cards.find((c) => c.seq === seq);
121
+ if (match)
122
+ return match;
123
+ }
124
+ return null;
125
+ }
126
+ async move(seq, targetState) {
127
+ const card = await this.requireCard(seq);
128
+ const listId = this.listMap[targetState];
129
+ await this.put(`/cards/${card.id}`, { idList: listId });
130
+ }
131
+ async addLabel(seq, label) {
132
+ const card = await this.requireCard(seq);
133
+ const labelId = await this.ensureLabel(label);
134
+ // Check if already has this label
135
+ const existing = await this.get(`/cards/${card.id}`, 'fields=labels');
136
+ if ((existing.labels || []).some((l) => l.id === labelId))
137
+ return;
138
+ await this.post(`/cards/${card.id}/idLabels`, { value: labelId });
139
+ }
140
+ async removeLabel(seq, label) {
141
+ const card = await this.requireCard(seq);
142
+ const labelId = await this.findLabelId(label);
143
+ if (!labelId)
144
+ return;
145
+ try {
146
+ await this.del(`/cards/${card.id}/idLabels/${labelId}`);
147
+ }
148
+ catch {
149
+ // Label might not be on card — ignore
150
+ }
151
+ }
152
+ async claim(seq, workerSlot) {
153
+ // Trello claim: write JARVIS-META comment + add CLAIMED label
154
+ await this.metaWrite(seq, {
155
+ status: 'CLAIMED',
156
+ worker: workerSlot,
157
+ claimedAt: new Date().toISOString(),
158
+ });
159
+ await this.addLabel(seq, 'CLAIMED');
160
+ }
161
+ async releaseClaim(seq) {
162
+ const existing = await this.metaRead(seq);
163
+ await this.metaWrite(seq, {
164
+ ...existing,
165
+ status: 'RELEASED',
166
+ releasedAt: new Date().toISOString(),
167
+ });
168
+ await this.removeLabel(seq, 'CLAIMED');
169
+ }
170
+ async comment(seq, text) {
171
+ const card = await this.requireCard(seq);
172
+ await this.post(`/cards/${card.id}/actions/comments`, { text });
173
+ }
174
+ async create(name, desc, state) {
175
+ const listId = this.listMap[state];
176
+ const tc = await this.post('/cards', {
177
+ name,
178
+ desc,
179
+ idList: listId,
180
+ });
181
+ return this.cardToCard(tc);
182
+ }
183
+ // ─── Checklist ────────────────────────────────────────────────
184
+ async checklistCreate(seq, items) {
185
+ const card = await this.requireCard(seq);
186
+ // Create a new checklist on the card
187
+ const checklist = await this.post(`/cards/${card.id}/checklists`, { name: 'Tasks' });
188
+ for (const item of items) {
189
+ await this.post(`/checklists/${checklist.id}/checkItems`, { name: item });
190
+ }
191
+ }
192
+ async checklistList(seq) {
193
+ const card = await this.requireCard(seq);
194
+ const checklists = await this.get(`/cards/${card.id}/checklists`);
195
+ const items = [];
196
+ for (const cl of checklists) {
197
+ for (const ci of cl.checkItems || []) {
198
+ items.push({
199
+ id: ci.id,
200
+ text: ci.name,
201
+ checked: ci.state === 'complete',
202
+ });
203
+ }
204
+ }
205
+ return items;
206
+ }
207
+ async checklistCheck(seq, itemId) {
208
+ const card = await this.requireCard(seq);
209
+ // Find which checklist owns this item
210
+ const checklists = await this.get(`/cards/${card.id}/checklists`);
211
+ for (const cl of checklists) {
212
+ const item = (cl.checkItems || []).find((ci) => ci.id === itemId);
213
+ if (item) {
214
+ await this.put(`/cards/${card.id}/checkItem/${itemId}`, { state: 'complete' });
215
+ return;
216
+ }
217
+ }
218
+ throw new Error(`Checklist item ${itemId} not found`);
219
+ }
220
+ async checklistUncheck(seq, itemId) {
221
+ const card = await this.requireCard(seq);
222
+ const checklists = await this.get(`/cards/${card.id}/checklists`);
223
+ for (const cl of checklists) {
224
+ const item = (cl.checkItems || []).find((ci) => ci.id === itemId);
225
+ if (item) {
226
+ await this.put(`/cards/${card.id}/checkItem/${itemId}`, { state: 'incomplete' });
227
+ return;
228
+ }
229
+ }
230
+ throw new Error(`Checklist item ${itemId} not found`);
231
+ }
232
+ // ─── Meta (via [JARVIS-META] comment) ─────────────────────────
233
+ async metaRead(seq) {
234
+ const card = await this.requireCard(seq);
235
+ const actions = await this.get(`/cards/${card.id}/actions`, 'filter=commentCard');
236
+ // Find the most recent [JARVIS-META] comment
237
+ for (const action of actions) {
238
+ const text = action.data?.text || '';
239
+ if (text.startsWith('[JARVIS-META]')) {
240
+ try {
241
+ return JSON.parse(text.replace('[JARVIS-META]', '').trim());
242
+ }
243
+ catch {
244
+ continue;
245
+ }
246
+ }
247
+ }
248
+ return {};
249
+ }
250
+ async metaWrite(seq, data) {
251
+ const card = await this.requireCard(seq);
252
+ const text = `[JARVIS-META] ${JSON.stringify(data)}`;
253
+ // Delete old meta comments, add new one
254
+ const actions = await this.get(`/cards/${card.id}/actions`, 'filter=commentCard');
255
+ for (const action of actions) {
256
+ if ((action.data?.text || '').startsWith('[JARVIS-META]')) {
257
+ try {
258
+ await this.del(`/cards/${card.id}/actions/${action.id}/comments`);
259
+ }
260
+ catch {
261
+ // Old comment deletion may fail — non-fatal
262
+ }
263
+ }
264
+ }
265
+ await this.post(`/cards/${card.id}/actions/comments`, { text });
266
+ }
267
+ // ─── Helpers ──────────────────────────────────────────────────
268
+ async requireCard(seq) {
269
+ const card = await this.getBySeq(seq);
270
+ if (!card)
271
+ throw new Error(`Trello card with idShort ${seq} not found`);
272
+ return card;
273
+ }
274
+ async ensureLabel(name) {
275
+ const existing = await this.findLabelId(name);
276
+ if (existing)
277
+ return existing;
278
+ const label = await this.post(`/boards/${this.boardId}/labels`, { name, color: 'green' });
279
+ this.labelCache = null; // invalidate
280
+ return label.id;
281
+ }
282
+ async findLabelId(name) {
283
+ if (!this.labelCache) {
284
+ const labels = await this.get(`/boards/${this.boardId}/labels`);
285
+ this.labelCache = new Map();
286
+ for (const l of labels) {
287
+ if (l.name)
288
+ this.labelCache.set(l.name, l.id);
289
+ }
290
+ }
291
+ return this.labelCache.get(name) ?? null;
292
+ }
293
+ }
294
+ function required(raw, key) {
295
+ const val = raw[key];
296
+ if (!val)
297
+ throw new Error(`Missing required config field: ${key}`);
298
+ return val;
299
+ }
300
+ //# sourceMappingURL=TrelloTaskBackend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TrelloTaskBackend.js","sourceRoot":"","sources":["../../src/providers/TrelloTaskBackend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { ProjectConfig } from '../core/config.js';
2
+ import type { TaskBackend } from '../interfaces/TaskBackend.js';
3
+ import type { WorkerProvider } from '../interfaces/WorkerProvider.js';
4
+ import type { RepoBackend } from '../interfaces/RepoBackend.js';
5
+ import type { Notifier } from '../interfaces/Notifier.js';
6
+ export declare function createTaskBackend(config: ProjectConfig): TaskBackend;
7
+ export declare function createWorkerProvider(config: ProjectConfig): WorkerProvider;
8
+ export declare function createRepoBackend(config: ProjectConfig): RepoBackend;
9
+ export declare function createNotifier(config: ProjectConfig): Notifier;
10
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iCAAiC,CAAC;AACtE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAChE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AAS1D,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAOpE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,aAAa,GAAG,cAAc,CAM1E;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,WAAW,CAEpE;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,aAAa,GAAG,QAAQ,CAE9D"}
@@ -0,0 +1,29 @@
1
+ import { PlaneTaskBackend } from './PlaneTaskBackend.js';
2
+ import { TrelloTaskBackend } from './TrelloTaskBackend.js';
3
+ import { MarkdownTaskBackend } from './MarkdownTaskBackend.js';
4
+ import { ClaudeWorkerProvider } from './ClaudeWorkerProvider.js';
5
+ import { CodexWorkerProvider } from './CodexWorkerProvider.js';
6
+ import { GitLabRepoBackend } from './GitLabRepoBackend.js';
7
+ import { MatrixNotifier } from './MatrixNotifier.js';
8
+ export function createTaskBackend(config) {
9
+ switch (config.PM_TOOL) {
10
+ case 'plane': return new PlaneTaskBackend(config);
11
+ case 'trello': return new TrelloTaskBackend(config);
12
+ case 'markdown': return new MarkdownTaskBackend(config);
13
+ default: throw new Error(`Unknown PM_TOOL: ${config.PM_TOOL}`);
14
+ }
15
+ }
16
+ export function createWorkerProvider(config) {
17
+ switch (config.WORKER_TOOL) {
18
+ case 'claude': return new ClaudeWorkerProvider(config);
19
+ case 'codex': return new CodexWorkerProvider(config);
20
+ default: throw new Error(`Unknown WORKER_TOOL: ${config.WORKER_TOOL}`);
21
+ }
22
+ }
23
+ export function createRepoBackend(config) {
24
+ return new GitLabRepoBackend(config);
25
+ }
26
+ export function createNotifier(config) {
27
+ return new MatrixNotifier(config);
28
+ }
29
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/providers/registry.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,QAAQ,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAClD,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;QACpD,KAAK,UAAU,CAAC,CAAC,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACxD,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IACjE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAqB;IACxD,QAAQ,MAAM,CAAC,WAAW,EAAE,CAAC;QAC3B,KAAK,QAAQ,CAAC,CAAC,OAAO,IAAI,oBAAoB,CAAC,MAAM,CAAC,CAAC;QACvD,KAAK,OAAO,CAAC,CAAC,OAAO,IAAI,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACrD,OAAO,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,wBAAwB,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IACzE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,OAAO,IAAI,iBAAiB,CAAC,MAAM,CAAC,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,MAAqB;IAClD,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACpC,CAAC"}
package/package.json ADDED
@@ -0,0 +1,36 @@
1
+ {
2
+ "name": "@coralai/sps-cli",
3
+ "version": "0.6.0",
4
+ "description": "SPS CLI — AI-driven development pipeline orchestrator",
5
+ "type": "module",
6
+ "main": "dist/main.js",
7
+ "bin": {
8
+ "sps": "dist/main.js"
9
+ },
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsx src/main.ts",
13
+ "typecheck": "tsc --noEmit",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "engines": {
17
+ "node": ">=18.0.0"
18
+ },
19
+ "files": [
20
+ "dist",
21
+ "README.md"
22
+ ],
23
+ "keywords": [
24
+ "cli",
25
+ "workflow",
26
+ "pipeline",
27
+ "ai",
28
+ "orchestrator"
29
+ ],
30
+ "license": "MIT",
31
+ "devDependencies": {
32
+ "@types/node": "^25.5.0",
33
+ "tsx": "^4.21.0",
34
+ "typescript": "^5.9.3"
35
+ }
36
+ }