@lovelybunch/core 1.0.75-alpha.1 → 1.0.75-alpha.11

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 (47) hide show
  1. package/dist/change-proposal.d.ts +0 -3
  2. package/dist/change-proposal.d.ts.map +1 -1
  3. package/dist/change-proposal.js +3 -5
  4. package/dist/change-proposal.js.map +1 -1
  5. package/dist/index.d.ts +3 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +3 -1
  8. package/dist/index.js.map +1 -1
  9. package/dist/knowledge.d.ts +120 -120
  10. package/dist/knowledge.js +1 -1
  11. package/dist/knowledge.js.map +1 -1
  12. package/dist/logging/index.d.ts +5 -5
  13. package/dist/logging/index.d.ts.map +1 -1
  14. package/dist/logging/index.js +5 -5
  15. package/dist/logging/index.js.map +1 -1
  16. package/dist/logging/kinds.d.ts +24 -24
  17. package/dist/logging/kinds.d.ts.map +1 -1
  18. package/dist/logging/kinds.js +24 -24
  19. package/dist/logging/kinds.js.map +1 -1
  20. package/dist/markdown-storage.d.ts +12 -11
  21. package/dist/markdown-storage.d.ts.map +1 -1
  22. package/dist/markdown-storage.js +213 -143
  23. package/dist/markdown-storage.js.map +1 -1
  24. package/dist/skill-instructions.d.ts +19 -0
  25. package/dist/skill-instructions.d.ts.map +1 -0
  26. package/dist/skill-instructions.js +165 -0
  27. package/dist/skill-instructions.js.map +1 -0
  28. package/dist/slack.d.ts +102 -0
  29. package/dist/slack.d.ts.map +1 -0
  30. package/dist/slack.js +548 -0
  31. package/dist/slack.js.map +1 -0
  32. package/dist/storage.d.ts +21 -24
  33. package/dist/storage.d.ts.map +1 -1
  34. package/dist/storage.js +155 -181
  35. package/dist/storage.js.map +1 -1
  36. package/dist/system-prompts/coconut-assistant.md +40 -6
  37. package/dist/system-prompts/schema/agent.schema.md +1 -1
  38. package/dist/system-prompts/schema/knowledge.schema.md +2 -2
  39. package/dist/system-prompts/schema/skill.schema.md +73 -0
  40. package/dist/system-prompts/schema/{proposal.schema.md → task.schema.md} +2 -2
  41. package/dist/{proposals.d.ts → tasks.d.ts} +172 -173
  42. package/dist/tasks.d.ts.map +1 -0
  43. package/dist/{proposals.js → tasks.js} +105 -105
  44. package/dist/tasks.js.map +1 -0
  45. package/package.json +3 -2
  46. package/dist/proposals.d.ts.map +0 -1
  47. package/dist/proposals.js.map +0 -1
