@rudderhq/cli 0.2.7-canary.2 → 0.2.7-canary.20

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.
package/README.md CHANGED
@@ -1,76 +1,76 @@
1
1
  # Rudder
2
2
 
3
- > Collaborate with agents the way humans work together.
3
+ > Build your self-improving Agent Team.
4
4
 
5
- Rudder is an orchestration and control platform for agent work, and the operating layer for agent teams. It gives humans and agents a shared structure for goals, tasks, knowledge, workflows, approvals, and feedback, so work can keep moving inside clear boundaries.
5
+ Agents that think, build, play, and learn from real work.
6
6
 
7
- Rudder began from a fork of an early version of Paperclip. That gave us a practical starting point for agent operations. Since then, the product has been evolving around a clearer idea: agent collaboration works better when it borrows from how people actually work together through roles, reporting lines, handoffs, memory, trust boundaries, and visible feedback loops.
7
+ Rudder turns goals, issues, agent runs, reviews, and feedback into a work loop for agent teams. It gives humans and agents a shared operating structure for assigning work, running agents, reviewing outputs, controlling spend, and preserving the lessons that should make the next run better.
8
8
 
9
- Rudder is built for the moment when agent work stops looking like a single prompt and starts looking like a real team.
10
-
11
- ## The Design Idea
9
+ Rudder began as a fork of an early version of Paperclip. That gave the project a practical starting point for agent operations; Rudder is now evolving around a sharper product idea: agent teams improve when real work leaves behind durable context, decisions, feedback, and reusable operating patterns.
12
10
 
13
- Rudder is shaped by a simple belief: the most useful way to work with agents is closer to the way humans coordinate with each other.
11
+ Rudder is built for the moment when agent work stops looking like a single prompt and starts looking like a real team.
14
12
 
15
- People do not operate through one giant shared prompt. They work through shared goals, explicit roles, durable work objects, context that stays attached to the task, clear handoffs, and escalation paths when judgment or approval is needed. Teams also need visibility: what is moving, what is blocked, what it costs, and where intervention matters.
13
+ ## The Work Loop
16
14
 
17
- Rudder turns those coordination patterns into product primitives for agent teams.
15
+ Rudder is designed around the loop that makes agent work compound:
18
16
 
19
- ![](./doc/assets/readme_imgs/1.png)
17
+ ```text
18
+ Goal -> Issue -> Agent run -> Review -> Feedback -> Learning -> Better future runs
19
+ ```
20
20
 
21
- ![](./doc/assets/readme_imgs/9.png)
21
+ The control plane matters because this loop needs structure. Goals explain why work exists. Issues make work durable. Heartbeats run agents in a visible way. Reviews and approvals keep autonomy governable. Feedback, comments, documents, run history, and skills give the team a place to keep what it learned.
22
22
 
23
- ![](./doc/assets/readme_imgs/10.png)
23
+ Rudder does not assume every lesson is automatically promoted into a new skill or workflow. The product direction is to make those promotion paths explicit, reviewable, and reusable instead of leaving them buried in chat transcripts or one-off prompts.
24
24
 
25
- ![](./doc/assets/readme_imgs/2.png)
25
+ ## The Design Idea
26
26
 
27
- ![](./doc/assets/readme_imgs/3.png)
27
+ The most useful way to work with agents is closer to the way humans coordinate with each other.
28
28
 
29
- ![](./doc/assets/readme_imgs/4.png)
29
+ People do not operate through one giant shared prompt. They work through shared goals, explicit roles, durable work objects, context attached to the task, clear handoffs, and escalation paths when judgment or approval is needed. Teams also need visibility: what is moving, what is blocked, what it costs, and where intervention matters.
30
30
 
31
- ![](./doc/assets/readme_imgs/5.png)
31
+ Rudder turns those coordination patterns into product primitives for agent teams:
32
32
 
33
- ![](./doc/assets/readme_imgs/6.png)
33
+ ![Rudder issue board](./doc/assets/readme_imgs/1.png)
34
34
 
35
- ![](./doc/assets/readme_imgs/7.png)
35
+ ![Rudder calendar](./doc/assets/readme_imgs/9.png)
36
36
 
37
- ![](./doc/assets/readme_imgs/8.png)
37
+ ![Rudder organization structure](./doc/assets/readme_imgs/10.png)
38
38
 
39
+ ![Rudder approvals](./doc/assets/readme_imgs/2.png)
39
40
 
41
+ ![Rudder issue proposal](./doc/assets/readme_imgs/3.png)
40
42
 
