@mind-your-now/myn 0.4.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 (86) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +318 -0
  3. package/dist/index.d.ts +77 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +147 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/src/client.d.ts +40 -0
  8. package/dist/src/client.d.ts.map +1 -0
  9. package/dist/src/client.js +95 -0
  10. package/dist/src/client.js.map +1 -0
  11. package/dist/src/tools/briefing.d.ts +44 -0
  12. package/dist/src/tools/briefing.d.ts.map +1 -0
  13. package/dist/src/tools/briefing.js +116 -0
  14. package/dist/src/tools/briefing.js.map +1 -0
  15. package/dist/src/tools/calendar.d.ts +56 -0
  16. package/dist/src/tools/calendar.d.ts.map +1 -0
  17. package/dist/src/tools/calendar.js +206 -0
  18. package/dist/src/tools/calendar.js.map +1 -0
  19. package/dist/src/tools/capabilityHash.d.ts +26 -0
  20. package/dist/src/tools/capabilityHash.d.ts.map +1 -0
  21. package/dist/src/tools/capabilityHash.js +48 -0
  22. package/dist/src/tools/capabilityHash.js.map +1 -0
  23. package/dist/src/tools/habits.d.ts +43 -0
  24. package/dist/src/tools/habits.d.ts.map +1 -0
  25. package/dist/src/tools/habits.js +123 -0
  26. package/dist/src/tools/habits.js.map +1 -0
  27. package/dist/src/tools/household.d.ts +44 -0
  28. package/dist/src/tools/household.d.ts.map +1 -0
  29. package/dist/src/tools/household.js +146 -0
  30. package/dist/src/tools/household.js.map +1 -0
  31. package/dist/src/tools/lists.d.ts +45 -0
  32. package/dist/src/tools/lists.d.ts.map +1 -0
  33. package/dist/src/tools/lists.js +167 -0
  34. package/dist/src/tools/lists.js.map +1 -0
  35. package/dist/src/tools/memory.d.ts +45 -0
  36. package/dist/src/tools/memory.d.ts.map +1 -0
  37. package/dist/src/tools/memory.js +131 -0
  38. package/dist/src/tools/memory.js.map +1 -0
  39. package/dist/src/tools/myn_a2a_pairing.d.ts +42 -0
  40. package/dist/src/tools/myn_a2a_pairing.d.ts.map +1 -0
  41. package/dist/src/tools/myn_a2a_pairing.js +166 -0
  42. package/dist/src/tools/myn_a2a_pairing.js.map +1 -0
  43. package/dist/src/tools/planning.d.ts +56 -0
  44. package/dist/src/tools/planning.d.ts.map +1 -0
  45. package/dist/src/tools/planning.js +94 -0
  46. package/dist/src/tools/planning.js.map +1 -0
  47. package/dist/src/tools/profile.d.ts +47 -0
  48. package/dist/src/tools/profile.d.ts.map +1 -0
  49. package/dist/src/tools/profile.js +125 -0
  50. package/dist/src/tools/profile.js.map +1 -0
  51. package/dist/src/tools/projects.d.ts +45 -0
  52. package/dist/src/tools/projects.d.ts.map +1 -0
  53. package/dist/src/tools/projects.js +106 -0
  54. package/dist/src/tools/projects.js.map +1 -0
  55. package/dist/src/tools/search.d.ts +46 -0
  56. package/dist/src/tools/search.d.ts.map +1 -0
  57. package/dist/src/tools/search.js +93 -0
  58. package/dist/src/tools/search.js.map +1 -0
  59. package/dist/src/tools/syncOnMismatch.d.ts +48 -0
  60. package/dist/src/tools/syncOnMismatch.d.ts.map +1 -0
  61. package/dist/src/tools/syncOnMismatch.js +94 -0
  62. package/dist/src/tools/syncOnMismatch.js.map +1 -0
  63. package/dist/src/tools/tasks.d.ts +52 -0
  64. package/dist/src/tools/tasks.d.ts.map +1 -0
  65. package/dist/src/tools/tasks.js +200 -0
  66. package/dist/src/tools/tasks.js.map +1 -0
  67. package/dist/src/tools/timers.d.ts +48 -0
  68. package/dist/src/tools/timers.d.ts.map +1 -0
  69. package/dist/src/tools/timers.js +138 -0
  70. package/dist/src/tools/timers.js.map +1 -0
  71. package/openclaw.plugin.json +30 -0
  72. package/package.json +74 -0
  73. package/skills/myn/SKILL.md +54 -0
  74. package/skills/myn/references/authentication.md +83 -0
  75. package/skills/myn/references/briefing-api.md +187 -0
  76. package/skills/myn/references/calendar-api.md +139 -0
  77. package/skills/myn/references/habits-api.md +257 -0
  78. package/skills/myn/references/household-api.md +175 -0
  79. package/skills/myn/references/lists-api.md +180 -0
  80. package/skills/myn/references/memory-api.md +95 -0
  81. package/skills/myn/references/planning-api.md +191 -0
  82. package/skills/myn/references/profile-api.md +148 -0
  83. package/skills/myn/references/projects-api.md +127 -0
  84. package/skills/myn/references/search-api.md +97 -0
  85. package/skills/myn/references/tasks-api.md +187 -0
  86. package/skills/myn/references/timers-api.md +171 -0