package/dist/slack.js ADDED
@@ -0,0 +1,548 @@
1
+ import { WebClient, LogLevel } from '@slack/web-api';
2
+ import { promises as fs, existsSync, mkdirSync } from 'fs';
3
+ import path from 'path';
4
+ import { getAppDataDir } from './app-paths.js';
5
+ // ============================================================================
6
+ // Defaults
7
+ // ============================================================================
8
+ export const DEFAULT_SLACK_CONFIG = {
9
+ enabled: false,
10
+ botToken: '',
11
+ signingSecret: '',
12
+ channelId: '',
13
+ channelName: '',
14
+ siteUrl: '',
15
+ notifications: {
16
+ proposals: { created: true, statusChange: true },
17
+ jobs: { completed: true, failed: true },
18
+ git: { push: false, merge: true },
19
+ },
20
+ };
21
+ // ============================================================================
22
+ // SlackService
23
+ // ============================================================================
24
+ export class SlackService {
25
+ client = null;
26
+ config = null;
27
+ getSettingsPath() {
28
+ const appDataDir = getAppDataDir();
29
+ if (!existsSync(appDataDir)) {
30
+ mkdirSync(appDataDir, { recursive: true });
31
+ }
32
+ return path.join(appDataDir, 'slack.json');
33
+ }
34
+ async loadConfig() {
35
+ if (this.config) {
36
+ return this.config;
37
+ }
38
+ const settingsPath = this.getSettingsPath();
39
+ try {
40
+ const raw = await fs.readFile(settingsPath, 'utf-8');
41
+ const parsed = JSON.parse(raw);
42
+ const config = { ...DEFAULT_SLACK_CONFIG, ...parsed };
43
+ this.config = config;
44
+ return config;
45
+ }
46
+ catch (error) {
47
+ if (error?.code === 'ENOENT') {
48
+ const config = { ...DEFAULT_SLACK_CONFIG };
49
+ this.config = config;
50
+ return config;
51
+ }
52
+ console.warn('[slack-service] Failed to read slack.json:', error);
53
+ const config = { ...DEFAULT_SLACK_CONFIG };
54
+ this.config = config;
55
+ return config;
56
+ }
57
+ }
58
+ async saveConfig(updates) {
59
+ const current = await this.loadConfig();
60
+ const updated = {
61
+ ...current,
62
+ ...updates,
63
+ notifications: {
64
+ ...current.notifications,
65
+ ...(updates.notifications || {}),
66
+ proposals: {
67
+ ...current.notifications.proposals,
68
+ ...(updates.notifications?.proposals || {}),
69
+ },
70
+ jobs: {
71
+ ...current.notifications.jobs,
72
+ ...(updates.notifications?.jobs || {}),
73
+ },
74
+ git: {
75
+ ...current.notifications.git,
76
+ ...(updates.notifications?.git || {}),
77
+ },
78
+ },
79
+ };
80
+ const settingsPath = this.getSettingsPath();
81
+ await fs.writeFile(settingsPath, JSON.stringify(updated, null, 2), 'utf-8');
82
+ // Reset cached config and client
83
+ this.config = updated;
84
+ this.client = null;
85
+ return updated;
86
+ }
87
+ async getConfigForDisplay() {
88
+ const config = await this.loadConfig();
89
+ return {
90
+ enabled: config.enabled,
91
+ channelId: config.channelId,
92
+ channelName: config.channelName,
93
+ siteUrl: config.siteUrl,
94
+ notifications: config.notifications,
95
+ hasBotToken: !!config.botToken && config.botToken.length > 0,
96
+ hasSigningSecret: !!config.signingSecret && config.signingSecret.length > 0,
97
+ };
98
+ }
99
+ getClient() {
100
+ if (this.client) {
101
+ return this.client;
102
+ }
103
+ if (!this.config?.botToken) {
104
+ return null;
105
+ }
106
+ this.client = new WebClient(this.config.botToken, {
107
+ logLevel: LogLevel.WARN,
108
+ });
109
+ return this.client;
110
+ }
111
+ async testConnection() {
112
+ try {
113
+ await this.loadConfig();
114
+ const client = this.getClient();
115
+ if (!client) {
116
+ return { success: false, error: 'Bot token not configured' };
117
+ }
118
+ const result = await client.auth.test();
119
+ if (result.ok) {
120
+ return {
121
+ success: true,
122
+ teamName: result.team,
123
+ };
124
+ }
125
+ else {
126
+ return { success: false, error: result.error || 'Unknown error' };
127
+ }
128
+ }
129
+ catch (error) {
130
+ return {
131
+ success: false,
132
+ error: error.message || 'Failed to connect to Slack',
133
+ };
134
+ }
135
+ }
136
+ async listChannels() {
137
+ try {
138
+ await this.loadConfig();
139
+ const client = this.getClient();
140
+ if (!client) {
141
+ throw new Error('Bot token not configured');
142
+ }
143
+ const channels = [];
144
+ let cursor;
145
+ // First try to fetch both public and private channels
146
+ // Fall back to public only if groups:read scope is missing
147
+ let channelTypes = 'public_channel,private_channel';
148
+ try {
149
+ await client.conversations.list({ types: 'private_channel', limit: 1 });
150
+ }
151
+ catch (error) {
152
+ if (error.data?.error === 'missing_scope' && error.data?.needed === 'groups:read') {
153
+ channelTypes = 'public_channel';
154
+ }
155
+ }
156
+ do {
157
+ const result = await client.conversations.list({
158
+ types: channelTypes,
159
+ limit: 200,
160
+ cursor,
161
+ });
162
+ if (result.channels) {
163
+ for (const channel of result.channels) {
164
+ if (channel.id && channel.name) {
165
+ channels.push({
166
+ id: channel.id,
167
+ name: channel.name,
168
+ isPrivate: channel.is_private || false,
169
+ isMember: channel.is_member || false,
170
+ });
171
+ }
172
+ }
173
+ }
174
+ cursor = result.response_metadata?.next_cursor;
175
+ } while (cursor);
176
+ channels.sort((a, b) => a.name.localeCompare(b.name));
177
+ return channels;
178
+ }
179
+ catch (error) {
180
+ console.error('[slack-service] Failed to list channels:', error);
181
+ if (error.data?.error === 'missing_scope' || error.message?.includes('missing_scope')) {
182
+ throw new Error('Missing required Slack scopes. Please add "channels:read" (and optionally "groups:read" for private channels) to your Slack app under OAuth & Permissions.');
183
+ }
184
+ if (error.data?.error === 'invalid_auth' || error.message?.includes('invalid_auth')) {
185
+ throw new Error('Invalid bot token. Please check your Bot User OAuth Token.');
186
+ }
187
+ if (error.data?.error === 'token_revoked' || error.message?.includes('token_revoked')) {
188
+ throw new Error('Bot token has been revoked. Please reinstall the Slack app to your workspace.');
189
+ }
190
+ throw new Error(error.message || 'Failed to list channels');
191
+ }
192
+ }
193
+ async sendNotification(payload) {
194
+ try {
195
+ const config = await this.loadConfig();
196
+ if (!config.enabled || !config.channelId) {
197
+ return false;
198
+ }
199
+ if (!this.isNotificationEnabled(config, payload)) {
200
+ return false;
201
+ }
202
+ const client = this.getClient();
203
+ if (!client) {
204
+ console.warn('[slack-service] Cannot send notification: bot token not configured');
205
+ return false;
206
+ }
207
+ const message = this.formatNotification(payload);
208
+ await client.chat.postMessage({
209
+ channel: config.channelId,
210
+ ...message,
211
+ });
212
+ return true;
213
+ }
214
+ catch (error) {
215
+ console.error('[slack-service] Failed to send notification:', error);
216
+ return false;
217
+ }
218
+ }
219
+ /**
220
+ * Send an example notification for testing a specific notification type.
221
+ * Bypasses the enabled check so users can test before enabling.
222
+ */
223
+ async sendExampleNotification(notificationType) {
224
+ try {
225
+ const config = await this.loadConfig();
226
+ if (!config.channelId) {
227
+ throw new Error('No channel configured. Please select a channel first.');
228
+ }
229
+ const client = this.getClient();
230
+ if (!client) {
231
+ throw new Error('Bot token not configured');
232
+ }
233
+ const payload = this.getExamplePayload(notificationType);
234
+ const message = this.formatNotification(payload);
235
+ await client.chat.postMessage({
236
+ channel: config.channelId,
237
+ ...message,
238
+ });
239
+ return true;
240
+ }
241
+ catch (error) {
242
+ console.error('[slack-service] Failed to send example notification:', error);
243
+ throw error;
244
+ }
245
+ }
246
+ /**
247
+ * Send a freeform text message to the configured Slack channel.
248
+ * Used by the CLI for ad-hoc messages.
249
+ */
250
+ async sendFreeformMessage(message, options) {
251
+ const config = await this.loadConfig();
252
+ if (!config.botToken) {
253
+ throw new Error('Slack bot token not configured. Set up Slack in your Coconut dashboard under Settings > Notifications.');
254
+ }
255
+ if (!config.channelId) {
256
+ throw new Error('No Slack channel configured. Select a channel in your Coconut dashboard under Settings > Notifications.');
257
+ }
258
+ const client = this.getClient();
259
+ if (!client) {
260
+ throw new Error('Failed to create Slack client');
261
+ }
262
+ const blocks = [];
263
+ if (options?.title) {
264
+ blocks.push({
265
+ type: 'section',
266
+ text: {
267
+ type: 'mrkdwn',
268
+ text: `:palm_tree: *${options.title}*\n${message}`,
269
+ },
270
+ });
271
+ }
272
+ else {
273
+ blocks.push({
274
+ type: 'section',
275
+ text: {
276
+ type: 'mrkdwn',
277
+ text: `:palm_tree: ${message}`,
278
+ },
279
+ });
280
+ }
281
+ await client.chat.postMessage({
282
+ channel: config.channelId,
283
+ text: options?.title ? `${options.title}: ${message}` : message,
284
+ blocks,
285
+ });
286
+ return true;
287
+ }
288
+ // ============================================================================
289
+ // Internal helpers
290
+ // ============================================================================
291
+ getExamplePayload(type) {
292
+ switch (type) {
293
+ case 'proposal.created':
294
+ return {
295
+ type: 'proposal.created',
296
+ proposalId: 'cp-example-123',
297
+ intent: 'Add user authentication flow',
298
+ author: 'Example User',
299
+ };
300
+ case 'proposal.statusChange':
301
+ return {
302
+ type: 'proposal.statusChange',
303
+ proposalId: 'cp-example-123',
304
+ intent: 'Add user authentication flow',
305
+ status: 'proposed',
306
+ previousStatus: 'draft',
307
+ };
308
+ case 'job.completed':
309
+ return {
310
+ type: 'job.completed',
311
+ jobId: 'job-example-456',
312
+ jobName: 'Daily code review sync',
313
+ duration: 45000,
314
+ };
315
+ case 'job.failed':
316
+ return {
317
+ type: 'job.failed',
318
+ jobId: 'job-example-456',
319
+ jobName: 'Daily code review sync',
320
+ error: 'Connection timeout after 30 seconds',
321
+ };
322
+ case 'git.push':
323
+ return {
324
+ type: 'git.push',
325
+ branch: 'feature/example-branch',
326
+ commitCount: 3,
327
+ };
328
+ case 'git.merge':
329
+ return {
330
+ type: 'git.merge',
331
+ branch: 'feature/example-branch',
332
+ targetBranch: 'main',
333
+ message: 'Merged feature branch into main',
334
+ };
335
+ default:
336
+ throw new Error(`Unknown notification type: ${type}`);
337
+ }
338
+ }
339
+ isNotificationEnabled(config, payload) {
340
+ switch (payload.type) {
341
+ case 'proposal.created':
342
+ return config.notifications.proposals.created;
343
+ case 'proposal.statusChange':
344
+ return config.notifications.proposals.statusChange;
345
+ case 'job.completed':
346
+ return config.notifications.jobs.completed;
347
+ case 'job.failed':
348
+ return config.notifications.jobs.failed;
349
+ case 'git.push':
350
+ return config.notifications.git.push;
351
+ case 'git.merge':
352
+ return config.notifications.git.merge;
353
+ default:
354
+ return false;
355
+ }
356
+ }
357
+ formatNotification(payload) {
358
+ switch (payload.type) {
359
+ case 'proposal.created':
360
+ return this.formatProposalCreated(payload);
361
+ case 'proposal.statusChange':
362
+ return this.formatProposalStatusChange(payload);
363
+ case 'job.completed':
364
+ return this.formatJobCompleted(payload);
365
+ case 'job.failed':
366
+ return this.formatJobFailed(payload);
367
+ case 'git.push':
368
+ return this.formatGitPush(payload);
369
+ case 'git.merge':
370
+ return this.formatGitMerge(payload);
371
+ default:
372
+ return { text: 'Unknown notification type' };
373
+ }
374
+ }
375
+ formatProposalCreated(payload) {
376
+ const text = `New proposal created: ${payload.intent}`;
377
+ const siteUrl = this.config?.siteUrl;
378
+ const proposalUrl = siteUrl ? `${siteUrl}/proposals/${payload.proposalId}` : null;
379
+ const blocks = [
380
+ {
381
+ type: 'section',
382
+ text: {
383
+ type: 'mrkdwn',
384
+ text: `:memo: *New Proposal Created*\n*${payload.intent}*\nA new change proposal has been submitted for review.`,
385
+ },
386
+ },
387
+ {
388
+ type: 'context',
389
+ elements: [
390
+ {
391
+ type: 'mrkdwn',
392
+ text: `ID: \`${payload.proposalId}\`${payload.author ? ` | Author: ${payload.author}` : ''}`,
393
+ },
394
+ ],
395
+ },
396
+ ];
397
+ if (proposalUrl) {
398
+ blocks.push({
399
+ type: 'actions',
400
+ elements: [
401
+ {
402
+ type: 'button',
403
+ text: { type: 'plain_text', text: 'View Proposal', emoji: true },
404
+ url: proposalUrl,
405
+ action_id: 'view_proposal',
406
+ },
407
+ ],
408
+ });
409
+ }
410
+ return { text, blocks };
411
+ }
412
+ formatProposalStatusChange(payload) {
413
+ const statusEmoji = this.getStatusEmoji(payload.status);
414
+ const text = `Proposal status changed: ${payload.intent} → ${payload.status}`;
415
+ const siteUrl = this.config?.siteUrl;
416
+ const proposalUrl = siteUrl ? `${siteUrl}/proposals/${payload.proposalId}` : null;
417
+ const blocks = [
418
+ {
419
+ type: 'section',
420
+ text: {
421
+ type: 'mrkdwn',
422
+ text: `${statusEmoji} *Proposal Status Changed*\n*${payload.intent}*\nThe proposal has moved to a new stage in the review process.`,
423
+ },
424
+ },
425
+ {
426
+ type: 'context',
427
+ elements: [
428
+ {
429
+ type: 'mrkdwn',
430
+ text: `\`${payload.previousStatus || 'unknown'}\` → \`${payload.status}\` | ID: \`${payload.proposalId}\``,
431
+ },
432
+ ],
433
+ },
434
+ ];
435
+ if (proposalUrl) {
436
+ blocks.push({
437
+ type: 'actions',
438
+ elements: [
439
+ {
440
+ type: 'button',
441
+ text: { type: 'plain_text', text: 'View Proposal', emoji: true },
442
+ url: proposalUrl,
443
+ action_id: 'view_proposal',
444
+ },
445
+ ],
446
+ });
447
+ }
448
+ return { text, blocks };
449
+ }
450
+ formatJobCompleted(payload) {
451
+ const duration = payload.duration ? `${Math.round(payload.duration / 1000)}s` : 'unknown';
452
+ const text = `Job completed: ${payload.jobName}`;
453
+ return {
454
+ text,
455
+ blocks: [
456
+ {
457
+ type: 'section',
458
+ text: { type: 'mrkdwn', text: `:white_check_mark: *Job Completed*\n*${payload.jobName}*\nThe scheduled job finished successfully.` },
459
+ },
460
+ {
461
+ type: 'context',
462
+ elements: [{ type: 'mrkdwn', text: `Duration: ${duration} | ID: \`${payload.jobId}\`` }],
463
+ },
464
+ ],
465
+ };
466
+ }
467
+ formatJobFailed(payload) {
468
+ const text = `Job failed: ${payload.jobName}`;
469
+ return {
470
+ text,
471
+ blocks: [
472
+ {
473
+ type: 'section',
474
+ text: { type: 'mrkdwn', text: `:x: *Job Failed*\n*${payload.jobName}*\nThe scheduled job encountered an error and did not complete.` },
475
+ },
476
+ {
477
+ type: 'context',
478
+ elements: [{ type: 'mrkdwn', text: `ID: \`${payload.jobId}\`${payload.error ? `\nError: ${payload.error.slice(0, 200)}` : ''}` }],
479
+ },
480
+ ],
481
+ };
482
+ }
483
+ formatGitPush(payload) {
484
+ const text = `Pushed to ${payload.branch}`;
485
+ return {
486
+ text,
487
+ blocks: [
488
+ {
489
+ type: 'section',
490
+ text: { type: 'mrkdwn', text: `:arrow_up: *Git Push*\nPushed to \`${payload.branch}\`\nCode changes have been pushed to the remote repository.` },
491
+ },
492
+ {
493
+ type: 'context',
494
+ elements: [{ type: 'mrkdwn', text: payload.commitCount ? `${payload.commitCount} commit(s)` : 'Commits pushed' }],
495
+ },
496
+ ],
497
+ };
498
+ }
499
+ formatGitMerge(payload) {
500
+ const text = `Merged ${payload.branch} into ${payload.targetBranch}`;
501
+ return {
502
+ text,
503
+ blocks: [
504
+ {
505
+ type: 'section',
506
+ text: { type: 'mrkdwn', text: `:twisted_rightwards_arrows: *Git Merge*\nMerged \`${payload.branch}\` into \`${payload.targetBranch || 'target'}\`\nBranches have been combined successfully.` },
507
+ },
508
+ {
509
+ type: 'context',
510
+ elements: [{ type: 'mrkdwn', text: payload.message || 'Merge completed' }],
511
+ },
512
+ ],
513
+ };
514
+ }
515
+ getStatusEmoji(status) {
516
+ switch (status) {
517
+ case 'approved':
518
+ return ':white_check_mark:';
519
+ case 'merged':
520
+ return ':tada:';
521
+ case 'rejected':
522
+ return ':no_entry:';
523
+ case 'in-review':
524
+ return ':eyes:';
525
+ case 'proposed':
526
+ return ':raising_hand:';
527
+ case 'draft':
528
+ return ':pencil2:';
529
+ default:
530
+ return ':arrows_counterclockwise:';
531
+ }
532
+ }
533
+ clearCache() {
534
+ this.config = null;
535
+ this.client = null;
536
+ }
537
+ }
538
+ // ============================================================================
539
+ // Singleton
540
+ // ============================================================================
541
+ let slackServiceInstance = null;
542
+ export function getSlackService() {
543
+ if (!slackServiceInstance) {
544
+ slackServiceInstance = new SlackService();
545
+ }
546
+ return slackServiceInstance;
547
+ }
548
+ //# sourceMappingURL=slack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"slack.js","sourceRoot":"","sources":["../src/slack.ts"],"names":[],"mappings":"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"}
package/dist/storage.d.ts CHANGED
@@ -1,17 +1,17 @@
1
- import type { ChangeProposal, GaitConfig, Agent } from '@lovelybunch/types';
1
+ import type { Task, GaitConfig, Skill } from '@lovelybunch/types';
2
2
  import { MarkdownStorageAdapter } from './markdown-storage.js';