41
- That means:
43
+ ![Rudder heartbeats](./doc/assets/readme_imgs/4.png)
42
44
 
43
- - work belongs to an organization, not a loose thread
44
- - every task should trace back to a goal
45
- - agents should have explicit roles, runtime config, and reporting lines
46
- - chat should help clarify and route work, while durable execution stays attached to issues, approvals, and outputs
47
- - autonomy should stay legible, governable, and budget-aware
45
+ ![Rudder skills](./doc/assets/readme_imgs/5.png)
48
46
 
49
- ## Why Rudder
47
+ ![Rudder run transcript](./doc/assets/readme_imgs/6.png)
50
48
 
51
- As soon as agent work becomes ongoing, three things start to matter very quickly: structure, continuity, and control.
49
+ ![Rudder organization focused view](./doc/assets/readme_imgs/7.png)
52
50
 
53
- You need a place where goals stay visible, tasks remain durable, knowledge compounds over time, approvals have a clear surface, and spend does not disappear into hidden runtime loops. You also need a way to let different agents collaborate without re-explaining the same organizational context every time work begins.
51
+ ![Rudder issue detail](./doc/assets/readme_imgs/8.png)
54
52
 
55
- Rudder provides that control layer. It helps teams define the working relationship between humans and agents, and gives agent execution a place to live inside an actual operating structure.
53
+ - work belongs to an organization, not a loose thread
54
+ - every issue should trace back to a goal
55
+ - agents have roles, runtime config, reporting lines, and skills
56
+ - chat helps clarify and route work, while durable execution stays attached to issues, approvals, outputs, and run history
57
+ - autonomy stays legible, governable, and budget-aware
56
58
 
57
59
  ## What Rudder Is
58
60
 
59
- Rudder is the operating layer for agent teams. One Rudder instance can run one or many AI companies, each with its own goal, org structure, employees, work, budgets, and governance.
60
-
61
-
62
- | Human company pattern | Rudder equivalent |
63
- | --------------------- | ----------------------------------------------- |
64
- | Company mission | Company goal |
65
- | Employees | AI agents |
66
- | Org chart | Agent reporting structure |
67
- | Work ownership | Issues and assignments |
68
- | Team workflow | Workflow definitions and execution paths |
69
- | Operational memory | Knowledge, comments, logs, and activity history |
70
- | Manager check-ins | Agent heartbeats |
71
- | Executive review | Board approvals |
72
- | Budget discipline | Spend tracking and hard stops |
61
+ Rudder is the operating layer for self-improving agent teams. One Rudder instance can run one or many organizations, each with its own goal, org structure, agents, issues, budgets, approvals, feedback, and governance.
73
62
 
63
+ | Human team pattern | Rudder equivalent |
64
+ | --- | --- |
65
+ | Mission | Organization goal |
66
+ | Employees | AI agents |
67
+ | Org chart | Agent reporting structure |
68
+ | Work ownership | Issues and assignments |
69
+ | Team workflow | Workflow definitions and execution paths |
70
+ | Operational memory | Comments, documents, run history, activity, and skills |
71
+ | Manager check-ins | Agent heartbeats |
72
+ | Executive review | Board approvals |
73
+ | Budget discipline | Spend tracking and hard stops |
74
74
 
75
75
  Rudder coordinates agents. It does not force one runtime, one model, one prompt format, or one execution environment.
76
76
 
@@ -78,15 +78,13 @@ Rudder coordinates agents. It does not force one runtime, one model, one prompt
78
78
 
79
79
  ### Try Rudder
80
80
 
81
- The fastest path installs the per-user portable Rudder Desktop app and prepares
82
- the matching persistent CLI:
81
+ The fastest path installs the per-user portable Rudder Desktop app and prepares the matching persistent CLI:
83
82
 
84
83
  ```bash
85
84
  npx @rudderhq/cli@latest start
86
85
  ```
87
86
 
88
- After the persistent CLI is available, the direct `rudder` form is the same
89
- command surface:
87
+ After the persistent CLI is available, the direct `rudder` form is the same command surface:
90
88
 
