@rudderhq/server 0.2.0-canary.21 → 0.2.0-canary.23

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 (115) hide show
  1. package/dist/bootstrap/register-api-routes.d.ts.map +1 -1
  2. package/dist/bootstrap/register-api-routes.js +2 -0
  3. package/dist/bootstrap/register-api-routes.js.map +1 -1
  4. package/dist/index.d.ts +11 -0
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +55 -2
  7. package/dist/index.js.map +1 -1
  8. package/dist/langfuse-transcript.d.ts.map +1 -1
  9. package/dist/langfuse-transcript.js +6 -1
  10. package/dist/langfuse-transcript.js.map +1 -1
  11. package/dist/routes/chats.d.ts.map +1 -1
  12. package/dist/routes/chats.js +34 -2
  13. package/dist/routes/chats.js.map +1 -1
  14. package/dist/routes/onboarding.d.ts +3 -0
  15. package/dist/routes/onboarding.d.ts.map +1 -0
  16. package/dist/routes/onboarding.js +428 -0
  17. package/dist/routes/onboarding.js.map +1 -0
  18. package/dist/services/agents.d.ts +13 -13
  19. package/dist/services/automations.d.ts +2 -2
  20. package/dist/services/calendar.d.ts +4 -4
  21. package/dist/services/chats.d.ts +11 -11
  22. package/dist/services/chats.d.ts.map +1 -1
  23. package/dist/services/chats.js +46 -8
  24. package/dist/services/chats.js.map +1 -1
  25. package/dist/services/finance.d.ts +2 -2
  26. package/dist/services/goals.d.ts +12 -12
  27. package/dist/services/issues.d.ts +1 -1
  28. package/dist/services/issues.d.ts.map +1 -1
  29. package/dist/services/issues.js +74 -5
  30. package/dist/services/issues.js.map +1 -1
  31. package/dist/services/orgs.d.ts +1 -1
  32. package/dist/services/plugin-registry.d.ts +4 -4
  33. package/dist/services/projects.d.ts +1 -1
  34. package/dist/services/secrets.d.ts +5 -5
  35. package/package.json +13 -13
  36. package/resources/bundled-skills/rudder/references/cli-reference.md +1 -0
  37. package/skills/rudder/references/cli-reference.md +1 -0
  38. package/ui-dist/assets/{_basePickBy-C45AEYYu.js → _basePickBy-CSH7Mqkq.js} +1 -1
  39. package/ui-dist/assets/{_baseUniq-BJpCpwRa.js → _baseUniq-DkSjuJTz.js} +1 -1
  40. package/ui-dist/assets/{arc-D3Nqvz2N.js → arc-DjkUeaFz.js} +1 -1
  41. package/ui-dist/assets/{architectureDiagram-2XIMDMQ5-Do23wIQ4.js → architectureDiagram-2XIMDMQ5-C2pt9Yoe.js} +1 -1
  42. package/ui-dist/assets/{blockDiagram-WCTKOSBZ-C2ngwYU8.js → blockDiagram-WCTKOSBZ-BJKdCjb9.js} +1 -1
  43. package/ui-dist/assets/{c4Diagram-IC4MRINW-BYIobdwJ.js → c4Diagram-IC4MRINW-Dt8o4qFt.js} +1 -1
  44. package/ui-dist/assets/channel-C4orN8q_.js +1 -0
  45. package/ui-dist/assets/{chunk-4BX2VUAB-C44gRPzE.js → chunk-4BX2VUAB-CNUVmoh2.js} +1 -1
  46. package/ui-dist/assets/{chunk-55IACEB6-B-6fN77J.js → chunk-55IACEB6-5Ml8g2R4.js} +1 -1
  47. package/ui-dist/assets/{chunk-FMBD7UC4-DTY1cUtM.js → chunk-FMBD7UC4-xGhTDkU3.js} +1 -1
  48. package/ui-dist/assets/{chunk-JSJVCQXG-D_6UsK-t.js → chunk-JSJVCQXG-BAMHstlq.js} +1 -1
  49. package/ui-dist/assets/{chunk-KX2RTZJC-Yb0NUpEi.js → chunk-KX2RTZJC-CQyVA_5c.js} +1 -1
  50. package/ui-dist/assets/{chunk-NQ4KR5QH-DlCH22us.js → chunk-NQ4KR5QH-DgVvV7mj.js} +1 -1
  51. package/ui-dist/assets/{chunk-QZHKN3VN-Bh-_IRDv.js → chunk-QZHKN3VN-CfoNBCht.js} +1 -1
  52. package/ui-dist/assets/{chunk-WL4C6EOR-C785VNuy.js → chunk-WL4C6EOR-CVmbFG_p.js} +1 -1
  53. package/ui-dist/assets/classDiagram-VBA2DB6C-OAbYUgH-.js +1 -0
  54. package/ui-dist/assets/classDiagram-v2-RAHNMMFH-OAbYUgH-.js +1 -0
  55. package/ui-dist/assets/clone-CSPZf7DE.js +1 -0
  56. package/ui-dist/assets/{cose-bilkent-S5V4N54A-Bo3jHr7N.js → cose-bilkent-S5V4N54A-BVazk6eV.js} +1 -1
  57. package/ui-dist/assets/{dagre-KLK3FWXG-YYooZOSE.js → dagre-KLK3FWXG-DBczLleZ.js} +1 -1
  58. package/ui-dist/assets/{diagram-E7M64L7V-DTEesXx5.js → diagram-E7M64L7V-CSs0_-it.js} +1 -1
  59. package/ui-dist/assets/{diagram-IFDJBPK2-BXnhNPS7.js → diagram-IFDJBPK2-C44ixwXF.js} +1 -1
  60. package/ui-dist/assets/{diagram-P4PSJMXO-CWzB3Cgn.js → diagram-P4PSJMXO-CvlNxLpF.js} +1 -1
  61. package/ui-dist/assets/{erDiagram-INFDFZHY-C4XOm35N.js → erDiagram-INFDFZHY-DyU-yrPX.js} +1 -1
  62. package/ui-dist/assets/{flowDiagram-PKNHOUZH-CFCXtb2O.js → flowDiagram-PKNHOUZH-CyH9ktEL.js} +1 -1
  63. package/ui-dist/assets/{ganttDiagram-A5KZAMGK-8w-5QNh7.js → ganttDiagram-A5KZAMGK-BJpOQOyh.js} +1 -1
  64. package/ui-dist/assets/{gitGraphDiagram-K3NZZRJ6-qbWDXQfA.js → gitGraphDiagram-K3NZZRJ6-DBilaYho.js} +1 -1
  65. package/ui-dist/assets/{graph-qUSZM8PJ.js → graph-Bp7Krwe5.js} +1 -1
  66. package/ui-dist/assets/{index-p9EItORI.js → index--TBlJCvQ.js} +1 -1
  67. package/ui-dist/assets/{index-B267ejd6.js → index-7TP2VuRe.js} +326 -331
  68. package/ui-dist/assets/{index-DGEmNL-F.js → index-B77KTlNl.js} +1 -1
  69. package/ui-dist/assets/{index-Z090t1c3.js → index-BGN1Q26b.js} +1 -1
  70. package/ui-dist/assets/{index-L9e7v8cx.js → index-BZ6HIZa6.js} +1 -1
  71. package/ui-dist/assets/{index-DzeNxu5i.js → index-Bsrptm7d.js} +1 -1
  72. package/ui-dist/assets/{index-BcUKDwkj.js → index-BstFLMLu.js} +1 -1
  73. package/ui-dist/assets/{index-BebFet7E.js → index-Bvfak4Ff.js} +1 -1
  74. package/ui-dist/assets/{index-UyuvF9uZ.js → index-BwNHlNbX.js} +1 -1
  75. package/ui-dist/assets/{index-BnxD8kOC.js → index-By_8knE8.js} +1 -1
  76. package/ui-dist/assets/{index-Bu89fEqp.js → index-C78gsoyJ.js} +1 -1
  77. package/ui-dist/assets/{index-BZCnBfim.js → index-CG3Okl0e.js} +1 -1
  78. package/ui-dist/assets/{index-GjLZxTWd.js → index-CGbvDSBo.js} +1 -1
  79. package/ui-dist/assets/{index-C6xe1iRe.js → index-CMuf6rgp.js} +1 -1
  80. package/ui-dist/assets/{index-Bukq8O5h.js → index-CjSooKG8.js} +1 -1
  81. package/ui-dist/assets/{index-BQqyX69f.js → index-D-pMOTdc.js} +1 -1
  82. package/ui-dist/assets/{index-COE6bbkv.js → index-D4rwCXTl.js} +1 -1
  83. package/ui-dist/assets/{index-Cb8FAw75.js → index-DYDaCd1o.js} +1 -1
  84. package/ui-dist/assets/{index-D5hyFscs.js → index-Df0N9Keo.js} +1 -1
  85. package/ui-dist/assets/{index-D_pLgR1n.js → index-DiG3dIN9.js} +1 -1
  86. package/ui-dist/assets/{index-Bgr9D6Ra.js → index-bEG0oxPf.js} +1 -1
  87. package/ui-dist/assets/{index-CxlDyxOU.js → index-m6so_XlE.js} +1 -1
  88. package/ui-dist/assets/index-mFSqecpA.css +1 -0
  89. package/ui-dist/assets/{index-CnkyHiZz.js → index-zd2-3ThQ.js} +1 -1
  90. package/ui-dist/assets/{infoDiagram-LFFYTUFH-or6GdoQj.js → infoDiagram-LFFYTUFH-CAtOl1Zu.js} +1 -1
  91. package/ui-dist/assets/{ishikawaDiagram-PHBUUO56-CiJce1C4.js → ishikawaDiagram-PHBUUO56-BPy3HhUS.js} +1 -1
  92. package/ui-dist/assets/{journeyDiagram-4ABVD52K-BSgSZtvu.js → journeyDiagram-4ABVD52K-DNpRnXil.js} +1 -1
  93. package/ui-dist/assets/{kanban-definition-K7BYSVSG-Dz-9iEDp.js → kanban-definition-K7BYSVSG-BSigkaeu.js} +1 -1
  94. package/ui-dist/assets/{layout-BX7Dy_7p.js → layout-CaTwyGDD.js} +1 -1
  95. package/ui-dist/assets/{linear-S43utJWr.js → linear-Dav0AV6h.js} +1 -1
  96. package/ui-dist/assets/{mermaid.core-BbRXh3sM.js → mermaid.core-CU9cXi6_.js} +4 -4
  97. package/ui-dist/assets/{mindmap-definition-YRQLILUH-BuzgDaXx.js → mindmap-definition-YRQLILUH-Buqaj7gF.js} +1 -1
  98. package/ui-dist/assets/{pieDiagram-SKSYHLDU-CDfbASTn.js → pieDiagram-SKSYHLDU-Ct9HNICe.js} +1 -1
  99. package/ui-dist/assets/{quadrantDiagram-337W2JSQ-nz3dRx2X.js → quadrantDiagram-337W2JSQ-Byj1ltJq.js} +1 -1
  100. package/ui-dist/assets/{requirementDiagram-Z7DCOOCP-BYawIpQl.js → requirementDiagram-Z7DCOOCP-BBMcyIic.js} +1 -1
  101. package/ui-dist/assets/{sankeyDiagram-WA2Y5GQK-DeTjkIc7.js → sankeyDiagram-WA2Y5GQK-rIlA9k8N.js} +1 -1
  102. package/ui-dist/assets/{sequenceDiagram-2WXFIKYE-30zXKF2p.js → sequenceDiagram-2WXFIKYE-Dbffp0VR.js} +1 -1
  103. package/ui-dist/assets/{stateDiagram-RAJIS63D-BRYhvfgF.js → stateDiagram-RAJIS63D-j1eZ0cEn.js} +1 -1
  104. package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-CMgnlXFj.js +1 -0
  105. package/ui-dist/assets/{timeline-definition-YZTLITO2-CqeKIDK2.js → timeline-definition-YZTLITO2-DXDyrQGI.js} +1 -1
  106. package/ui-dist/assets/{treemap-KZPCXAKY-D7WLACiN.js → treemap-KZPCXAKY-B9DTVtJW.js} +1 -1
  107. package/ui-dist/assets/{vennDiagram-LZ73GAT5-4TiMQaNo.js → vennDiagram-LZ73GAT5-BFdZutUa.js} +1 -1
  108. package/ui-dist/assets/{xychartDiagram-JWTSCODW-BVKw66VX.js → xychartDiagram-JWTSCODW-DTNWhaGH.js} +1 -1
  109. package/ui-dist/index.html +2 -2
  110. package/ui-dist/assets/channel-Dv2zwH0L.js +0 -1
  111. package/ui-dist/assets/classDiagram-VBA2DB6C-BBRYwJo_.js +0 -1
  112. package/ui-dist/assets/classDiagram-v2-RAHNMMFH-BBRYwJo_.js +0 -1
  113. package/ui-dist/assets/clone-D0Qr-ZBI.js +0 -1
  114. package/ui-dist/assets/index-Bxh03544.css +0 -1
  115. package/ui-dist/assets/stateDiagram-v2-FVOUBMTO-BTX-x4pr.js +0 -1
