@hailer/mcp 1.0.28 → 1.1.2

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 (233) hide show
  1. package/.claude/.session-checked +1 -0
  2. package/.claude/agents/agent-ada-skill-builder.md +10 -2
  3. package/.claude/agents/agent-alejandro-function-fields.md +104 -37
  4. package/.claude/agents/agent-bjorn-config-audit.md +41 -21
  5. package/.claude/agents/agent-builder-agent-creator.md +13 -3
  6. package/.claude/agents/agent-code-simplifier.md +53 -0
  7. package/.claude/agents/agent-dmitri-activity-crud.md +126 -11
  8. package/.claude/agents/agent-giuseppe-app-builder.md +212 -22
  9. package/.claude/agents/agent-gunther-mcp-tools.md +7 -36
  10. package/.claude/agents/agent-helga-workflow-config.md +75 -10
  11. package/.claude/agents/agent-igor-activity-mover-automation.md +125 -0
  12. package/.claude/agents/agent-ingrid-doc-templates.md +164 -36
  13. package/.claude/agents/agent-ivan-monolith.md +154 -0
  14. package/.claude/agents/agent-kenji-data-reader.md +15 -8
  15. package/.claude/agents/agent-lars-code-inspector.md +56 -8
  16. package/.claude/agents/agent-marco-mockup-builder.md +110 -0
  17. package/.claude/agents/agent-marcus-api-documenter.md +323 -0
  18. package/.claude/agents/agent-marketplace-publisher.md +232 -72
  19. package/.claude/agents/agent-marketplace-reviewer.md +255 -79
  20. package/.claude/agents/agent-permissions-handler.md +208 -0
  21. package/.claude/agents/agent-simple-writer.md +48 -0
  22. package/.claude/agents/agent-svetlana-code-review.md +127 -14
  23. package/.claude/agents/agent-tanya-test-runner.md +333 -0
  24. package/.claude/agents/agent-ui-designer.md +100 -0
  25. package/.claude/agents/agent-viktor-sql-insights.md +19 -6
  26. package/.claude/agents/agent-web-search.md +55 -0
  27. package/.claude/agents/agent-yevgeni-discussions.md +7 -1
  28. package/.claude/agents/agent-zara-zapier.md +159 -0
  29. package/.claude/commands/app-squad.md +135 -0
  30. package/.claude/commands/audit-squad.md +158 -0
  31. package/.claude/commands/autoplan.md +563 -0
  32. package/.claude/commands/cleanup-squad.md +98 -0
  33. package/.claude/commands/config-squad.md +106 -0
  34. package/.claude/commands/crud-squad.md +87 -0
  35. package/.claude/commands/data-squad.md +97 -0
  36. package/.claude/commands/debug-squad.md +303 -0
  37. package/.claude/commands/doc-squad.md +65 -0
  38. package/.claude/commands/handoff.md +137 -0
  39. package/.claude/commands/health.md +49 -0
  40. package/.claude/commands/help.md +2 -1
  41. package/.claude/commands/help:agents.md +96 -16
  42. package/.claude/commands/help:commands.md +55 -11
  43. package/.claude/commands/help:faq.md +16 -1
  44. package/.claude/commands/help:skills.md +93 -0
  45. package/.claude/commands/hotfix-squad.md +112 -0
  46. package/.claude/commands/integration-squad.md +82 -0
  47. package/.claude/commands/janitor-squad.md +167 -0
  48. package/.claude/commands/learn-auto.md +120 -0
  49. package/.claude/commands/learn.md +120 -0
  50. package/.claude/commands/mcp-list.md +27 -0
  51. package/.claude/commands/onboard-squad.md +140 -0
  52. package/.claude/commands/plan-workspace.md +732 -0
  53. package/.claude/commands/prd.md +131 -0
  54. package/.claude/commands/project-status.md +82 -0
  55. package/.claude/commands/publish.md +138 -0
  56. package/.claude/commands/recap.md +69 -0
  57. package/.claude/commands/restore.md +64 -0
  58. package/.claude/commands/review-squad.md +152 -0
  59. package/.claude/commands/save.md +24 -0
  60. package/.claude/commands/stats.md +19 -0
  61. package/.claude/commands/swarm.md +210 -0
  62. package/.claude/commands/tool-builder.md +3 -1
  63. package/.claude/commands/ws-pull.md +1 -1
  64. package/.claude/commands/yolo-off.md +17 -0
  65. package/.claude/commands/yolo.md +82 -0
  66. package/.claude/hooks/_shared-memory.cjs +305 -0
  67. package/.claude/hooks/_utils.cjs +134 -0
  68. package/.claude/hooks/agent-failure-detector.cjs +164 -79
  69. package/.claude/hooks/agent-usage-logger.cjs +204 -0
  70. package/.claude/hooks/app-edit-guard.cjs +20 -4
  71. package/.claude/hooks/auto-learn.cjs +316 -0
  72. package/.claude/hooks/bash-guard.cjs +282 -0
  73. package/.claude/hooks/builder-mode-manager.cjs +183 -54
  74. package/.claude/hooks/bulk-activity-guard.cjs +283 -0
  75. package/.claude/hooks/context-watchdog.cjs +292 -0
  76. package/.claude/hooks/delegation-reminder.cjs +478 -0
  77. package/.claude/hooks/design-system-lint.cjs +283 -0
  78. package/.claude/hooks/post-scaffold-hook.cjs +16 -3
  79. package/.claude/hooks/prompt-guard.cjs +366 -0
  80. package/.claude/hooks/publish-template-guard.cjs +16 -0
  81. package/.claude/hooks/session-start.cjs +35 -0
  82. package/.claude/hooks/shared-memory-writer.cjs +147 -0
  83. package/.claude/hooks/skill-injector.cjs +140 -0
  84. package/.claude/hooks/skill-usage-logger.cjs +258 -0
  85. package/.claude/hooks/src-edit-guard.cjs +16 -1
  86. package/.claude/hooks/sync-marketplace-agents.cjs +53 -8
  87. package/.claude/scripts/yolo-toggle.cjs +142 -0
  88. package/.claude/settings.json +141 -14
  89. package/.claude/skills/SDK-activity-patterns/SKILL.md +428 -0
  90. package/.claude/skills/SDK-document-templates/SKILL.md +1033 -0
  91. package/.claude/skills/SDK-function-fields/SKILL.md +542 -0
  92. package/.claude/skills/SDK-generate-skill/SKILL.md +92 -0
  93. package/.claude/skills/SDK-init-skill/SKILL.md +127 -0
  94. package/.claude/skills/SDK-insight-queries/SKILL.md +787 -0
  95. package/.claude/skills/SDK-ws-config-skill/SKILL.md +1139 -0
  96. package/.claude/skills/agent-structure/SKILL.md +98 -0
  97. package/.claude/skills/api-documentation-patterns/SKILL.md +474 -0
  98. package/.claude/skills/chrome-mcp-reference/SKILL.md +370 -0
  99. package/.claude/skills/delegation-routing/SKILL.md +202 -0
  100. package/.claude/skills/frontend-design/SKILL.md +254 -0
  101. package/.claude/skills/hailer-activity-mover/SKILL.md +213 -0
  102. package/.claude/skills/hailer-api-client/SKILL.md +518 -0
  103. package/.claude/skills/hailer-app-builder/SKILL.md +939 -11
  104. package/.claude/skills/hailer-apps-pictures/SKILL.md +269 -0
  105. package/.claude/skills/hailer-design-system/SKILL.md +235 -0
  106. package/.claude/skills/hailer-monolith-automations/SKILL.md +686 -0
  107. package/.claude/skills/hailer-permissions-system/SKILL.md +121 -0
  108. package/.claude/skills/hailer-project-protocol/SKILL.md +488 -0
  109. package/.claude/skills/hailer-rest-api/SKILL.md +61 -0
  110. package/.claude/skills/hailer-rest-api/hailer-activities.md +184 -0
  111. package/.claude/skills/hailer-rest-api/hailer-admin.md +473 -0
  112. package/.claude/skills/hailer-rest-api/hailer-calendar.md +256 -0
  113. package/.claude/skills/hailer-rest-api/hailer-feed.md +249 -0
  114. package/.claude/skills/hailer-rest-api/hailer-insights.md +195 -0
  115. package/.claude/skills/hailer-rest-api/hailer-messaging.md +276 -0
  116. package/.claude/skills/hailer-rest-api/hailer-workflows.md +283 -0
  117. package/.claude/skills/insight-join-patterns/SKILL.md +3 -0
  118. package/.claude/skills/integration-patterns/SKILL.md +421 -0
  119. package/.claude/skills/json-only-output/SKILL.md +52 -12
  120. package/.claude/skills/lsp-setup/SKILL.md +160 -0
  121. package/.claude/skills/mcp-direct-tools/SKILL.md +153 -0
  122. package/.claude/skills/optional-parameters/SKILL.md +32 -23
  123. package/.claude/skills/publish-hailer-app/SKILL.md +76 -12
  124. package/.claude/skills/testing-patterns/SKILL.md +630 -0
  125. package/.claude/skills/tool-builder/SKILL.md +250 -0
  126. package/.claude/skills/tool-parameter-usage/SKILL.md +59 -45
  127. package/.claude/skills/tool-response-verification/SKILL.md +82 -48
  128. package/.claude/skills/zapier-hailer-patterns/SKILL.md +581 -0
  129. package/.env.example +26 -7
  130. package/CLAUDE.md +290 -224
  131. package/dist/CLAUDE.md +370 -0
  132. package/dist/app.d.ts +1 -1
  133. package/dist/app.js +101 -101
  134. package/dist/bot/bot-config.d.ts +26 -0
  135. package/dist/bot/bot-config.js +135 -0
  136. package/dist/bot/bot-manager.d.ts +40 -0
  137. package/dist/bot/bot-manager.js +137 -0
  138. package/dist/bot/bot.d.ts +127 -0
  139. package/dist/bot/bot.js +1328 -0
  140. package/dist/bot/operation-logger.d.ts +28 -0
  141. package/dist/bot/operation-logger.js +132 -0
  142. package/dist/bot/services/conversation-manager.d.ts +60 -0
  143. package/dist/bot/services/conversation-manager.js +246 -0
  144. package/dist/bot/services/index.d.ts +9 -0
  145. package/dist/bot/services/index.js +18 -0
  146. package/dist/bot/services/message-classifier.d.ts +42 -0
  147. package/dist/bot/services/message-classifier.js +228 -0
  148. package/dist/bot/services/message-formatter.d.ts +88 -0
  149. package/dist/bot/services/message-formatter.js +411 -0
  150. package/dist/bot/services/session-logger.d.ts +162 -0
  151. package/dist/bot/services/session-logger.js +724 -0
  152. package/dist/bot/services/token-billing.d.ts +78 -0
  153. package/dist/bot/services/token-billing.js +233 -0
  154. package/dist/bot/services/types.d.ts +169 -0
  155. package/dist/bot/services/types.js +12 -0
  156. package/dist/bot/services/typing-indicator.d.ts +23 -0
  157. package/dist/bot/services/typing-indicator.js +60 -0
  158. package/dist/bot/services/workspace-schema-cache.d.ts +122 -0
  159. package/dist/bot/services/workspace-schema-cache.js +506 -0
  160. package/dist/bot/tool-executor.d.ts +28 -0
  161. package/dist/bot/tool-executor.js +48 -0
  162. package/dist/bot/workspace-overview.d.ts +12 -0
  163. package/dist/bot/workspace-overview.js +94 -0
  164. package/dist/cli.d.ts +1 -8
  165. package/dist/cli.js +1 -249
  166. package/dist/config.d.ts +96 -3
  167. package/dist/config.js +148 -37
  168. package/dist/core.d.ts +5 -0
  169. package/dist/core.js +61 -8
  170. package/dist/lib/discussion-lock.d.ts +42 -0
  171. package/dist/lib/discussion-lock.js +110 -0
  172. package/dist/lib/logger.d.ts +0 -1
  173. package/dist/lib/logger.js +39 -23
  174. package/dist/lib/request-logger.d.ts +77 -0
  175. package/dist/lib/request-logger.js +147 -0
  176. package/dist/mcp/UserContextCache.js +16 -13
  177. package/dist/mcp/hailer-clients.js +18 -17
  178. package/dist/mcp/signal-handler.js +29 -13
  179. package/dist/mcp/tool-registry.d.ts +4 -15
  180. package/dist/mcp/tool-registry.js +94 -32
  181. package/dist/mcp/tools/activity.js +28 -69
  182. package/dist/mcp/tools/app-core.js +9 -4
  183. package/dist/mcp/tools/app-marketplace.js +22 -12
  184. package/dist/mcp/tools/app-member.js +5 -2
  185. package/dist/mcp/tools/app-scaffold.js +32 -18
  186. package/dist/mcp/tools/bot-config/constants.d.ts +23 -0
  187. package/dist/mcp/tools/bot-config/constants.js +94 -0
  188. package/dist/mcp/tools/bot-config/core.d.ts +253 -0
  189. package/dist/mcp/tools/bot-config/core.js +2456 -0
  190. package/dist/mcp/tools/bot-config/index.d.ts +10 -0
  191. package/dist/mcp/tools/bot-config/index.js +59 -0
  192. package/dist/mcp/tools/bot-config/tools.d.ts +7 -0
  193. package/dist/mcp/tools/bot-config/tools.js +15 -0
  194. package/dist/mcp/tools/bot-config/types.d.ts +50 -0
  195. package/dist/mcp/tools/bot-config/types.js +6 -0
  196. package/dist/mcp/tools/discussion.js +107 -77
  197. package/dist/mcp/tools/document.d.ts +11 -0
  198. package/dist/mcp/tools/document.js +741 -0
  199. package/dist/mcp/tools/file.js +5 -2
  200. package/dist/mcp/tools/insight.js +36 -12
  201. package/dist/mcp/tools/investigate.d.ts +9 -0
  202. package/dist/mcp/tools/investigate.js +254 -0
  203. package/dist/mcp/tools/user.d.ts +2 -4
  204. package/dist/mcp/tools/user.js +9 -50
  205. package/dist/mcp/tools/workflow.d.ts +1 -0
  206. package/dist/mcp/tools/workflow.js +164 -52
  207. package/dist/mcp/utils/hailer-api-client.js +26 -17
  208. package/dist/mcp/webhook-handler.d.ts +64 -3
  209. package/dist/mcp/webhook-handler.js +219 -9
  210. package/dist/mcp-server.d.ts +4 -0
  211. package/dist/mcp-server.js +237 -25
  212. package/dist/plugins/bug-fixer/index.d.ts +2 -0
  213. package/dist/plugins/bug-fixer/index.js +18 -0
  214. package/dist/plugins/bug-fixer/tools.d.ts +45 -0
  215. package/dist/plugins/bug-fixer/tools.js +1096 -0
  216. package/package.json +10 -10
  217. package/scripts/test-hal-tools.ts +154 -0
  218. package/.claude/agents/agent-nora-name-functions.md +0 -123
  219. package/.claude/assistant-knowledge.md +0 -23
  220. package/.claude/commands/install-plugin.md +0 -261
  221. package/.claude/commands/list-plugins.md +0 -42
  222. package/.claude/commands/marketplace-setup.md +0 -33
  223. package/.claude/commands/publish-plugin.md +0 -55
  224. package/.claude/commands/uninstall-plugin.md +0 -87
  225. package/.claude/hooks/interactive-mode.cjs +0 -87
  226. package/.claude/hooks/mcp-server-guard.cjs +0 -108
  227. package/.claude/skills/marketplace-publishing.md +0 -155
  228. package/dist/bot/chat-bot.d.ts +0 -31
  229. package/dist/bot/chat-bot.js +0 -357
  230. package/dist/mcp/tools/metrics.d.ts +0 -13
  231. package/dist/mcp/tools/metrics.js +0 -546
  232. package/dist/stdio-server.d.ts +0 -14
  233. package/dist/stdio-server.js +0 -114