@@ -0,0 +1,52 @@
1
+ /**
2
+ * myn_tasks tool - Task CRUD, lifecycle, and search
3
+ */
4
+ import type { MynApiClient } from '../client.js';
5
+ export declare const TasksInputSchema: import("@sinclair/typebox").TObject<{
6
+ action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"list">, import("@sinclair/typebox").TLiteral<"get">, import("@sinclair/typebox").TLiteral<"create">, import("@sinclair/typebox").TLiteral<"update">, import("@sinclair/typebox").TLiteral<"complete">, import("@sinclair/typebox").TLiteral<"archive">, import("@sinclair/typebox").TLiteral<"search">]>;
7
+ status: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"PENDING">, import("@sinclair/typebox").TLiteral<"IN_PROGRESS">, import("@sinclair/typebox").TLiteral<"COMPLETED">, import("@sinclair/typebox").TLiteral<"ARCHIVED">]>>;
8
+ priority: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"CRITICAL">, import("@sinclair/typebox").TLiteral<"OPPORTUNITY_NOW">, import("@sinclair/typebox").TLiteral<"OVER_THE_HORIZON">, import("@sinclair/typebox").TLiteral<"PARKING_LOT">]>>;
9
+ projectId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
10
+ startDate: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
11
+ endDate: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
12
+ limit: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
13
+ offset: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
14
+ taskId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
15
+ title: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
16
+ description: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
17
+ taskType: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"TASK">, import("@sinclair/typebox").TLiteral<"HABIT">, import("@sinclair/typebox").TLiteral<"CHORE">]>>;
18
+ duration: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
19
+ id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
20
+ recurrenceRule: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
21
+ updates: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TUnknown>>;
22
+ query: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
23
+ includeArchived: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
24
+ }>;
25
+ export type TasksInput = typeof TasksInputSchema.static;
26
+ export declare function executeTasks(client: MynApiClient, input: TasksInput): Promise<{
27
+ success: true;
28
+ data: unknown;
29
+ } | {
30
+ success: false;
31
+ error: string;
32
+ details?: unknown;
33
+ }>;
34
+ export declare function registerTasksTool(api: OpenClawPluginApi, client: MynApiClient): void;
35
+ interface OpenClawPluginApi {
36
+ registerTool(tool: {
37
+ id: string;
38
+ name: string;
39
+ description: string;
40
+ inputSchema: unknown;
41
+ execute: (input: unknown) => Promise<unknown>;
42
+ }): void;
43
+ logger: {
44
+ debug(message: string): void;
45
+ info(message: string): void;
46
+ warn(message: string): void;
47
+ error(message: string): void;
48
+ };
49
+ pluginConfig?: Record<string, unknown>;
50
+ }
51
+ export {};
52
+ //# sourceMappingURL=tasks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../../src/tools/tasks.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAwBjD,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;EAiC3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,OAAO,gBAAgB,CAAC,MAAM,CAAC;AAExD,wBAAsB,YAAY,CAChC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CA0BlG;AA4GD,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAUpF;AAGD,UAAU,iBAAiB;IACzB,YAAY,CAAC,IAAI,EAAE;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;QACrB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAC/C,GAAG,IAAI,CAAC;IACT,MAAM,EAAE;QACN,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC"}
@@ -0,0 +1,200 @@
1
+ /**
2
+ * myn_tasks tool - Task CRUD, lifecycle, and search
3
+ */
4
+ import { Type } from '@sinclair/typebox';
5
+ import { jsonResult, errorResult } from '../client.js';
6
+ // Schema definitions
7
+ const PrioritySchema = Type.Union([
8
+ Type.Literal('CRITICAL'),
9
+ Type.Literal('OPPORTUNITY_NOW'),
10
+ Type.Literal('OVER_THE_HORIZON'),
11
+ Type.Literal('PARKING_LOT')
12
+ ]);
13
+ const TaskTypeSchema = Type.Union([
14
+ Type.Literal('TASK'),
15
+ Type.Literal('HABIT'),
16
+ Type.Literal('CHORE')
17
+ ]);
18
+ const TaskStatusSchema = Type.Union([
19
+ Type.Literal('PENDING'),
20
+ Type.Literal('IN_PROGRESS'),
21
+ Type.Literal('COMPLETED'),
22
+ Type.Literal('ARCHIVED')
23
+ ]);
24
+ export const TasksInputSchema = Type.Object({
25
+ action: Type.Union([
26
+ Type.Literal('list'),
27
+ Type.Literal('get'),
28
+ Type.Literal('create'),
29
+ Type.Literal('update'),
30
+ Type.Literal('complete'),
31
+ Type.Literal('archive'),
32
+ Type.Literal('search')
33
+ ]),
34
+ // List parameters
35
+ status: Type.Optional(TaskStatusSchema),
36
+ priority: Type.Optional(PrioritySchema),
37
+ projectId: Type.Optional(Type.String()),
38
+ startDate: Type.Optional(Type.String({ format: 'date' })),
39
+ endDate: Type.Optional(Type.String({ format: 'date' })),
40
+ limit: Type.Optional(Type.Number({ default: 20 })),
41
+ offset: Type.Optional(Type.Number({ default: 0 })),
42
+ // Get/Update/Complete/Archive parameters
43
+ taskId: Type.Optional(Type.String({ format: 'uuid' })),
44
+ // Create/Update parameters
45
+ title: Type.Optional(Type.String({ minLength: 1, maxLength: 200 })),
46
+ description: Type.Optional(Type.String({ maxLength: 2000 })),
47
+ taskType: Type.Optional(TaskTypeSchema),
48
+ duration: Type.Optional(Type.String()), // "30m", "1h", "1h30m"
49
+ // Create specific
50
+ id: Type.Optional(Type.String({ format: 'uuid' })), // Client-generated UUID
51
+ recurrenceRule: Type.Optional(Type.String()), // For HABIT/CHORE types
52
+ // Update specific
53
+ updates: Type.Optional(Type.Record(Type.String(), Type.Unknown())),
54
+ // Search parameters
55
+ query: Type.Optional(Type.String()),
56
+ includeArchived: Type.Optional(Type.Boolean({ default: false }))
57
+ });
58
+ export async function executeTasks(client, input) {
59
+ try {
60
+ switch (input.action) {
61
+ case 'list':
62
+ return await listTasks(client, input);
63
+ case 'get':
64
+ return await getTask(client, input);
65
+ case 'create':
66
+ return await createTask(client, input);
67
+ case 'update':
68
+ return await updateTask(client, input);
69
+ case 'complete':
70
+ return await completeTask(client, input);
71
+ case 'archive':
72
+ return await archiveTask(client, input);
73
+ case 'search':
74
+ return await searchTasks(client, input);
75
+ default:
76
+ return errorResult(`Unknown action: ${input.action}`);
77
+ }
78
+ }
79
+ catch (error) {
80
+ if (error instanceof Error) {
81
+ return errorResult(error.message);
82
+ }
83
+ return errorResult('Unknown error occurred');
84
+ }
85
+ }
86
+ async function listTasks(client, input) {
87
+ const params = new URLSearchParams();
88
+ if (input.status)
89
+ params.append('status', input.status);
90
+ if (input.priority)
91
+ params.append('priority', input.priority);
92
+ if (input.projectId)
93
+ params.append('projectId', input.projectId);
94
+ if (input.startDate)
95
+ params.append('startDate', input.startDate);
96
+ if (input.endDate)
97
+ params.append('endDate', input.endDate);
98
+ if (input.limit)
99
+ params.append('limit', input.limit.toString());
100
+ if (input.offset)
101
+ params.append('offset', input.offset.toString());
102
+ const queryString = params.toString() ? `?${params.toString()}` : '';
103
+ const data = await client.get(`/api/v2/unified-tasks${queryString}`);
104
+ return jsonResult(data);
105
+ }
106
+ async function getTask(client, input) {
107
+ if (!input.taskId) {
108
+ return errorResult('taskId is required for get action');
109
+ }
110
+ const data = await client.get(`/api/v2/unified-tasks/${input.taskId}`);
111
+ return jsonResult(data);
112
+ }
113
+ async function createTask(client, input) {
114
+ if (!input.title) {
115
+ return errorResult('title is required for create action');
116
+ }
117
+ if (!input.priority) {
118
+ return errorResult('priority is required for create action (CRITICAL, OPPORTUNITY_NOW, OVER_THE_HORIZON, PARKING_LOT)');
119
+ }
120
+ if (!input.taskType) {
121
+ return errorResult('taskType is required for create action (TASK, HABIT, CHORE)');
122
+ }
123
+ if (!input.startDate) {
124
+ return errorResult('startDate is required for create action');
125
+ }
126
+ if (!input.id) {
127
+ return errorResult('id (client-generated UUID) is required for create action');
128
+ }
129
+ const body = {
130
+ id: input.id,
131
+ title: input.title,
132
+ taskType: input.taskType,
133
+ priority: input.priority,
134
+ startDate: input.startDate
135
+ };
136
+ if (input.description)
137
+ body.description = input.description;
138
+ if (input.duration)
139
+ body.duration = input.duration;
140
+ if (input.projectId)
141
+ body.projectId = input.projectId;
142
+ if (input.recurrenceRule)
143
+ body.recurrenceRule = input.recurrenceRule;
144
+ // Validation: HABIT and CHORE must have recurrenceRule
145
+ if ((input.taskType === 'HABIT' || input.taskType === 'CHORE') && !input.recurrenceRule) {
146
+ return errorResult(`${input.taskType} type requires recurrenceRule`);
147
+ }
148
+ const data = await client.post('/api/v2/unified-tasks', body);
149
+ return jsonResult(data);
150
+ }
151
+ async function updateTask(client, input) {
152
+ if (!input.taskId) {
153
+ return errorResult('taskId is required for update action');
154
+ }
155
+ if (!input.updates || Object.keys(input.updates).length === 0) {
156
+ return errorResult('updates object is required for update action');
157
+ }
158
+ const data = await client.patch(`/api/v2/unified-tasks/${input.taskId}`, input.updates);
159
+ return jsonResult(data);
160
+ }
161
+ async function completeTask(client, input) {
162
+ if (!input.taskId) {
163
+ return errorResult('taskId is required for complete action');
164
+ }
165
+ const data = await client.post(`/api/v2/unified-tasks/${input.taskId}/complete`, {});
166
+ return jsonResult(data);
167
+ }
168
+ async function archiveTask(client, input) {
169
+ if (!input.taskId) {
170
+ return errorResult('taskId is required for archive action');
171
+ }
172
+ const data = await client.post(`/api/v2/unified-tasks/${input.taskId}/archive`, {});
173
+ return jsonResult(data);
174
+ }
175
+ async function searchTasks(client, input) {
176
+ const params = new URLSearchParams();
177
+ if (input.query)
178
+ params.append('q', input.query);
179
+ if (input.includeArchived)
180
+ params.append('includeArchived', 'true');
181
+ if (input.limit)
182
+ params.append('limit', input.limit.toString());
183
+ if (input.offset)
184
+ params.append('offset', input.offset.toString());
185
+ const queryString = params.toString() ? `?${params.toString()}` : '';
186
+ const data = await client.get(`/api/v2/search${queryString}`);
187
+ return jsonResult(data);
188
+ }
189
+ export function registerTasksTool(api, client) {
190
+ api.registerTool({
191
+ id: 'myn_tasks',
192
+ name: 'MYN Tasks',
193
+ description: 'Manage tasks, habits, and chores. Actions: list, get, create, update, complete, archive, search.',
194
+ inputSchema: TasksInputSchema,
195
+ async execute(input) {
196
+ return executeTasks(client, input);
197
+ }
198
+ });
199
+ }
200
+ //# sourceMappingURL=tasks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tasks.js","sourceRoot":"","sources":["../../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * myn_timers tool - Countdown, alarm, and pomodoro timers
3
+ */
4
+ import type { MynApiClient } from '../client.js';
5
+ export declare const TimersInputSchema: import("@sinclair/typebox").TObject<{
6
+ action: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"create_countdown">, import("@sinclair/typebox").TLiteral<"create_alarm">, import("@sinclair/typebox").TLiteral<"list">, import("@sinclair/typebox").TLiteral<"cancel">, import("@sinclair/typebox").TLiteral<"snooze">, import("@sinclair/typebox").TLiteral<"pomodoro">]>;
7
+ duration: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
8
+ durationMinutes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
9
+ label: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
10
+ alarmTime: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
11
+ recurrence: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
12
+ sound: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
13
+ timerId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
14
+ snoozeMinutes: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
15
+ workDuration: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
16
+ breakDuration: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
17
+ longBreakDuration: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
18
+ sessions: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
19
+ autoStart: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TBoolean>;
20
+ }>;
21
+ export type TimersInput = typeof TimersInputSchema.static;
22
+ export declare function executeTimers(client: MynApiClient, input: TimersInput): Promise<{
23
+ success: true;
24
+ data: unknown;
25
+ } | {
26
+ success: false;
27
+ error: string;
28
+ details?: unknown;
29
+ }>;
30
+ export declare function registerTimersTool(api: OpenClawPluginApi, client: MynApiClient): void;
31
+ interface OpenClawPluginApi {
32
+ registerTool(tool: {
33
+ id: string;
34
+ name: string;
35
+ description: string;
36
+ inputSchema: unknown;
37
+ execute: (input: unknown) => Promise<unknown>;
38
+ }): void;
39
+ logger: {
40
+ debug(message: string): void;
41
+ info(message: string): void;
42
+ warn(message: string): void;
43
+ error(message: string): void;
44
+ };
45
+ pluginConfig?: Record<string, unknown>;
46
+ }
47
+ export {};
48
+ //# sourceMappingURL=timers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timers.d.ts","sourceRoot":"","sources":["../../../src/tools/timers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAGjD,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;EA2B5B,CAAC;AAEH,MAAM,MAAM,WAAW,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC;AAE1D,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,KAAK,EAAE,WAAW,GACjB,OAAO,CAAC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC,CAwBlG;AA8ID,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,CAUrF;AAGD,UAAU,iBAAiB;IACzB,YAAY,CAAC,IAAI,EAAE;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,OAAO,CAAC;QACrB,OAAO,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;KAC/C,GAAG,IAAI,CAAC;IACT,MAAM,EAAE;QACN,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC;IACF,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACxC"}
@@ -0,0 +1,138 @@
1
+ /**
2
+ * myn_timers tool - Countdown, alarm, and pomodoro timers
3
+ */
4
+ import { Type } from '@sinclair/typebox';
5
+ import { jsonResult, errorResult } from '../client.js';
6
+ export const TimersInputSchema = Type.Object({
7
+ action: Type.Union([
8
+ Type.Literal('create_countdown'),
9
+ Type.Literal('create_alarm'),
10
+ Type.Literal('list'),
11
+ Type.Literal('cancel'),
12
+ Type.Literal('snooze'),
13
+ Type.Literal('pomodoro')
14
+ ]),
15
+ // create_countdown parameters
16
+ duration: Type.Optional(Type.Number({ description: 'Duration in seconds' })),
17
+ durationMinutes: Type.Optional(Type.Number({ description: 'Duration in minutes' })),
18
+ label: Type.Optional(Type.String({ description: 'Timer label/description' })),
19
+ // create_alarm parameters
20
+ alarmTime: Type.Optional(Type.String({ format: 'date-time', description: 'ISO 8601 datetime for alarm' })),
21
+ recurrence: Type.Optional(Type.String({ description: 'Recurrence pattern (e.g., "daily", "weekdays")' })),
22
+ sound: Type.Optional(Type.String()),
23
+ // cancel/snooze parameters
24
+ timerId: Type.Optional(Type.String({ format: 'uuid' })),
25
+ // snooze parameters
26
+ snoozeMinutes: Type.Optional(Type.Number({ default: 5 })),
27
+ // pomodoro parameters
28
+ workDuration: Type.Optional(Type.Number({ default: 25, description: 'Work duration in minutes' })),
29
+ breakDuration: Type.Optional(Type.Number({ default: 5, description: 'Break duration in minutes' })),
30
+ longBreakDuration: Type.Optional(Type.Number({ default: 15, description: 'Long break duration in minutes' })),
31
+ sessions: Type.Optional(Type.Number({ default: 4, description: 'Number of pomodoro sessions' })),
32
+ autoStart: Type.Optional(Type.Boolean({ default: false }))
33
+ });
34
+ export async function executeTimers(client, input) {
35
+ try {
36
+ switch (input.action) {
37
+ case 'create_countdown':
38
+ return await createCountdown(client, input);
39
+ case 'create_alarm':
40
+ return await createAlarm(client, input);
41
+ case 'list':
42
+ return await listTimers(client);
43
+ case 'cancel':
44
+ return await cancelTimer(client, input);
45
+ case 'snooze':
46
+ return await snoozeTimer(client, input);
47
+ case 'pomodoro':
48
+ return await createPomodoro(client, input);
49
+ default:
50
+ return errorResult(`Unknown action: ${input.action}`);
51
+ }
52
+ }
53
+ catch (error) {
54
+ if (error instanceof Error) {
55
+ return errorResult(error.message);
56
+ }
57
+ return errorResult('Unknown error occurred');
58
+ }
59
+ }
60
+ async function createCountdown(client, input) {
61
+ let durationSeconds = input.duration;
62
+ if (!durationSeconds && input.durationMinutes) {
63
+ durationSeconds = input.durationMinutes * 60;
64
+ }
65
+ if (!durationSeconds) {
66
+ return errorResult('duration (seconds) or durationMinutes is required for create_countdown action');
67
+ }
68
+ const body = {
69
+ type: 'COUNTDOWN',
70
+ duration: durationSeconds
71
+ };
72
+ if (input.label)
73
+ body.label = input.label;
74
+ const data = await client.post('/api/v2/timers/countdown', body);
75
+ return jsonResult(data);
76
+ }
77
+ async function createAlarm(client, input) {
78
+ if (!input.alarmTime) {
79
+ return errorResult('alarmTime is required for create_alarm action');
80
+ }
81
+ const body = {
82
+ name: input.label ?? 'Alarm',
83
+ alarmTime: input.alarmTime
84
+ };
85
+ if (input.recurrence)
86
+ body.recurrence = input.recurrence;
87
+ if (input.sound)
88
+ body.completionSound = input.sound;
89
+ const data = await client.post('/api/v2/timers/alarm', body);
90
+ return jsonResult(data);
91
+ }
92
+ async function listTimers(client) {
93
+ const data = await client.get('/api/v2/timers');
94
+ return jsonResult(data);
95
+ }
96
+ async function cancelTimer(client, input) {
97
+ if (!input.timerId) {
98
+ return errorResult('timerId is required for cancel action');
99
+ }
100
+ const data = await client.post(`/api/v2/timers/${input.timerId}/cancel`);
101
+ return jsonResult(data);
102
+ }
103
+ async function snoozeTimer(client, input) {
104
+ if (!input.timerId) {
105
+ return errorResult('timerId is required for snooze action');
106
+ }
107
+ const body = {
108
+ snoozeMinutes: input.snoozeMinutes ?? 5
109
+ };
110
+ const data = await client.post(`/api/v2/timers/${input.timerId}/snooze`, body);
111
+ return jsonResult(data);
112
+ }
113
+ async function createPomodoro(client, input) {
114
+ const body = {
115
+ type: 'POMODORO',
116
+ workDuration: (input.workDuration ?? 25) * 60, // Convert to seconds
117
+ breakDuration: (input.breakDuration ?? 5) * 60,
118
+ longBreakDuration: (input.longBreakDuration ?? 15) * 60,
119
+ sessions: input.sessions ?? 4,
120
+ autoStart: input.autoStart ?? false
121
+ };
122
+ if (input.label)
123
+ body.label = input.label;
124
+ const data = await client.post('/api/v2/timers/countdown', body);
125
+ return jsonResult(data);
126
+ }
127
+ export function registerTimersTool(api, client) {
128
+ api.registerTool({
129
+ id: 'myn_timers',
130
+ name: 'MYN Timers',
131
+ description: 'Manage countdowns, alarms, and pomodoro timers. Actions: create_countdown, create_alarm, list, cancel, snooze, pomodoro.',
132
+ inputSchema: TimersInputSchema,
133
+ async execute(input) {
134
+ return executeTimers(client, input);
135
+ }
136
+ });
137
+ }
138
+ //# sourceMappingURL=timers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"timers.js","sourceRoot":"","sources":["../../../src/tools/timers.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEzC,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEvD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC3C,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC;QACjB,IAAI,CAAC,OAAO,CAAC,kBAAkB,CAAC;QAChC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC;QAC5B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;QACpB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QACtB,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;KACzB,CAAC;IACF,8BAA8B;IAC9B,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC,CAAC;IAC5E,eAAe,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,qBAAqB,EAAE,CAAC,CAAC;IACnF,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC,CAAC;IAC7E,0BAA0B;IAC1B,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC,CAAC;IAC1G,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAAC,CAAC;IACzG,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IACnC,2BAA2B;IAC3B,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IACvD,oBAAoB;IACpB,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IACzD,sBAAsB;IACtB,YAAY,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,0BAA0B,EAAE,CAAC,CAAC;IAClG,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,2BAA2B,EAAE,CAAC,CAAC;IACnG,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,WAAW,EAAE,gCAAgC,EAAE,CAAC,CAAC;IAC7G,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAAC,CAAC;IAChG,SAAS,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;CAC3D,CAAC,CAAC;AAIH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,MAAoB,EACpB,KAAkB;IAElB,IAAI,CAAC;QACH,QAAQ,KAAK,CAAC,MAAM,EAAE,CAAC;YACrB,KAAK,kBAAkB;gBACrB,OAAO,MAAM,eAAe,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC9C,KAAK,cAAc;gBACjB,OAAO,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC1C,KAAK,MAAM;gBACT,OAAO,MAAM,UAAU,CAAC,MAAM,CAAC,CAAC;YAClC,KAAK,QAAQ;gBACX,OAAO,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC1C,KAAK,QAAQ;gBACX,OAAO,MAAM,WAAW,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC1C,KAAK,UAAU;gBACb,OAAO,MAAM,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC7C;gBACE,OAAO,WAAW,CAAC,mBAAoB,KAA4B,CAAC,MAAM,EAAE,CAAC,CAAC;QAClF,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;YAC3B,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACpC,CAAC;QACD,OAAO,WAAW,CAAC,wBAAwB,CAAC,CAAC;IAC/C,CAAC;AACH,CAAC;AAED,KAAK,UAAU,eAAe,CAAC,MAAoB,EAAE,KAAkB;IACrE,IAAI,eAAe,GAAG,KAAK,CAAC,QAAQ,CAAC;IAErC,IAAI,CAAC,eAAe,IAAI,KAAK,CAAC,eAAe,EAAE,CAAC;QAC9C,eAAe,GAAG,KAAK,CAAC,eAAe,GAAG,EAAE,CAAC;IAC/C,CAAC;IAED,IAAI,CAAC,eAAe,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC,+EAA+E,CAAC,CAAC;IACtG,CAAC;IAED,MAAM,IAAI,GAA4B;QACpC,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,eAAe;KAC1B,CAAC;IAEF,IAAI,KAAK,CAAC,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAE1C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAO3B,0BAA0B,EAAE,IAAI,CAAC,CAAC;IAErC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAoB,EAAE,KAAkB;IACjE,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;QACrB,OAAO,WAAW,CAAC,+CAA+C,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,IAAI,GAA4B;QACpC,IAAI,EAAE,KAAK,CAAC,KAAK,IAAI,OAAO;QAC5B,SAAS,EAAE,KAAK,CAAC,SAAS;KAC3B,CAAC;IAEF,IAAI,KAAK,CAAC,UAAU;QAAE,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IACzD,IAAI,KAAK,CAAC,KAAK;QAAE,IAAI,CAAC,eAAe,GAAG,KAAK,CAAC,KAAK,CAAC;IAEpD,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAO3B,sBAAsB,EAAE,IAAI,CAAC,CAAC;IAEjC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,MAAoB;IAC5C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,GAAG,CAmB1B,gBAAgB,CAAC,CAAC;IAErB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAoB,EAAE,KAAkB;IACjE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,WAAW,CAAC,uCAAuC,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAG3B,kBAAkB,KAAK,CAAC,OAAO,SAAS,CAAC,CAAC;IAE7C,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,MAAoB,EAAE,KAAkB;IACjE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,OAAO,WAAW,CAAC,uCAAuC,CAAC,CAAC;IAC9D,CAAC;IAED,MAAM,IAAI,GAA4B;QACpC,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,CAAC;KACxC,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAI3B,kBAAkB,KAAK,CAAC,OAAO,SAAS,EAAE,IAAI,CAAC,CAAC;IAEnD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,KAAK,UAAU,cAAc,CAAC,MAAoB,EAAE,KAAkB;IACpE,MAAM,IAAI,GAA4B;QACpC,IAAI,EAAE,UAAU;QAChB,YAAY,EAAE,CAAC,KAAK,CAAC,YAAY,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,qBAAqB;QACpE,aAAa,EAAE,CAAC,KAAK,CAAC,aAAa,IAAI,CAAC,CAAC,GAAG,EAAE;QAC9C,iBAAiB,EAAE,CAAC,KAAK,CAAC,iBAAiB,IAAI,EAAE,CAAC,GAAG,EAAE;QACvD,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,CAAC;QAC7B,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,KAAK;KACpC,CAAC;IAEF,IAAI,KAAK,CAAC,KAAK;QAAE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IAE1C,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,CAY3B,0BAA0B,EAAE,IAAI,CAAC,CAAC;IAErC,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,GAAsB,EAAE,MAAoB;IAC7E,GAAG,CAAC,YAAY,CAAC;QACf,EAAE,EAAE,YAAY;QAChB,IAAI,EAAE,YAAY;QAClB,WAAW,EAAE,0HAA0H;QACvI,WAAW,EAAE,iBAAiB;QAC9B,KAAK,CAAC,OAAO,CAAC,KAAc;YAC1B,OAAO,aAAa,CAAC,MAAM,EAAE,KAAoB,CAAC,CAAC;QACrD,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,30 @@
1
+ {
2
+ "id": "myn",
3
+ "name": "Mind Your Now",
4
+ "version": "0.1.0",
5
+ "description": "AI-powered task and life management for OpenClaw agents",
6
+ "author": "Mind Your Now <team@mindyournow.com>",
7
+ "license": "MIT",
8
+ "entry": "dist/index.js",
9
+ "skills": ["skills/myn"],
10
+ "configSchema": {
11
+ "type": "object",
12
+ "properties": {
13
+ "apiKey": {
14
+ "type": "string",
15
+ "description": "MYN API key with AGENT_FULL scope",
16
+ "x-secret": true
17
+ },
18
+ "baseUrl": {
19
+ "type": "string",
20
+ "description": "MYN API base URL",
21
+ "default": "https://api.mindyournow.com"
22
+ }
23
+ },
24
+ "required": ["apiKey"]
25
+ },
26
+ "uiHints": {
27
+ "icon": "🎯",
28
+ "color": "#6366F1"
29
+ }
30
+ }
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "@mind-your-now/myn",
3
+ "version": "0.4.0",
4
+ "description": "OpenClaw plugin for Mind Your Now - AI-powered task and life management",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "openclaw": {
9
+ "extensions": [
10
+ "./dist/index.js"
11
+ ]
12
+ },
13
+ "exports": {
14
+ ".": {
15
+ "import": "./dist/index.js",
16
+ "types": "./dist/index.d.ts"
17
+ }
18
+ },
19
+ "scripts": {
20
+ "prebuild": "node scripts/sync-skills.js",
21
+ "build": "tsc",
22
+ "dev": "tsc --watch",
23
+ "test": "vitest run",
24
+ "test:watch": "vitest",
25
+ "typecheck": "tsc --noEmit",
26
+ "lint": "eslint . --ext .ts",
27
+ "prepublishOnly": "npm run build"
28
+ },
29
+ "keywords": [
30
+ "openclaw",
31
+ "plugin",
32
+ "mind-your-now",
33
+ "myn",
34
+ "task-management",
35
+ "ai",
36
+ "agent"
37
+ ],
38
+ "author": "Mind Your Now <team@mindyournow.com>",
39
+ "license": "MIT",
40
+ "repository": {
41
+ "type": "git",
42
+ "url": "https://github.com/mindyournow/openclaw-plugin.git"
43
+ },
44
+ "bugs": {
45
+ "url": "https://github.com/mindyournow/openclaw-plugin/issues"
46
+ },
47
+ "homepage": "https://github.com/mindyournow/openclaw-plugin#readme",
48
+ "devDependencies": {
49
+ "@types/node": "^22.0.0",
50
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
51
+ "@typescript-eslint/parser": "^8.0.0",
52
+ "eslint": "^9.0.0",
53
+ "openclaw": "^2026.2.22",
54
+ "typescript": "^5.7.0",
55
+ "vitest": "^3.0.0"
56
+ },
57
+ "dependencies": {
58
+ "@mind-your-now/skills": "^0.1.0",
59
+ "@sinclair/typebox": "^0.34.0"
60
+ },
61
+ "peerDependencies": {
62
+ "openclaw": ">=2026.2.22"
63
+ },
64
+ "engines": {
65
+ "node": ">=20.0.0"
66
+ },
67
+ "files": [
68
+ "dist",
69
+ "openclaw.plugin.json",
70
+ "skills",
71
+ "README.md",
72
+ "LICENSE"
73
+ ]
74
+ }
@@ -0,0 +1,54 @@
1
+ # Mind Your Now — OpenClaw Tool Reference
2
+
3
+ This skill maps MYN API operations to OpenClaw tool names. For full MYN philosophy, priority system, and API details, see the base skill from `@mind-your-now/skills`.
4
+
5
+ ## Tool Mapping
6
+
7
+ Use these OpenClaw tool names instead of raw REST calls:
8
+
9
+ | OpenClaw Tool | Actions | REST Equivalent | Reference |
10
+ |---------------|---------|-----------------|-----------|
11
+ | `myn_tasks` | list, get, create, update, complete, archive, search | `/api/v2/unified-tasks` | [references/tasks-api.md](references/tasks-api.md) |
12
+ | `myn_briefing` | status, generate, get, apply_correction, complete_session | `/api/v2/compass/*` | [references/briefing-api.md](references/briefing-api.md) |
13
+ | `myn_calendar` | list_events, create_event, delete_event, meetings | `/api/v2/calendar/*` | [references/calendar-api.md](references/calendar-api.md) |
14
+ | `myn_habits` | streaks, skip, chains, schedule, reminders | `/api/v1/habit-chains/*` | [references/habits-api.md](references/habits-api.md) |
15
+ | `myn_lists` | get, add, toggle, bulk_add, convert_to_tasks | `/api/v1/households/*/grocery-list` | [references/lists-api.md](references/lists-api.md) |
16
+ | `myn_timers` | create_countdown, create_alarm, list, cancel, snooze, pomodoro | `/api/v2/timers` | [references/timers-api.md](references/timers-api.md) |
17
+ | `myn_search` | search | `/api/v2/search` | [references/search-api.md](references/search-api.md) |
18
+ | `myn_memory` | remember, recall, forget, search | `/api/v1/customers/memories` | [references/memory-api.md](references/memory-api.md) |
19
+ | `myn_profile` | get_info, get_goals, update_goals, preferences | `/api/v1/customers/*` | [references/profile-api.md](references/profile-api.md) |
20
+ | `myn_household` | members, invite, chores, chore_schedule, chore_complete | `/api/v1/households/*` | [references/household-api.md](references/household-api.md) |
21
+ | `myn_projects` | list, get, create, move_task | `/api/project` | [references/projects-api.md](references/projects-api.md) |
22
+ | `myn_planning` | plan, schedule_all, reschedule | `/api/schedules/*` | [references/planning-api.md](references/planning-api.md) |
23
+
24
+ ## Quick Reference
25
+
26
+ ### MYN Priority System
27
+
28
+ | Priority | Max Items | Meaning |
29
+ |----------|-----------|---------|
30
+ | `CRITICAL` | 5 | Must complete today (Going Home Test) |
31
+ | `OPPORTUNITY_NOW` | 20 | Soon but not burning |
32
+ | `OVER_THE_HORIZON` | unlimited | 10+ days out, off radar |
33
+ | `PARKING_LOT` | unlimited | Someday, review periodically |
34
+
35
+ ### Task Creation (Required Fields)
36
+
37
+ Every `myn_tasks create` call needs: `id` (UUID), `title`, `taskType`, `priority`, `startDate`.
38
+
39
+ ### Morning Routine
40
+
41
+ 1. `myn_briefing` action=status
42
+ 2. `myn_briefing` action=generate
43
+ 3. Review and apply corrections
44
+ 4. `myn_briefing` action=complete_session
45
+
46
+ ### Overload Handling
47
+
48
+ 1. `myn_tasks` action=list, priority=CRITICAL — check count
49
+ 2. If >= 5, help user move items to OPPORTUNITY_NOW
50
+ 3. `myn_planning` action=reschedule for bulk rescheduling
51
+
52
+ ## Base Skills
53
+
54
+ Detailed API documentation lives in `references/` (synced from `@mind-your-now/skills` at build time). See those files for endpoint parameters, request/response shapes, and curl examples.