@@ -0,0 +1,428 @@
1
+ import { Router } from "express";
2
+ import { issueService, logActivity, projectService } from "../services/index.js";
3
+ import { assertBoard, assertCompanyAccess, getActorInfo } from "./authz.js";
4
+ const ONBOARDING_PROJECT_NAME = "Getting Started";
5
+ const ONBOARDING_PROJECT_DESCRIPTION = `Learn how Rudder works by completing one guided collaboration loop.
6
+
7
+ This project is not a generic product tour. It teaches the core Rudder workflow:
8
+
9
+ chat → issue → agent execution → activity → review → context → real work.
10
+
11
+ Complete the first four issues to experience the basic loop. Then use the next issues to bring real work and reusable context into Rudder.`;
12
+ const WELCOME_DESCRIPTION = `Welcome to Rudder.
13
+
14
+ Rudder is where you collaborate with agents the way you would work with a human team.
15
+
16
+ You are not just prompting a bot here. You are setting up a working relationship.
17
+
18
+ In Rudder:
19
+
20
+ - Chat is for quick questions, clarification, and routing.
21
+ - Issues are where durable work happens.
22
+ - Projects group related work.
23
+ - Agents have roles, responsibilities, and execution boundaries.
24
+ - Agents can build durable memory through shared context and instructions.
25
+ - Activity makes agent work visible.
26
+ - Reviews and comments keep feedback attached to the work.
27
+ - Reusable workflows help agents improve how they work with you over time.
28
+ - Goals explain why the work exists, but you do not need to define every goal on day one.
29
+
30
+ Start with the Getting Started project in the sidebar.
31
+
32
+ It will guide you through your first collaboration loop:
33
+
34
+ 1. Understand how Rudder work happens.
35
+ 2. Ask your agent one quick question.
36
+ 3. Create and run your first agent issue.
37
+ 4. Review the result and close the loop.
38
+ 5. Add shared context.
39
+ 6. Bring one real task into Rudder.
40
+
41
+ No action is required on this welcome issue. Keep it as a quick reference while you learn how Rudder works.`;
42
+ const ONBOARDING_ISSUES = [
43
+ {
44
+ title: "👋 Welcome to Rudder — work with agents like a team",
45
+ status: "done",
46
+ priority: "high",
47
+ group: "welcome",
48
+ description: WELCOME_DESCRIPTION,
49
+ },
50
+ {
51
+ title: "1. Understand how Rudder work happens",
52
+ status: "todo",
53
+ priority: "high",
54
+ group: "core",
55
+ description: `Rudder works best when each kind of work happens in the right place.
56
+
57
+ The main surfaces are Chat, Issues, Projects, and Activity.
58
+
59
+ Chat is for quick questions, clarification, and routing. Use it when you are still figuring out what you want, or when the request is too small to become durable work.
60
+
61
+ Issues are for work that should be tracked. Use an issue when something needs an owner, status, context, execution, review, or a durable result.
62
+
63
+ Projects group related issues. Use a project when several pieces of work belong together and you want to see their progress in one place.
64
+
65
+ Activity shows what happened. Use it to understand progress, failures, status changes, comments, and agent actions.
66
+
67
+ Try it now:
68
+
69
+ 1. Open Chat from the sidebar.
70
+ 2. Open Issues from the sidebar.
71
+ 3. Open this Getting Started project.
72
+ 4. Open the Activity section on this issue or another issue.
73
+ 5. Mark this issue as Done when you understand where each kind of work belongs.
74
+
75
+ You’ll know it worked when:
76
+
77
+ - You know when to use chat.
78
+ - You know why durable work should live on an issue.
79
+ - You know where project-level work is grouped.
80
+ - You know where to look when you want to understand what changed.
81
+
82
+ Next step: open “Ask your agent one quick question.”`,
83
+ },
84
+ {
85
+ title: "2. Ask your agent one quick question",
86
+ status: "todo",
87
+ priority: "high",
88
+ group: "core",
89
+ description: `Start by talking to your agent before giving it durable work.
90
+
91
+ In human teams, you often ask a teammate a quick question before assigning them a full task. Rudder works the same way. Chat is the lightweight place to ask, clarify, and get oriented.
92
+
93
+ Try it now:
94
+
95
+ 1. Open Chat from the sidebar.
96
+ 2. Ask your first agent one simple question.
97
+
98
+ Good examples:
99
+
100
+ - “What can you help me with in this workspace?”
101
+ - “How should I give you a task in Rudder?”
102
+ - “What is a good first issue for us to try?”
103
+ - “What information do you need from me before you can work well?”
104
+
105
+ 3. Read the agent’s reply.
106
+ 4. Come back and mark this issue as Done.
107
+
108
+ If you do not have an active agent yet, create or activate your first agent before continuing.
109
+
110
+ You’ll know it worked when:
111
+
112
+ - Your agent replies in chat.
113
+ - You understand something about the agent’s role or how to work with it.
114
+ - You have experienced the difference between a quick chat and tracked work.
115
+
116
+ Next step: open “Create and run your first agent issue.”`,
117
+ },
118
+ {
119
+ title: "3. Create and run your first agent issue",
120
+ status: "todo",
121
+ priority: "high",
122
+ group: "core",
123
+ description: `Chat is useful for figuring things out. Issues are where work becomes durable.
124
+
125
+ A request should usually become an issue when it needs:
126
+
127
+ - an owner
128
+ - a status
129
+ - context that should not be lost
130
+ - agent execution
131
+ - review
132
+ - a clear result
133
+ - a follow-up path
134
+
135
+ Now create your first small agent issue.
136
+
137
+ Use your own request, or use this safe example:
138
+
139
+ “Summarize how Rudder works in 5 bullets and suggest one useful next step for a new user.”
140
+
141
+ Try it now:
142
+
143
+ 1. Create a new issue.
144
+ 2. Give it a clear title.
145
+ 3. Add a short description.
146
+ 4. Include the expected result.
147
+ 5. Assign it to your first agent.
148
+ 6. Move it to Todo or another runnable state.
149
+ 7. Open the issue Activity section and watch what happens.
150
+
151
+ Use a low-risk task for this first run. Avoid tasks that need secrets, production access, irreversible actions, or external spending.
152
+
153
+ If you do not have an active agent yet, create or activate your first agent before continuing.
154
+
155
+ You’ll know it worked when:
156
+
157
+ - A new issue exists.
158
+ - It is assigned to your agent.
159
+ - The agent starts working or leaves activity.
160
+ - You can see the work happening on the issue.
161
+
162
+ Next step: open “Review the result and close the loop.”`,
163
+ },
164
+ {
165
+ title: "4. Review the result and close the loop",
166
+ status: "todo",
167
+ priority: "high",
168
+ group: "core",
169
+ description: `Agent collaboration improves when feedback stays attached to the work.
170
+
171
+ In a human team, you rarely just receive work and walk away. You review it, ask for revisions, approve it, or create a follow-up. Rudder keeps that feedback loop on the issue so the context does not disappear.
172
+
173
+ Try it now:
174
+
175
+ 1. Open the issue your agent worked on.
176
+ 2. Read the result.
177
+ 3. Check the Activity section to understand what happened.
178
+ 4. Decide what to do next.
179
+
180
+ If the result is useful:
181
+
182
+ - Leave a short comment explaining what was useful.
183
+ - Move the issue to Done.
184
+
185
+ If the result needs revision:
186
+
187
+ - Leave a comment with specific feedback.
188
+ - Ask the agent to revise.
189
+ - Keep the issue open until the next result is reviewed.
190
+
191
+ If the work needs another step:
192
+
193
+ - Create a follow-up issue.
194
+ - Link it from the current issue.
195
+
196
+ You’ll know it worked when:
197
+
198
+ - The agent’s result has been reviewed.
199
+ - Your feedback is attached to the issue.
200
+ - The next step is clear.
201
+ - The issue is either Done or has a clear follow-up.
202
+
203
+ Next step: continue with “Add shared context your agent should remember.”`,
204
+ },
205
+ {
206
+ title: "5. Add shared context your agent should remember",
207
+ status: "backlog",
208
+ priority: "medium",
209
+ group: "recommended",
210
+ description: `Good teammates remember the context they need to work well.
211
+
212
+ Agents should not need you to repeat the same background every time. Rudder should accumulate shared context across work, so future issues become easier to start and easier to review.
213
+
214
+ Use this issue to write down the basic information your agent should know about this workspace.
215
+
216
+ Try it now:
217
+
218
+ 1. Think about what your agent needed during the first issue.
219
+ 2. Identify one piece of context you do not want to repeat again.
220
+ 3. Add it to shared workspace context, knowledge, or an appropriate document.
221
+ 4. Mention or link that context from one future issue.
222
+
223
+ Useful context may include:
224
+
225
+ - what this workspace is for
226
+ - what product, company, or project you are working on
227
+ - what your agent should optimize for
228
+ - your preferred output style
229
+ - links, repos, files, or docs that matter
230
+ - constraints the agent should respect
231
+ - what “done” usually means
232
+ - things the agent should not do without approval
233
+
234
+ Keep it short and real. Do not try to document the whole workspace on day one.
235
+
236
+ You’ll know it worked when:
237
+
238
+ - There is at least one reusable context note.
239
+ - The context came from something you actually needed.
240
+ - You can point an agent to this context instead of re-explaining it.
241
+
242
+ Next step: open “Bring one real task into Rudder.”`,
243
+ },
244
+ {
245
+ title: "6. Bring one real task into Rudder",
246
+ status: "backlog",
247
+ priority: "high",
248
+ group: "recommended",
249
+ description: `Now bring one real task into Rudder.
250
+
251
+ Choose something real, but keep it small. The goal is not to migrate your entire workflow at once. The goal is to let Rudder take responsibility for one piece of work and leave a result you can review.
252
+
253
+ Pick a task that is useful, safe for an agent to attempt, easy for you to review, and small enough to finish or make progress on today.
254
+
255
+ Try it now:
256
+
257
+ 1. Choose one real task from your current work.
258
+ 2. Create a new issue for it.
259
+ 3. Include what you want done, why it matters, relevant context, what a good result looks like, and what the agent should avoid.
260
+ 4. Attach or mention any relevant files, links, or context.
261
+ 5. Assign the issue to your agent when it is ready.
262
+ 6. Move it to Todo to start the work.
263
+
264
+ Good first real tasks:
265
+
266
+ - “Summarize this project and identify the next 3 issues.”
267
+ - “Review this document and suggest improvements.”
268
+ - “Turn these notes into an implementation plan.”
269
+ - “Inspect this bug report and propose likely causes.”
270
+ - “Draft a checklist for repeating this workflow.”
271
+
272
+ You’ll know it worked when:
273
+
274
+ - One real task exists as a Rudder issue.
275
+ - The issue has enough context for an agent to start.
276
+ - The task is assigned or ready to assign.
277
+ - You know what result you expect to review.
278
+
279
+ Next step: continue with the Advanced Getting Started issues when you are ready.`,
280
+ },
281
+ {
282
+ title: "7. Link this work to a goal",
283
+ status: "backlog",
284
+ priority: "medium",
285
+ group: "advanced",
286
+ description: `Rudder work should eventually answer one question: why does this task exist?
287
+
288
+ You do not need to define a perfect company goal on day one. It is normal for goals to become clearer after you have run a few issues. But once real work starts moving, it should connect back to a larger direction.
289
+
290
+ Try it now:
291
+
292
+ 1. Open the real task you created.
293
+ 2. Ask: “What larger outcome does this support?”
294
+ 3. Create a simple goal, or choose an existing one.
295
+ 4. Link the issue or project to that goal.
296
+ 5. Leave a short note explaining why this work matters.
297
+
298
+ You’ll know it worked when at least one real issue is linked to a goal and the goal explains why the work matters.`,
299
+ },
300
+ {
301
+ title: "8. Capture one reusable workflow",
302
+ status: "backlog",
303
+ priority: "medium",
304
+ group: "advanced",
305
+ description: `The best Rudder workflows compound over time.
306
+
307
+ After an agent completes a useful task, do not let the process disappear into a single comment thread. Capture the repeatable parts so future work can start faster and with better instructions.
308
+
309
+ Try it now:
310
+
311
+ 1. Pick one issue where the agent produced something useful.
312
+ 2. Look for the repeatable pattern: what input the agent needed, what steps it followed, what you reviewed, what should repeat, and what it should avoid.
313
+ 3. Write a short reusable workflow or checklist.
314
+ 4. Link it back to the original issue.
315
+ 5. Use it on one future issue.
316
+
317
+ This is one way agents self-iterate in Rudder: their future work improves because your feedback and reusable workflow context become part of the operating system.`,
318
+ },
319
+ {
320
+ title: "9. Add a second agent with a different role",
321
+ status: "backlog",
322
+ priority: "low",
323
+ group: "advanced",
324
+ description: `Human teams work better when responsibilities are clear. Agent teams work the same way.
325
+
326
+ After your first agent has completed useful work, consider adding a second agent with a different role. Do not create another agent just to have more agents. Create one when the work would benefit from a separate responsibility.
327
+
328
+ Good second-agent roles include reviewer, researcher, planner, QA assistant, documentation assistant, release coordinator, or support triage agent.
329
+
330
+ You’ll know it worked when the second agent has a distinct role and at least one issue clearly belongs to that agent.`,
331
+ },
332
+ {
333
+ title: "10. Set up a recurring loop or automation",
334
+ status: "backlog",
335
+ priority: "low",
336
+ group: "advanced",
337
+ description: `Some work should not wait for you to remember it.
338
+
339
+ Once you have run a few issues manually, look for a recurring pattern. Rudder can help turn repeated work into a regular loop, heartbeat, or automation, while still keeping the result visible and reviewable.
340
+
341
+ Good recurring loops include weekly project summaries, daily issue triage, release readiness checks, inbox or blocker review, documentation freshness checks, and cost or activity summaries.
342
+
343
+ You’ll know it worked when one recurring loop exists, the cadence is clear, the expected output is clear, and the agent knows when to ask for review instead of acting silently.`,
344
+ },
345
+ ];
346
+ export function onboardingRoutes(db) {
347
+ const router = Router();
348
+ const projects = projectService(db);
349
+ const issues = issueService(db);
350
+ router.post("/orgs/:orgId/onboarding/getting-started", async (req, res) => {
351
+ const orgId = req.params.orgId;
352
+ assertCompanyAccess(req, orgId);
353
+ assertBoard(req);
354
+ const actor = getActorInfo(req);
355
+ const operatorUserId = req.actor.userId ?? "local-board";
356
+ const existingProjects = await projects.list(orgId);
357
+ let project = existingProjects.find((entry) => !entry.archivedAt && entry.name === ONBOARDING_PROJECT_NAME);
358
+ let createdProject = false;
359
+ if (!project) {
360
+ project = await projects.create(orgId, {
361
+ name: ONBOARDING_PROJECT_NAME,
362
+ status: "planned",
363
+ description: ONBOARDING_PROJECT_DESCRIPTION,
364
+ });
365
+ createdProject = true;
366
+ await logActivity(db, {
367
+ orgId,
368
+ actorType: actor.actorType,
369
+ actorId: actor.actorId,
370
+ agentId: actor.agentId,
371
+ runId: actor.runId,
372
+ action: "project.created",
373
+ entityType: "project",
374
+ entityId: project.id,
375
+ details: { name: project.name },
376
+ });
377
+ }
378
+ const existingIssues = await issues.list(orgId, { projectId: project.id });
379
+ const issueByTitle = new Map(existingIssues.map((issue) => [issue.title, issue]));
380
+ const seededIssues = [];
381
+ let createdIssueCount = 0;
382
+ for (const [index, template] of ONBOARDING_ISSUES.entries()) {
383
+ let issue = issueByTitle.get(template.title);
384
+ if (!issue) {
385
+ issue = await issues.create(orgId, {
386
+ projectId: project.id,
387
+ title: template.title,
388
+ description: template.description,
389
+ status: template.status,
390
+ priority: template.priority,
391
+ assigneeUserId: operatorUserId,
392
+ createdByAgentId: actor.agentId,
393
+ createdByUserId: actor.actorType === "user" ? actor.actorId : null,
394
+ boardOrder: (index + 1) * 1000,
395
+ });
396
+ createdIssueCount += 1;
397
+ issueByTitle.set(template.title, issue);
398
+ await logActivity(db, {
399
+ orgId,
400
+ actorType: actor.actorType,
401
+ actorId: actor.actorId,
402
+ agentId: actor.agentId,
403
+ runId: actor.runId,
404
+ action: "issue.created",
405
+ entityType: "issue",
406
+ entityId: issue.id,
407
+ details: {
408
+ title: issue.title,
409
+ identifier: issue.identifier,
410
+ onboardingGroup: template.group,
411
+ },
412
+ });
413
+ }
414
+ if (template.group === "welcome") {
415
+ await issues.followIssue(orgId, issue.id, operatorUserId);
416
+ }
417
+ seededIssues.push(issue);
418
+ }
419
+ res.status(createdProject || createdIssueCount > 0 ? 201 : 200).json({
420
+ project,
421
+ issues: seededIssues,
422
+ createdProject,
423
+ createdIssueCount,
424
+ });
425
+ });
426
+ return router;
427
+ }
428
+ //# sourceMappingURL=onboarding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"onboarding.js","sourceRoot":"","sources":["../../src/routes/onboarding.ts"],"names":[],"mappings":"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"}
@@ -26,8 +26,8 @@ export declare function agentService(db: Db): {
26
26
  includeHidden?: boolean;
27
27
  }) => Promise<Omit<{
28
28
  permissions: import("./agent-permissions.js").NormalizedAgentPermissions;
29
- id: string;
30
29
  title: string | null;
30
+ id: string;
31
31
  status: string;
32
32
  updatedAt: Date;
33
33
  orgId: string;
@@ -52,8 +52,8 @@ export declare function agentService(db: Db): {
52
52
  }, "workspaceKey">[]>;
53
53
  getById: (id: string) => Promise<Omit<{
54
54
  permissions: import("./agent-permissions.js").NormalizedAgentPermissions;
55
- id: string;
56
55
  title: string | null;
56
+ id: string;
57
57
  status: string;
58
58
  updatedAt: Date;
59
59
  orgId: string;
@@ -78,8 +78,8 @@ export declare function agentService(db: Db): {
78
78
  }, "workspaceKey"> | null>;
79
79
  getInternalById: (id: string) => Promise<({
80
80
  permissions: import("./agent-permissions.js").NormalizedAgentPermissions;
81
- id: string;
82
81
  title: string | null;
82
+ id: string;
83
83
  status: string;
84
84
  updatedAt: Date;
85
85
  orgId: string;
@@ -107,8 +107,8 @@ export declare function agentService(db: Db): {
107
107
  name?: string | null;
108
108
  }) => Promise<Omit<{
109
109
  permissions: import("./agent-permissions.js").NormalizedAgentPermissions;
110
- id: string;
111
110
  title: string | null;
111
+ id: string;
112
112
  status: string;
113
113
  updatedAt: Date;
114
114
  orgId: string;
@@ -133,8 +133,8 @@ export declare function agentService(db: Db): {
133
133
  }, "workspaceKey">>;
134
134
  update: (id: string, data: Partial<typeof agents.$inferInsert>, options?: UpdateAgentOptions) => Promise<Omit<{
135
135
  permissions: import("./agent-permissions.js").NormalizedAgentPermissions;
136
- id: string;
137
136
  title: string | null;
137
+ id: string;
138
138
  status: string;
139
139
  updatedAt: Date;
140
140
  orgId: string;
@@ -159,8 +159,8 @@ export declare function agentService(db: Db): {
159
159
  }, "workspaceKey"> | null>;
160
160
  pause: (id: string, reason?: "manual" | "budget" | "system") => Promise<Omit<{
161
161
  permissions: import("./agent-permissions.js").NormalizedAgentPermissions;
162
- id: string;
163
162
  title: string | null;
163
+ id: string;
164
164
  status: string;
165
165
  updatedAt: Date;
166
166
  orgId: string;
@@ -185,8 +185,8 @@ export declare function agentService(db: Db): {
185
185
  }, "workspaceKey"> | null>;
186
186
  resume: (id: string) => Promise<Omit<{
187
187
  permissions: import("./agent-permissions.js").NormalizedAgentPermissions;
188
- id: string;
189
188
  title: string | null;
189
+ id: string;
190
190
  status: string;
191
191
  updatedAt: Date;
192
192
  orgId: string;
@@ -211,8 +211,8 @@ export declare function agentService(db: Db): {
211
211
  }, "workspaceKey"> | null>;
212
212
  terminate: (id: string) => Promise<Omit<{
213
213
  permissions: import("./agent-permissions.js").NormalizedAgentPermissions;
214
- id: string;
215
214
  title: string | null;
215
+ id: string;
216
216
  status: string;
217
217
  updatedAt: Date;
218
218
  orgId: string;
@@ -237,8 +237,8 @@ export declare function agentService(db: Db): {
237
237
  }, "workspaceKey"> | null>;
238
238
  remove: (id: string) => Promise<Omit<{
239
239
  permissions: import("./agent-permissions.js").NormalizedAgentPermissions;
240
- id: string;
241
240
  title: string | null;
241
+ id: string;
242
242
  status: string;
243
243
  updatedAt: Date;
244
244
  orgId: string;
@@ -263,8 +263,8 @@ export declare function agentService(db: Db): {
263
263
  }, "workspaceKey"> | null>;
264
264
  activatePendingApproval: (id: string) => Promise<Omit<{
265
265
  permissions: import("./agent-permissions.js").NormalizedAgentPermissions;
266
- id: string;
267
266
  title: string | null;
267
+ id: string;
268
268
  status: string;
269
269
  updatedAt: Date;
270
270
  orgId: string;
@@ -291,8 +291,8 @@ export declare function agentService(db: Db): {
291
291
  canCreateAgents: boolean;
292
292
  }) => Promise<Omit<{
293
293
  permissions: import("./agent-permissions.js").NormalizedAgentPermissions;
294
- id: string;
295
294
  title: string | null;
295
+ id: string;
296
296
  status: string;
297
297
  updatedAt: Date;
298
298
  orgId: string;
@@ -346,8 +346,8 @@ export declare function agentService(db: Db): {
346
346
  userId?: string | null;
347
347
  }) => Promise<Omit<{
348
348
  permissions: import("./agent-permissions.js").NormalizedAgentPermissions;
349
- id: string;
350
349
  title: string | null;
350
+ id: string;
351
351
  status: string;
352
352
  updatedAt: Date;
353
353
  orgId: string;
@@ -1679,8 +1679,8 @@ export declare function agentService(db: Db): {
1679
1679
  } | {
1680
1680
  readonly agent: Omit<{
1681
1681
  permissions: import("./agent-permissions.js").NormalizedAgentPermissions;
1682
- id: string;
1683
1682
  title: string | null;
1683
+ id: string;
1684
1684
  status: string;
1685
1685
  updatedAt: Date;
1686
1686
  orgId: string;
@@ -9,8 +9,9 @@ export declare function automationService(db: Db, deps?: {
9
9
  heartbeat?: IssueAssignmentWakeupDeps;
10
10
  }): {
11
11
  get: (id: string) => Promise<{
12
- id: string;
13
12
  title: string;
13
+ description: string | null;
14
+ id: string;
14
15
  status: string;
15
16
  priority: string;
16
17
  assigneeAgentId: string;
@@ -19,7 +20,6 @@ export declare function automationService(db: Db, deps?: {
19
20
  orgId: string;
20
21
  projectId: string;
21
22
  goalId: string | null;
22
- description: string | null;
23
23
  createdByAgentId: string | null;
24
24
  createdAt: Date;
25
25
  updatedByAgentId: string | null;
@@ -34,14 +34,14 @@ export declare function calendarService(db: Db): {
34
34
  createEvent(orgId: string, input: CreateCalendarEvent, actor?: Actor): Promise<CalendarEvent | null>;
35
35
  updateEvent(orgId: string, eventId: string, input: UpdateCalendarEvent, actor?: Actor): Promise<{
36
36
  previous: {
37
- id: string;
38
37
  title: string;
38
+ description: string | null;
39
+ id: string;
39
40
  createdByUserId: string | null;
40
41
  updatedAt: Date;
41
42
  orgId: string;
42
43
  projectId: string | null;
43
44
  goalId: string | null;
44
- description: string | null;
45
45
  createdAt: Date;
46
46
  timezone: string;
47
47
  updatedByUserId: string | null;
@@ -70,14 +70,14 @@ export declare function calendarService(db: Db): {
70
70
  event: CalendarEvent | null;
71
71
  }>;
72
72
  deleteEvent(orgId: string, eventId: string, actor?: Actor): Promise<{
73
- id: string;
74
73
  title: string;
74
+ description: string | null;
75
+ id: string;
75
76
  createdByUserId: string | null;
76
77
  updatedAt: Date;
77
78
  orgId: string;
78
79
  projectId: string | null;
79
80
  goalId: string | null;
80
- description: string | null;
81
81
  createdAt: Date;
82
82
  timezone: string;
83
83
  updatedByUserId: string | null;