91
89
  ```bash
92
90
  rudder start
@@ -110,13 +108,16 @@ Rudder defaults to embedded PostgreSQL in development. If `DATABASE_URL` is unse
110
108
 
111
109
  1. Create an organization.
112
110
  2. Define the organization goal.
113
- 3. Hire a CEO agent and configure its runtime.
114
- 4. Build the org tree by adding reports.
111
+ 3. Create or use a default agent with a clear role and runtime.
112
+ 4. Add more agents only when repeated work needs stable ownership.
115
113
  5. Create or convert work into issues.
116
114
  6. Let agents pick up work through heartbeat invocations.
117
115
  7. Review outputs, approvals, activity, and spend from the board.
116
+ 8. Leave feedback on the run, issue, or output.
117
+ 9. Preserve reusable lessons as better context, skills, decisions, or workflows.
118
+ 10. Future runs use the improved team context.
118
119
 
119
- Every durable piece of work should still answer one question: why does this task exist? In Rudder, the intended answer is traceable all the way back to the organization goal.
120
+ Every durable piece of work should still answer one question: why does this issue exist? In Rudder, the intended answer is traceable all the way back to the organization goal.
120
121
 
121
122
  ## Contributing
122
123
 
package/dist/index.js CHANGED
@@ -747,7 +747,7 @@ var init_resource = __esm({
747
747
 
748
748
  // ../packages/shared/dist/validators/chat.js
749
749
  import { z as z8 } from "zod";
750
- var chatConversationStatusSchema, chatIssueCreationModeSchema, chatMessageRoleSchema, chatMessageKindSchema, chatMessageStatusSchema, chatContextEntityTypeSchema, createChatContextLinkSchema, createChatConversationSchema, setChatProjectContextSchema, updateChatConversationSchema, addChatMessageSchema, chatRichReferenceDisplaySchema, chatIssueIdentifierSchema, chatAskUserIdentifierSchema, chatAskUserOptionSchema, chatAskUserQuestionSchema, chatAskUserRequestSchema, chatIssueRichReferenceSchema, chatIssueCommentRichReferenceSchema, chatRichReferenceSchema, chatRichReferencesSchema, createChatAttachmentMetadataSchema, chatIssueProposalSchema, convertChatToIssueSchema, chatOperationProposalSchema, resolveChatOperationProposalSchema, updateChatConversationUserStateSchema;
750
+ var chatConversationStatusSchema, chatIssueCreationModeSchema, chatMessageRoleSchema, chatMessageKindSchema, chatMessageStatusSchema, chatContextEntityTypeSchema, createChatContextLinkSchema, createChatConversationSchema, setChatProjectContextSchema, updateChatConversationSchema, addChatMessageSchema, chatRichReferenceDisplaySchema, chatIssueIdentifierSchema, chatAskUserIdentifierSchema, chatAskUserOptionSchema, chatAskUserQuestionSchema, chatAskUserRequestSchema, chatIssueRichReferenceSchema, chatIssueCommentRichReferenceSchema, chatRichReferenceSchema, chatRichReferencesSchema, chatAutomationCreateSchema, createChatAttachmentMetadataSchema, chatIssueProposalSchema, convertChatToIssueSchema, chatOperationProposalSchema, resolveChatOperationProposalSchema, updateChatConversationUserStateSchema;
751
751
  var init_chat = __esm({
752
752
  "../packages/shared/dist/validators/chat.js"() {
753
753
  "use strict";
@@ -798,6 +798,7 @@ var init_chat = __esm({
798
798
  header: z8.string().trim().min(1).max(32).optional(),
799
799
  question: z8.string().trim().min(1).max(240),
800
800
  options: z8.array(chatAskUserOptionSchema).min(2).max(3),
801
+ selectionMode: z8.enum(["single", "multiple"]).optional(),
801
802
  allowFreeform: z8.boolean().optional()
802
803
  }).superRefine((question, ctx) => {
803
804
  const optionIds = /* @__PURE__ */ new Set();
@@ -851,6 +852,24 @@ var init_chat = __esm({
851
852
  chatIssueCommentRichReferenceSchema
852
853
  ]);
853
854
  chatRichReferencesSchema = z8.array(chatRichReferenceSchema).max(5);
855
+ chatAutomationCreateSchema = z8.object({
856
+ title: z8.string().trim().min(1).max(200),
857
+ description: z8.string().trim().max(2e4).optional().nullable(),
858
+ projectId: z8.string().uuid().optional().nullable(),
859
+ goalId: z8.string().uuid().optional().nullable(),
860
+ parentIssueId: z8.string().uuid().optional().nullable(),
861
+ priority: z8.enum(["critical", "high", "medium", "low"]).optional().default("medium"),
862
+ status: z8.enum(AUTOMATION_STATUSES).optional().default("active"),
863
+ concurrencyPolicy: z8.enum(AUTOMATION_CONCURRENCY_POLICIES).optional().default("coalesce_if_active"),
864
+ catchUpPolicy: z8.enum(AUTOMATION_CATCH_UP_POLICIES).optional().default("skip_missed"),
865
+ outputMode: z8.enum(AUTOMATION_OUTPUT_MODES).optional().default("chat_output"),
866
+ schedule: z8.object({
867
+ cronExpression: z8.string().trim().min(1),
868
+ timezone: z8.string().trim().min(1),
869
+ label: z8.string().trim().max(120).optional().nullable(),
870
+ enabled: z8.boolean().optional().default(true)
871
+ })
872
+ });
854
873
  createChatAttachmentMetadataSchema = z8.object({
855
874
  messageId: z8.string().uuid()
856
875
  });
@@ -2598,11 +2617,12 @@ var init_project_mentions = __esm({
2598
2617
 
2599
2618
  // ../packages/shared/dist/config-schema.js
2600
2619
  import { z as z27 } from "zod";
2601
- var configMetaSchema, llmConfigSchema, databaseBackupConfigSchema, databaseConfigSchema, loggingConfigSchema, serverConfigSchema, authConfigSchema, storageLocalDiskConfigSchema, storageS3ConfigSchema, storageConfigSchema, secretsLocalEncryptedConfigSchema, secretsConfigSchema, langfuseConfigSchema, rudderConfigSchema;
2620
+ var DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES, configMetaSchema, llmConfigSchema, databaseBackupConfigSchema, databaseConfigSchema, loggingConfigSchema, serverConfigSchema, authConfigSchema, storageLocalDiskConfigSchema, storageS3ConfigSchema, storageConfigSchema, secretsLocalEncryptedConfigSchema, secretsConfigSchema, langfuseConfigSchema, rudderConfigSchema;
2602
2621
  var init_config_schema = __esm({
2603
2622
  "../packages/shared/dist/config-schema.js"() {
2604
2623
  "use strict";
2605
2624
  init_constants();
2625
+ DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES = 256 * 1024 * 1024;
2606
2626
  configMetaSchema = z27.object({
2607
2627
  version: z27.literal(1),
2608
2628
  updatedAt: z27.string(),
@@ -2616,6 +2636,7 @@ var init_config_schema = __esm({
2616
2636
  enabled: z27.boolean().default(true),
2617
2637
  intervalMinutes: z27.number().int().min(1).max(7 * 24 * 60).default(60),
2618
2638
  retentionDays: z27.number().int().min(1).max(3650).default(30),
2639
+ maxEstimatedBytes: z27.number().int().min(1).default(DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES),
2619
2640
  dir: z27.string().default("~/.rudder/instances/default/data/backups")
2620
2641
  });
2621
2642
  databaseConfigSchema = z27.object({
@@ -2627,6 +2648,7 @@ var init_config_schema = __esm({
2627
2648
  enabled: true,
2628
2649
  intervalMinutes: 60,
2629
2650
  retentionDays: 30,
2651
+ maxEstimatedBytes: DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES,
2630
2652
  dir: "~/.rudder/instances/default/data/backups"
2631
2653
  })
2632
2654
  });
@@ -3140,6 +3162,7 @@ async function promptDatabase(current) {
3140
3162
  enabled: true,
3141
3163
  intervalMinutes: 60,
3142
3164
  retentionDays: 30,
3165
+ maxEstimatedBytes: DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES,
3143
3166
  dir: defaultBackupDir
3144
3167
  }
3145
3168
  };
@@ -3248,6 +3271,20 @@ async function promptDatabase(current) {
3248
3271
  p.cancel("Setup cancelled.");
3249
3272
  process.exit(0);
3250
3273
  }
3274
+ const backupMaxEstimatedInput = await p.text({
3275
+ message: "Scheduled backup max database estimate (bytes)",
3276
+ defaultValue: String(base.backup.maxEstimatedBytes || DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES),
3277
+ placeholder: String(DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES),
3278
+ validate: (val) => {
3279
+ const n = Number(val);
3280
+ if (!Number.isInteger(n) || n < 1) return "Max estimate must be a positive integer byte count";
3281
+ return void 0;
3282
+ }
3283
+ });
3284
+ if (p.isCancel(backupMaxEstimatedInput)) {
3285
+ p.cancel("Setup cancelled.");
3286
+ process.exit(0);
3287
+ }
3251
3288
  return {
3252
3289
  mode,
3253
3290
  connectionString,
@@ -3257,6 +3294,7 @@ async function promptDatabase(current) {
3257
3294
  enabled: backupEnabled,
3258
3295
  intervalMinutes: Number(backupIntervalInput || "60"),
3259
3296
  retentionDays: Number(backupRetentionInput || "30"),
3297
+ maxEstimatedBytes: Number(backupMaxEstimatedInput || String(DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES)),
3260
3298
  dir: backupDirInput || defaultBackupDir
3261
3299
  }
3262
3300
  };
@@ -3264,6 +3302,7 @@ async function promptDatabase(current) {
3264
3302
  var init_database = __esm({
3265
3303
  "src/prompts/database.ts"() {
3266
3304
  "use strict";
3305
+ init_schema();
3267
3306
  init_home();
3268
3307
  }
3269
3308
  });
@@ -5471,6 +5510,18 @@ function parseNumberFromEnv(rawValue) {
5471
5510
  if (!Number.isFinite(parsed)) return null;
5472
5511
  return parsed;
5473
5512
  }
5513
+ function parseBytesFromEnv(rawValue) {
5514
+ const value = rawValue?.trim();
5515
+ if (!value) return null;
5516
+ const match = value.match(/^(\d+(?:\.\d+)?)\s*(b|kb|kib|mb|mib|gb|gib)?$/i);
5517
+ if (!match) return null;
5518
+ const amount = Number(match[1]);
5519
+ const unit = match[2]?.toLowerCase() ?? "b";
5520
+ const multiplier = unit === "gb" || unit === "gib" ? 1024 ** 3 : unit === "mb" || unit === "mib" ? 1024 ** 2 : unit === "kb" || unit === "kib" ? 1024 : 1;
5521
+ const parsed = Math.floor(amount * multiplier);
5522
+ if (!Number.isSafeInteger(parsed) || parsed < 1) return null;
5523
+ return parsed;
5524
+ }
5474
5525
  function parseEnumFromEnv(rawValue, allowedValues) {
5475
5526
  if (!rawValue) return null;
5476
5527
  return allowedValues.includes(rawValue) ? rawValue : null;
@@ -5516,6 +5567,7 @@ function quickstartDefaultsFromEnv() {
5516
5567
  1,
5517
5568
  parseNumberFromEnv(process.env.RUDDER_DB_BACKUP_RETENTION_DAYS) ?? 30
5518
5569
  );
5570
+ const databaseBackupMaxEstimatedBytes = parseBytesFromEnv(process.env.RUDDER_DB_BACKUP_MAX_ESTIMATED_BYTES) ?? DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES;
5519
5571
  const defaults = {
5520
5572
  database: {
5521
5573
  mode: databaseUrl ? "postgres" : "embedded-postgres",
@@ -5529,6 +5581,7 @@ function quickstartDefaultsFromEnv() {
5529
5581
  enabled: databaseBackupEnabled,
5530
5582
  intervalMinutes: databaseBackupIntervalMinutes,
5531
5583
  retentionDays: databaseBackupRetentionDays,
5584
+ maxEstimatedBytes: databaseBackupMaxEstimatedBytes,
5532
5585
  dir: resolvePathFromEnv(process.env.RUDDER_DB_BACKUP_DIR) ?? resolveDefaultBackupDir(instanceId)
5533
5586
  }
5534
5587
  },
@@ -5880,6 +5933,7 @@ var init_onboard = __esm({
5880
5933
  "RUDDER_DB_BACKUP_INTERVAL_MINUTES",
5881
5934
  "RUDDER_DB_BACKUP_RETENTION_DAYS",
5882
5935
  "RUDDER_DB_BACKUP_DIR",
5936
+ "RUDDER_DB_BACKUP_MAX_ESTIMATED_BYTES",
5883
5937
  "RUDDER_DEPLOYMENT_MODE",
5884
5938
  "RUDDER_DEPLOYMENT_EXPOSURE",
5885
5939
  "HOST",
@@ -6211,6 +6265,7 @@ function quoteShellValue(value) {
6211
6265
 
6212
6266
  // src/commands/configure.ts
6213
6267
  init_store();
6268
+ init_schema();
6214
6269
  init_secrets_key();
6215
6270
  init_database();
6216
6271
  init_llm();
@@ -6248,6 +6303,7 @@ function defaultConfig() {
6248
6303
  enabled: true,
6249
6304
  intervalMinutes: 60,
6250
6305
  retentionDays: 30,
6306
+ maxEstimatedBytes: DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES,
6251
6307
  dir: resolveDefaultBackupDir(instanceId)
6252
6308
  }
6253
6309
  },