@rudderhq/cli 0.2.7-canary.1 → 0.2.7-canary.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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 agent teams and AI-native organizations. One Rudder instance can run one or many organizations, each with its own goal, org structure, agents, issues, budgets, approvals, 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
@@ -115,6 +113,9 @@ Rudder defaults to embedded PostgreSQL in development. If `DATABASE_URL` is unse
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
120
  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
121
 
package/dist/index.js CHANGED
@@ -1803,7 +1803,7 @@ var init_approval = __esm({
1803
1803
 
1804
1804
  // ../packages/shared/dist/validators/automation.js
1805
1805
  import { z as z20 } from "zod";
1806
- var automationBodySchema, updateAutomationSchema, baseTriggerSchema, createAutomationTriggerSchema, updateAutomationTriggerSchema, runAutomationSchema, rotateAutomationTriggerSecretSchema;
1806
+ var automationBodySchema, createAutomationSchema, updateAutomationSchema, baseTriggerSchema, createAutomationTriggerSchema, updateAutomationTriggerSchema, runAutomationSchema, rotateAutomationTriggerSecretSchema;
1807
1807
  var init_automation = __esm({
1808
1808
  "../packages/shared/dist/validators/automation.js"() {
1809
1809
  "use strict";
@@ -1820,10 +1820,26 @@ var init_automation = __esm({
1820
1820
  concurrencyPolicy: z20.enum(AUTOMATION_CONCURRENCY_POLICIES).optional().default("coalesce_if_active"),
1821
1821
  catchUpPolicy: z20.enum(AUTOMATION_CATCH_UP_POLICIES).optional().default("skip_missed"),
1822
1822
  outputMode: z20.enum(AUTOMATION_OUTPUT_MODES).optional().default("track_issue"),
1823
- chatConversationId: z20.string().uuid().optional().nullable().default(null),
1824
- allowAssigneeChatMismatch: z20.boolean().optional().default(false)
1823
+ chatConversationId: z20.string().uuid().optional().nullable().default(null)
1824
+ });
1825
+ createAutomationSchema = automationBodySchema.superRefine((value, ctx) => {
1826
+ if (value.chatConversationId) {
1827
+ ctx.addIssue({
1828
+ code: z20.ZodIssueCode.custom,
1829
+ path: ["chatConversationId"],
1830
+ message: "Chat output creates an automation-owned conversation; existing chats cannot be selected"
1831
+ });
1832
+ }
1833
+ });
1834
+ updateAutomationSchema = automationBodySchema.partial().superRefine((value, ctx) => {
1835
+ if (value.chatConversationId) {
1836
+ ctx.addIssue({
1837
+ code: z20.ZodIssueCode.custom,
1838
+ path: ["chatConversationId"],
1839
+ message: "Chat output creates an automation-owned conversation; existing chats cannot be selected"
1840
+ });
1841
+ }
1825
1842
  });
1826
- updateAutomationSchema = automationBodySchema.partial();
1827
1843
  baseTriggerSchema = z20.object({
1828
1844
  label: z20.string().trim().max(120).optional().nullable(),
1829
1845
  enabled: z20.boolean().optional().default(true)
@@ -2582,11 +2598,12 @@ var init_project_mentions = __esm({
2582
2598
 
2583
2599
  // ../packages/shared/dist/config-schema.js
2584
2600
  import { z as z27 } from "zod";
2585
- var configMetaSchema, llmConfigSchema, databaseBackupConfigSchema, databaseConfigSchema, loggingConfigSchema, serverConfigSchema, authConfigSchema, storageLocalDiskConfigSchema, storageS3ConfigSchema, storageConfigSchema, secretsLocalEncryptedConfigSchema, secretsConfigSchema, langfuseConfigSchema, rudderConfigSchema;
2601
+ var DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES, configMetaSchema, llmConfigSchema, databaseBackupConfigSchema, databaseConfigSchema, loggingConfigSchema, serverConfigSchema, authConfigSchema, storageLocalDiskConfigSchema, storageS3ConfigSchema, storageConfigSchema, secretsLocalEncryptedConfigSchema, secretsConfigSchema, langfuseConfigSchema, rudderConfigSchema;
2586
2602
  var init_config_schema = __esm({
2587
2603
  "../packages/shared/dist/config-schema.js"() {
2588
2604
  "use strict";
2589
2605
  init_constants();
2606
+ DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES = 256 * 1024 * 1024;
2590
2607
  configMetaSchema = z27.object({
2591
2608
  version: z27.literal(1),
2592
2609
  updatedAt: z27.string(),
@@ -2600,6 +2617,7 @@ var init_config_schema = __esm({
2600
2617
  enabled: z27.boolean().default(true),
2601
2618
  intervalMinutes: z27.number().int().min(1).max(7 * 24 * 60).default(60),
2602
2619
  retentionDays: z27.number().int().min(1).max(3650).default(30),
2620
+ maxEstimatedBytes: z27.number().int().min(1).default(DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES),
2603
2621
  dir: z27.string().default("~/.rudder/instances/default/data/backups")
2604
2622
  });
2605
2623
  databaseConfigSchema = z27.object({
@@ -2611,6 +2629,7 @@ var init_config_schema = __esm({
2611
2629
  enabled: true,
2612
2630
  intervalMinutes: 60,
2613
2631
  retentionDays: 30,
2632
+ maxEstimatedBytes: DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES,
2614
2633
  dir: "~/.rudder/instances/default/data/backups"
2615
2634
  })
2616
2635
  });
@@ -3124,6 +3143,7 @@ async function promptDatabase(current) {
3124
3143
  enabled: true,
3125
3144
  intervalMinutes: 60,
3126
3145
  retentionDays: 30,
3146
+ maxEstimatedBytes: DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES,
3127
3147
  dir: defaultBackupDir
3128
3148
  }
3129
3149
  };
@@ -3232,6 +3252,20 @@ async function promptDatabase(current) {
3232
3252
  p.cancel("Setup cancelled.");
3233
3253
  process.exit(0);
3234
3254
  }
3255
+ const backupMaxEstimatedInput = await p.text({
3256
+ message: "Scheduled backup max database estimate (bytes)",
3257
+ defaultValue: String(base.backup.maxEstimatedBytes || DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES),
3258
+ placeholder: String(DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES),
3259
+ validate: (val) => {
3260
+ const n = Number(val);
3261
+ if (!Number.isInteger(n) || n < 1) return "Max estimate must be a positive integer byte count";
3262
+ return void 0;
3263
+ }
3264
+ });
3265
+ if (p.isCancel(backupMaxEstimatedInput)) {
3266
+ p.cancel("Setup cancelled.");
3267
+ process.exit(0);
3268
+ }
3235
3269
  return {
3236
3270
  mode,
3237
3271
  connectionString,
@@ -3241,6 +3275,7 @@ async function promptDatabase(current) {
3241
3275
  enabled: backupEnabled,
3242
3276
  intervalMinutes: Number(backupIntervalInput || "60"),
3243
3277
  retentionDays: Number(backupRetentionInput || "30"),
3278
+ maxEstimatedBytes: Number(backupMaxEstimatedInput || String(DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES)),
3244
3279
  dir: backupDirInput || defaultBackupDir
3245
3280
  }
3246
3281
  };
@@ -3248,6 +3283,7 @@ async function promptDatabase(current) {
3248
3283
  var init_database = __esm({
3249
3284
  "src/prompts/database.ts"() {
3250
3285
  "use strict";
3286
+ init_schema();
3251
3287
  init_home();
3252
3288
  }
3253
3289
  });
@@ -5455,6 +5491,18 @@ function parseNumberFromEnv(rawValue) {
5455
5491
  if (!Number.isFinite(parsed)) return null;
5456
5492
  return parsed;
5457
5493
  }
5494
+ function parseBytesFromEnv(rawValue) {
5495
+ const value = rawValue?.trim();
5496
+ if (!value) return null;
5497
+ const match = value.match(/^(\d+(?:\.\d+)?)\s*(b|kb|kib|mb|mib|gb|gib)?$/i);
5498
+ if (!match) return null;
5499
+ const amount = Number(match[1]);
5500
+ const unit = match[2]?.toLowerCase() ?? "b";
5501
+ const multiplier = unit === "gb" || unit === "gib" ? 1024 ** 3 : unit === "mb" || unit === "mib" ? 1024 ** 2 : unit === "kb" || unit === "kib" ? 1024 : 1;
5502
+ const parsed = Math.floor(amount * multiplier);
5503
+ if (!Number.isSafeInteger(parsed) || parsed < 1) return null;
5504
+ return parsed;
5505
+ }
5458
5506
  function parseEnumFromEnv(rawValue, allowedValues) {
5459
5507
  if (!rawValue) return null;
5460
5508
  return allowedValues.includes(rawValue) ? rawValue : null;
@@ -5500,6 +5548,7 @@ function quickstartDefaultsFromEnv() {
5500
5548
  1,
5501
5549
  parseNumberFromEnv(process.env.RUDDER_DB_BACKUP_RETENTION_DAYS) ?? 30
5502
5550
  );
5551
+ const databaseBackupMaxEstimatedBytes = parseBytesFromEnv(process.env.RUDDER_DB_BACKUP_MAX_ESTIMATED_BYTES) ?? DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES;
5503
5552
  const defaults = {
5504
5553
  database: {
5505
5554
  mode: databaseUrl ? "postgres" : "embedded-postgres",
@@ -5513,6 +5562,7 @@ function quickstartDefaultsFromEnv() {
5513
5562
  enabled: databaseBackupEnabled,
5514
5563
  intervalMinutes: databaseBackupIntervalMinutes,
5515
5564
  retentionDays: databaseBackupRetentionDays,
5565
+ maxEstimatedBytes: databaseBackupMaxEstimatedBytes,
5516
5566
  dir: resolvePathFromEnv(process.env.RUDDER_DB_BACKUP_DIR) ?? resolveDefaultBackupDir(instanceId)
5517
5567
  }
5518
5568
  },
@@ -5864,6 +5914,7 @@ var init_onboard = __esm({
5864
5914
  "RUDDER_DB_BACKUP_INTERVAL_MINUTES",
5865
5915
  "RUDDER_DB_BACKUP_RETENTION_DAYS",
5866
5916
  "RUDDER_DB_BACKUP_DIR",
5917
+ "RUDDER_DB_BACKUP_MAX_ESTIMATED_BYTES",
5867
5918
  "RUDDER_DEPLOYMENT_MODE",
5868
5919
  "RUDDER_DEPLOYMENT_EXPOSURE",
5869
5920
  "HOST",
@@ -6195,6 +6246,7 @@ function quoteShellValue(value) {
6195
6246
 
6196
6247
  // src/commands/configure.ts
6197
6248
  init_store();
6249
+ init_schema();
6198
6250
  init_secrets_key();
6199
6251
  init_database();
6200
6252
  init_llm();
@@ -6232,6 +6284,7 @@ function defaultConfig() {
6232
6284
  enabled: true,
6233
6285
  intervalMinutes: 60,
6234
6286
  retentionDays: 30,
6287
+ maxEstimatedBytes: DEFAULT_DATABASE_BACKUP_MAX_ESTIMATED_BYTES,
6235
6288
  dir: resolveDefaultBackupDir(instanceId)
6236
6289
  }
6237
6290
  },