@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 +48 -47
- package/dist/index.js +58 -5
- package/dist/index.js.map +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,76 +1,76 @@
|
|
|
1
1
|
# Rudder
|
|
2
2
|
|
|
3
|
-
>
|
|
3
|
+
> Build your self-improving Agent Team.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
Agents that think, build, play, and learn from real work.
|
|
6
6
|
|
|
7
|
-
Rudder
|
|
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
|
|
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
|
|
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
|
-
|
|
13
|
+
## The Work Loop
|
|
16
14
|
|
|
17
|
-
Rudder
|
|
15
|
+
Rudder is designed around the loop that makes agent work compound:
|
|
18
16
|
|
|
19
|
-
|
|
17
|
+
```text
|
|
18
|
+
Goal -> Issue -> Agent run -> Review -> Feedback -> Learning -> Better future runs
|
|
19
|
+
```
|
|
20
20
|
|
|
21
|
-
|
|
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
|
-
|
|
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
|
-
|
|
25
|
+
## The Design Idea
|
|
26
26
|
|
|
27
|
-
|
|
27
|
+
The most useful way to work with agents is closer to the way humans coordinate with each other.
|
|
28
28
|
|
|
29
|
-
|
|
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
|
-
|
|
31
|
+
Rudder turns those coordination patterns into product primitives for agent teams:
|
|
32
32
|
|
|
33
|
-

|
|
34
34
|
|
|
35
|
-

|
|
36
36
|
|
|
37
|
-

|
|
38
38
|
|
|
39
|
+

|
|
39
40
|
|
|
41
|
+

|
|
40
42
|
|
|
41
|
-
|
|
43
|
+

|
|
42
44
|
|
|
43
|
-
|
|
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
|
+

|
|
48
46
|
|
|
49
|
-
|
|
47
|
+

|
|
50
48
|
|
|
51
|
-
|
|
49
|
+

|
|
52
50
|
|
|
53
|
-
|
|
51
|
+

|
|
54
52
|
|
|
55
|
-
|
|
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
|
|
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
|
-
|
|
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
|
},
|