3
3
  export interface StorageAdapter {
4
4
  init(): Promise<void>;
5
- saveProposal(proposal: ChangeProposal): Promise<void>;
6
- loadProposal(id: string): Promise<ChangeProposal | null>;
7
- loadAllProposals(): Promise<ChangeProposal[]>;
8
- deleteProposal(id: string): Promise<boolean>;
5
+ saveTask(task: Task): Promise<void>;
6
+ loadTask(id: string): Promise<Task | null>;
7
+ loadAllTasks(): Promise<Task[]>;
8
+ deleteTask(id: string): Promise<boolean>;
9
9
  saveConfig(config: GaitConfig): Promise<void>;
10
10
  loadConfig(): Promise<GaitConfig | null>;
11
- saveAgent(agent: Agent): Promise<void>;
12
- loadAgent(id: string): Promise<Agent | null>;
13
- loadAllAgents(): Promise<Agent[]>;
14
- deleteAgent(id: string): Promise<boolean>;
11
+ saveSkill(skill: Skill): Promise<void>;
12
+ loadSkill(id: string): Promise<Skill | null>;
13
+ loadAllSkills(): Promise<Skill[]>;
14
+ deleteSkill(id: string): Promise<boolean>;
15
15
  getBasePath?(options?: {
16
16
  absolute?: boolean;
17
17
  }): string;
@@ -19,9 +19,9 @@ export interface StorageAdapter {
19
19
  }
20
20
  export declare class FileStorageAdapter implements StorageAdapter {
21
21
  private basePath;
22
- private proposalsPath;
22
+ private tasksPath;
23
23
  private configPath;
24
- private agentsPath;
24
+ private skillsPath;
25
25
  constructor(basePath?: string);
26
26
  init(): Promise<void>;
27
27
  private ensureSchemaFiles;
@@ -33,10 +33,10 @@ export declare class FileStorageAdapter implements StorageAdapter {
33
33
  private processTemplateContent;
34
34
  private createMinimalContext;
35
35
  private createContextFile;
36
- saveProposal(proposal: ChangeProposal): Promise<void>;
37
- loadProposal(id: string): Promise<ChangeProposal | null>;
38
- loadAllProposals(): Promise<ChangeProposal[]>;
39
- deleteProposal(id: string): Promise<boolean>;
36
+ saveTask(task: Task): Promise<void>;
37
+ loadTask(id: string): Promise<Task | null>;
38
+ loadAllTasks(): Promise<Task[]>;
39
+ deleteTask(id: string): Promise<boolean>;
40
40
  saveConfig(config: GaitConfig): Promise<void>;
41
41
  loadConfig(): Promise<GaitConfig | null>;
42
42
  private fileExists;
@@ -51,15 +51,12 @@ export declare class FileStorageAdapter implements StorageAdapter {
51
51
  getBasePath(options?: {
52
52
  absolute?: boolean;
53
53
  }): string;
54
- saveAgent(agent: Agent): Promise<void>;
55
- private findAgentPath;
56
- private pathToId;
57
- loadAgent(id: string): Promise<Agent | null>;
58
- loadAllAgents(): Promise<Agent[]>;
59
- private findAgentFiles;
60
- deleteAgent(id: string): Promise<boolean>;
61
- private agentToMarkdown;
62
- private markdownToAgent;
54
+ saveSkill(skill: Skill): Promise<void>;
55
+ loadSkill(id: string): Promise<Skill | null>;
56
+ loadAllSkills(): Promise<Skill[]>;
57
+ deleteSkill(id: string): Promise<boolean>;
58
+ private skillToMarkdown;
59
+ private markdownToSkill;
63
60
  }
64
61
  export declare const fileStorage: MarkdownStorageAdapter;
65
62
  //# sourceMappingURL=storage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"storage.d.ts","sourceRoot":"","sources":["../src/storage.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAClE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAG/D,MAAM,WAAW,cAAc;IAC7B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACpC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;IAC3C,YAAY,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChC,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9C,UAAU,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAAC;IACzC,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,CAAC;IAC7C,aAAa,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IAClC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAC1C,WAAW,CAAC,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM,CAAC;IACvD,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC/B;AAED,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;gBAEf,QAAQ,GAAE,MAAe;IAO/B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YA4Cb,iBAAiB;IAazB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;YAIrB,mBAAmB;YAKnB,iBAAiB;IAe/B,OAAO,CAAC,eAAe;YAQT,qBAAqB;IAuBnC,OAAO,CAAC,sBAAsB;YAShB,oBAAoB;YAsBpB,iBAAiB;IAUzB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnC,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC;IAgB1C,YAAY,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;IAiB/B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAWxC,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAK7C,UAAU,IAAI,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;YAShC,UAAU;IASxB,OAAO,CAAC,YAAY;IAmDpB;;OAEG;IACG,aAAa,IAAI,OAAO,CAAC,OAAO,CAAC;IAIvC;;OAEG;IACH,WAAW,CAAC,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM;IAM/C,SAAS,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;IAUtC,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;IAW5C,aAAa,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;IAyBjC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAY/C,OAAO,CAAC,eAAe;IAmCvB,OAAO,CAAC,eAAe;CAsDxB;AAGD,eAAO,MAAM,WAAW,wBAA+B,CAAC"}