@rudderhq/cli 0.2.7-canary.2 → 0.2.7-canary.21
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 +51 -50
- package/dist/index.js +58 -2
- 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 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.
|
|
114
|
-
4.
|
|
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
|
|
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
|
},
|