@@ -0,0 +1,428 @@
1
+ ---
2
+ name: SDK-activity-patterns
3
+ description: Activity CRUD patterns - field value formats, dates, users, links, dropdowns
4
+ version: 1.4.0
5
+ triggers: Create activity, update activity, field values, date format, activitylink value
6
+ ---
7
+
8
+ # Activity CRUD Patterns
9
+
10
+ ## MCP Tools
11
+
12
+ | Tool | Purpose |
13
+ |------|---------|
14
+ | `mcp__hailer__create_activity` | Create new activity |
15
+ | `mcp__hailer__update_activity` | Update existing activity |
16
+
17
+ ---
18
+
19
+ ## Create Activity
20
+
21
+ ```javascript
22
+ mcp__hailer__create_activity({
23
+ workflowId: "682ac815fba468d857d498f7",
24
+ phaseId: "682ac815fba468d857d49904",
25
+ name: "New Task", // Optional - activity name
26
+ fields: {
27
+ "fieldId1": "value1",
28
+ "fieldId2": "value2"
29
+ }
30
+ })
31
+ ```
32
+
33
+ ## Update Activity
34
+
35
+ ```javascript
36
+ mcp__hailer__update_activity({
37
+ activityId: "692abc123def456",
38
+ fields: {
39
+ "fieldId1": "new value"
40
+ },
41
+ // Optional: move to different phase
42
+ phaseId: "682ac815fba468d857d49906"
43
+ })
44
+ ```
45
+
46
+ ---
47
+
48
+ ## Field Value Formats
49
+
50
+ All valid field types from `hailer.d.ts`. **No multi-select types exist.**
51
+
52
+ ### Text Fields
53
+
54
+ | Type | Format | Example |
55
+ |------|--------|---------|
56
+ | `text` | String | `"Hello world"` |
57
+ | `textarea` | String | `"Multi\nline\ntext"` |
58
+ | `textunit` | String | `"100"` (unit in display) |
59
+
60
+ ### Number Fields
61
+
62
+ | Type | Format | Example |
63
+ |------|--------|---------|
64
+ | `numeric` | Number | `42` or `42.5` |
65
+ | `numericunit` | Number | `99.99` (unit defined in field config) |
66
+
67
+ ### Date/Time Fields
68
+
69
+ | Type | Format | Example |
70
+ |------|--------|---------|
71
+ | `date` | Unix timestamp (ms) | `1730937600000` |
72
+ | `datetime` | Unix timestamp (ms) | `1730937600000` |
73
+ | `daterange` | Object | `{ start: 1730937600000, end: 1731024000000 }` |
74
+ | `datetimerange` | Object | `{ start: 1730937600000, end: 1731024000000 }` |
75
+ | `time` | Unix timestamp (ms, includes date!) | `1765863000000` |
76
+ | `timerange` | Object | `{ start: 1765863000000, end: 1765915200000 }` (ms timestamps, includes date!) |
77
+
78
+ **Date Conversion:**
79
+ ```javascript
80
+ // JavaScript Date to Hailer timestamp
81
+ const timestamp = new Date('2024-11-07').getTime(); // 1730937600000
82
+
83
+ // Hailer timestamp to Date
84
+ const date = new Date(1730937600000);
85
+
86
+ // Time field: also Unix timestamp (includes date)
87
+ const today = new Date();
88
+ today.setUTCHours(9, 30, 0, 0);
89
+ const timeValue = today.getTime(); // e.g., 1765863000000
90
+ ```
91
+
92
+ ### Selection Fields
93
+
94
+ | Type | Format | Example |
95
+ |------|--------|---------|
96
+ | `textpredefinedoptions` | **STRING** | `"High"` |
97
+
98
+ **CRITICAL:** Value is STRING, not array! No multi-select type exists.
99
+ ```javascript
100
+ // ✅ Correct
101
+ fields: { priority: "High" }
102
+
103
+ // ❌ Wrong
104
+ fields: { priority: ["High"] }
105
+ ```
106
+
107
+ ### User & Team Fields
108
+
109
+ | Type | Format | Example |
110
+ |------|--------|---------|
111
+ | `users` | **STRING** (user ID) | `"5f8a1b2c3d4e5f6a7b8c9d0e"` |
112
+ | `teams` | **STRING** (team ID) | `"teamId123"` |
113
+
114
+ **CRITICAL:** Value is STRING, not array! No multi-select types exist.
115
+ ```javascript
116
+ // ✅ Correct
117
+ fields: { assignee: "5f8a1b2c3d4e5f6a7b8c9d0e" }
118
+
119
+ // ❌ Wrong
120
+ fields: { assignee: ["5f8a1b2c3d4e5f6a7b8c9d0e"] }
121
+ ```
122
+
123
+ ### Link Fields
124
+
125
+ | Type | Format | Example |
126
+ |------|--------|---------|
127
+ | `activitylink` | **STRING** (activity ID) | `"692abc123def456"` |
128
+
129
+ **CRITICAL:** Activity link is plain STRING ID, not array or object!
130
+ ```javascript
131
+ // ✅ Correct - plain string ID
132
+ fields: { customer: "692abc123def456" }
133
+
134
+ // ❌ Wrong - array
135
+ fields: { customer: ["692abc123def456"] }
136
+
137
+ // ❌ Wrong - object (this is READ format, not WRITE format!)
138
+ fields: { customer: { _id: "692abc123def456", name: "Acme" } }
139
+ ```
140
+
141
+ **READ vs WRITE formats differ:**
142
+ - **READ** (from API): `{ _id: string, name: string }` object
143
+ - **WRITE** (to API): plain string ID only
144
+
145
+ ### Modified Fields (Checkbox & File)
146
+
147
+ These use base types with a `modifier` in the field config:
148
+
149
+ | Config | Value Format | Example |
150
+ |--------|--------------|---------|
151
+ | `numeric` + `modifier.checkbox: true` | Number | `1` (true) or `0` (false) |
152
+ | `text` + `modifier.file: true` | Object | File reference (UI handles) |
153
+
154
+ ### Other Fields
155
+
156
+ | Type | Format | Example |
157
+ |------|--------|---------|
158
+ | `country` | ISO code | `"FI"`, `"SE"`, `"US"` |
159
+
160
+ ---
161
+
162
+ ## Complete Create Example
163
+
164
+ ```javascript
165
+ mcp__hailer__create_activity({
166
+ workflowId: "682ac815fba468d857d498f7",
167
+ phaseId: "682ac815fba468d857d49904",
168
+ name: "Fix login bug",
169
+ fields: {
170
+ // Text
171
+ "description_abc": "Users cannot log in after password reset",
172
+
173
+ // Dropdown select (STRING!)
174
+ "priority_def": "High",
175
+
176
+ // User (STRING!)
177
+ "assignee_jkl": "5f8a1b2c3d4e5f6a7b8c9d0e",
178
+
179
+ // Activity link (STRING!)
180
+ "project_mno": "692abc123def456",
181
+
182
+ // Date (timestamp ms)
183
+ "due_date_pqr": 1730937600000,
184
+
185
+ // Number
186
+ "estimated_hours_stu": 4
187
+ }
188
+ })
189
+ ```
190
+
191
+ ---
192
+
193
+ ## Bulk Creation
194
+
195
+ Use the `activities[]` array for bulk creation. **Each activity must include its own teamId and phaseId.**
196
+
197
+ ```javascript
198
+ mcp__hailer__create_activity({
199
+ workflowId: "682ac815fba468d857d498f7",
200
+ activities: [
201
+ {
202
+ name: "Task 1",
203
+ phaseId: "682ac815fba468d857d49904",
204
+ teamId: "690d2b2e2b3a4c5d6e7f8a9b", // REQUIRED per activity!
205
+ fields: { "priority_abc": "High" }
206
+ },
207
+ {
208
+ name: "Task 2",
209
+ phaseId: "682ac815fba468d857d49904",
210
+ teamId: "690d2b2e2b3a4c5d6e7f8a9b",
211
+ fields: { "priority_abc": "Medium" }
212
+ }
213
+ ]
214
+ })
215
+ ```
216
+
217
+ **API:** Calls `v3.activity.createMany` via socket.
218
+
219
+ ### Single vs Bulk: Parameter Placement
220
+
221
+ | Parameter | Single mode | Bulk mode |
222
+ |-----------|-------------|-----------|
223
+ | `name` | Top-level | Inside each `activities[]` item |
224
+ | `phaseId` | Top-level | Inside each `activities[]` item |
225
+ | `teamId` | Top-level | **Inside each `activities[]` item** |
226
+ | `fields` | Top-level | Inside each `activities[]` item |
227
+ | `workflowId` | Top-level | Top-level (shared) |
228
+
229
+ **CRITICAL:** In bulk mode, `teamId` at the top level is **IGNORED**. Each activity in the array must have its own `teamId`. Omitting it causes "Missing team(s)" (code 127) unless the workflow has a default team.
230
+
231
+ ### Team ID Fallback Chain
232
+
233
+ The MCP tool auto-fills `teamId` if omitted:
234
+ 1. Per-activity `teamId` (if provided) — **always provide this**
235
+ 2. Workflow's default team (`workflow.team`)
236
+ 3. First workspace team (last resort, may be wrong team)
237
+
238
+ **Best practice:** Always pass `teamId` explicitly. Don't rely on fallbacks.
239
+
240
+ ---
241
+
242
+ ## Phase Transitions
243
+
244
+ Move activity to different phase:
245
+
246
+ ```javascript
247
+ mcp__hailer__update_activity({
248
+ activityId: "692abc123def456",
249
+ phaseId: "682ac815fba468d857d49906" // Target phase
250
+ })
251
+ ```
252
+
253
+ Update fields AND move phase:
254
+
255
+ ```javascript
256
+ mcp__hailer__update_activity({
257
+ activityId: "692abc123def456",
258
+ phaseId: "682ac815fba468d857d49906",
259
+ fields: {
260
+ "completed_date_abc": Date.now()
261
+ }
262
+ })
263
+ ```
264
+
265
+ ---
266
+
267
+ ## Getting IDs
268
+
269
+ Before creating/updating, you need:
270
+ - **Workflow ID** - from `list_workflows` (real MongoDB ObjectId)
271
+ - **Phase ID** - from `list_workflow_phases` (real MongoDB ObjectId)
272
+ - **Field IDs** - from `get_workflow_schema` (real MongoDB ObjectId)
273
+ - **User IDs** - from `search_workspace_users`
274
+ - **Activity IDs** - from `list_activities` or previous create results
275
+
276
+ **CRITICAL: MCP Tools Need Real ObjectIds**
277
+
278
+ MCP tools require actual MongoDB ObjectIds (24-char hex strings), not enum key names.
279
+
280
+ ```javascript
281
+ // ❌ WRONG - Passing enum KEY NAMES as strings
282
+ mcp__hailer__create_activity({
283
+ workflowId: "Asiakkaat", // ❌ This is the enum key, not the ID
284
+ fields: { "projekti_f84": "value" } // ❌ This is the enum key, not the ID
285
+ })
286
+
287
+ // ✅ CORRECT - Use real MongoDB ObjectIds
288
+ mcp__hailer__create_activity({
289
+ workflowId: "682ac815fba468d857d498f7", // ✅ Real ObjectId
290
+ fields: { "68cbfec59b3869137fe2af84": "value" } // ✅ Real ObjectId
291
+ })
292
+ ```
293
+
294
+ **TypeScript code vs MCP calls:**
295
+ - **TypeScript:** Use enums for type safety → `WorkflowIds.Asiakkaat` (resolves to the ObjectId)
296
+ - **MCP tools:** Pass the actual ObjectId string → `"682ac815fba468d857d498f7"`
297
+
298
+ **Where to get real IDs:**
299
+ - `enums.ts` → enum values ARE the real ObjectIds
300
+ - `list_workflows` → workflow `_id` field
301
+ - `get_workflow_schema` → field `_id` property
302
+ - Kenji agent → extracts IDs from workspace files
303
+
304
+ **Agent pattern:** Orchestrator gets real IDs from Kenji (or enums.ts), passes to Dmitri.
305
+
306
+ ---
307
+
308
+ ## Date Helpers
309
+
310
+ ### Current Date
311
+ ```javascript
312
+ const now = Date.now(); // Current timestamp ms
313
+ ```
314
+
315
+ ### Specific Date
316
+ ```javascript
317
+ // From string
318
+ const date = new Date('2024-11-07T09:00:00').getTime();
319
+
320
+ // From components
321
+ const date = new Date(2024, 10, 7, 9, 0, 0).getTime(); // Month is 0-indexed!
322
+ ```
323
+
324
+ ### Add Days
325
+ ```javascript
326
+ const inOneWeek = Date.now() + (7 * 24 * 60 * 60 * 1000);
327
+ ```
328
+
329
+ ### Start of Day
330
+ ```javascript
331
+ const today = new Date();
332
+ today.setHours(0, 0, 0, 0);
333
+ const startOfDay = today.getTime();
334
+ ```
335
+
336
+ ---
337
+
338
+ ## Time Field Values
339
+
340
+ Time fields (`time` and `timerange`) store **Unix timestamps in milliseconds** that include the date.
341
+
342
+ ```javascript
343
+ // Time field stores a full timestamp
344
+ const timeField = 1765863000000; // e.g., 2025-12-16 09:30:00 UTC
345
+
346
+ // To extract just the time portion:
347
+ const date = new Date(timeField);
348
+ const hours = date.getUTCHours(); // 9
349
+ const minutes = date.getUTCMinutes(); // 30
350
+
351
+ // To create a time value for a specific time today:
352
+ const today = new Date();
353
+ today.setUTCHours(9, 30, 0, 0);
354
+ const timeValue = today.getTime();
355
+ ```
356
+
357
+ **Note:** When copying values between time/timerange fields, no conversion needed.
358
+
359
+ ---
360
+
361
+ ## Clearing Field Values
362
+
363
+ To clear a field, set to empty string or null:
364
+
365
+ ```javascript
366
+ mcp__hailer__update_activity({
367
+ activityId: "692abc123def456",
368
+ fields: {
369
+ "assignee_abc": "", // Clear user
370
+ "due_date_def": null, // Clear date
371
+ "notes_ghi": "" // Clear text
372
+ }
373
+ })
374
+ ```
375
+
376
+ ---
377
+
378
+ ## Common Mistakes
379
+
380
+ | Wrong | Right |
381
+ |-------|-------|
382
+ | `{ priority: ["High"] }` | `{ priority: "High" }` (string for single select) |
383
+ | `{ assignee: ["userId"] }` | `{ assignee: "userId" }` (string for single user) |
384
+ | `{ customer: ["actId"] }` | `{ customer: "actId" }` (string for activitylink) |
385
+ | `{ date: "2024-11-07" }` | `{ date: 1730937600000 }` (timestamp ms) |
386
+ | `{ time: "09:00" }` | `{ time: 1765863000000 }` (ms timestamp) |
387
+ | `{ datetimerange: 1730937600000 }` | `{ datetimerange: { start: 1730937600000, end: 1731024000000 } }` (OBJECT!) |
388
+ | `{ daterange: 1730937600000 }` | `{ daterange: { start: 1730937600000, end: 1731024000000 } }` (OBJECT!) |
389
+ | `{ textField: 300 }` | `{ textField: "300" }` (text fields must be STRINGS, even for numbers) |
390
+ | Guessing field IDs | Get from enums or `get_workflow_schema` |
391
+ | Bulk create with top-level teamId | Put teamId INSIDE each activity object |
392
+ | Creating without loading this skill | Always load SDK-activity-patterns before CRUD calls |
393
+
394
+ ---
395
+
396
+ ## Team Handling
397
+
398
+ ### Option 1: Pass teamId explicitly (recommended)
399
+ Always include `teamId` in your create calls. For bulk mode, include it in **each activity object**.
400
+
401
+ ### Option 2: Workflow default team
402
+ If the workflow has a default team set, the MCP tool auto-fills `teamId` when omitted.
403
+
404
+ **Set default team:** Hailer UI → Workflow Settings → Default Team → Select team.
405
+
406
+ ### Common Error: "Missing team(s)" (Code 127)
407
+
408
+ **Cause:** No teamId provided AND workflow has no default team AND no workspace teams found.
409
+
410
+ **Fix options:**
411
+ 1. Pass `teamId` explicitly in every create call (best)
412
+ 2. Set default team on the workflow in Hailer UI
413
+ 3. Ask orchestrator/Kenji for available team IDs before creating
414
+
415
+ ---
416
+
417
+ ## Checklist
418
+
419
+ Before creating/updating activities:
420
+
421
+ - [ ] Have workflow ID (from enum or API)
422
+ - [ ] Have phase ID (from enum or API)
423
+ - [ ] Have field IDs (from enum or API)
424
+ - [ ] Have **team ID** (from teams.ts or API) — don't rely on fallbacks
425
+ - [ ] All values are **STRINGS** for select/user/link fields (no multi-select types exist)
426
+ - [ ] Dates are **Unix timestamps in milliseconds**
427
+ - [ ] Times are **Unix timestamps in milliseconds** (like dates)
428
+ - [ ] **Bulk mode:** teamId, phaseId, fields are **inside each activity object**, not top-level