@spinabot/brigade 1.13.0 → 1.14.0
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/convex/logs.d.ts +3 -3
- package/convex/memory.d.ts +21 -21
- package/convex/schema.d.ts +9 -9
- package/convex/skills.d.ts +3 -3
- package/dist/buildstamp.json +1 -1
- package/dist/cli/commands/config-cmd.d.ts +12 -19
- package/dist/cli/commands/config-cmd.d.ts.map +1 -1
- package/dist/cli/commands/config-cmd.js +14 -197
- package/dist/cli/commands/config-cmd.js.map +1 -1
- package/dist/core/agents-crud-ops.d.ts +15 -0
- package/dist/core/agents-crud-ops.d.ts.map +1 -0
- package/dist/core/agents-crud-ops.js +27 -0
- package/dist/core/agents-crud-ops.js.map +1 -0
- package/dist/core/agents-ops.d.ts +43 -0
- package/dist/core/agents-ops.d.ts.map +1 -0
- package/dist/core/agents-ops.js +117 -0
- package/dist/core/agents-ops.js.map +1 -0
- package/dist/core/channels-ops.d.ts +30 -0
- package/dist/core/channels-ops.d.ts.map +1 -0
- package/dist/core/channels-ops.js +52 -0
- package/dist/core/channels-ops.js.map +1 -0
- package/dist/core/config-ops.d.ts +77 -0
- package/dist/core/config-ops.d.ts.map +1 -0
- package/dist/core/config-ops.js +241 -0
- package/dist/core/config-ops.js.map +1 -0
- package/dist/core/exec-ops.d.ts +48 -0
- package/dist/core/exec-ops.d.ts.map +1 -0
- package/dist/core/exec-ops.js +101 -0
- package/dist/core/exec-ops.js.map +1 -0
- package/dist/core/integrations-ops.d.ts +25 -0
- package/dist/core/integrations-ops.d.ts.map +1 -0
- package/dist/core/integrations-ops.js +40 -0
- package/dist/core/integrations-ops.js.map +1 -0
- package/dist/core/memory-ops.d.ts +20 -0
- package/dist/core/memory-ops.d.ts.map +1 -0
- package/dist/core/memory-ops.js +40 -0
- package/dist/core/memory-ops.js.map +1 -0
- package/dist/core/pairing-ops.d.ts +33 -0
- package/dist/core/pairing-ops.d.ts.map +1 -0
- package/dist/core/pairing-ops.js +78 -0
- package/dist/core/pairing-ops.js.map +1 -0
- package/dist/core/provider-ops.d.ts +17 -0
- package/dist/core/provider-ops.d.ts.map +1 -0
- package/dist/core/provider-ops.js +29 -0
- package/dist/core/provider-ops.js.map +1 -0
- package/dist/core/server.d.ts.map +1 -1
- package/dist/core/server.js +91 -0
- package/dist/core/server.js.map +1 -1
- package/dist/core/sessions-ops.d.ts +25 -0
- package/dist/core/sessions-ops.d.ts.map +1 -0
- package/dist/core/sessions-ops.js +77 -0
- package/dist/core/sessions-ops.js.map +1 -0
- package/dist/core/skills-ops.d.ts +14 -0
- package/dist/core/skills-ops.d.ts.map +1 -0
- package/dist/core/skills-ops.js +28 -0
- package/dist/core/skills-ops.js.map +1 -0
- package/dist/protocol/methods.d.ts +478 -0
- package/dist/protocol/methods.d.ts.map +1 -1
- package/package.json +1 -1
package/convex/logs.d.ts
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
export declare const appendSessionEvent: import("convex/server").RegisteredMutation<"public", {
|
|
2
2
|
toolName?: string | undefined;
|
|
3
|
+
role?: string | undefined;
|
|
3
4
|
content?: ArrayBuffer | undefined;
|
|
4
5
|
args?: ArrayBuffer | undefined;
|
|
5
6
|
aborted?: boolean | undefined;
|
|
6
7
|
inner?: string | undefined;
|
|
7
8
|
delta?: string | undefined;
|
|
8
|
-
role?: string | undefined;
|
|
9
9
|
stopReason?: string | undefined;
|
|
10
10
|
errorMessage?: string | undefined;
|
|
11
11
|
toolCallId?: string | undefined;
|
|
@@ -33,12 +33,12 @@ export declare const readSessionEventTail: import("convex/server").RegisteredQue
|
|
|
33
33
|
_id: import("convex/values").GenericId<"sessionEvents">;
|
|
34
34
|
_creationTime: number;
|
|
35
35
|
toolName?: string | undefined;
|
|
36
|
+
role?: string | undefined;
|
|
36
37
|
content?: ArrayBuffer | undefined;
|
|
37
38
|
args?: ArrayBuffer | undefined;
|
|
38
39
|
aborted?: boolean | undefined;
|
|
39
40
|
inner?: string | undefined;
|
|
40
41
|
delta?: string | undefined;
|
|
41
|
-
role?: string | undefined;
|
|
42
42
|
stopReason?: string | undefined;
|
|
43
43
|
errorMessage?: string | undefined;
|
|
44
44
|
toolCallId?: string | undefined;
|
|
@@ -65,12 +65,12 @@ export declare const findLastError: import("convex/server").RegisteredQuery<"pub
|
|
|
65
65
|
_id: import("convex/values").GenericId<"sessionEvents">;
|
|
66
66
|
_creationTime: number;
|
|
67
67
|
toolName?: string | undefined;
|
|
68
|
+
role?: string | undefined;
|
|
68
69
|
content?: ArrayBuffer | undefined;
|
|
69
70
|
args?: ArrayBuffer | undefined;
|
|
70
71
|
aborted?: boolean | undefined;
|
|
71
72
|
inner?: string | undefined;
|
|
72
73
|
delta?: string | undefined;
|
|
73
|
-
role?: string | undefined;
|
|
74
74
|
stopReason?: string | undefined;
|
|
75
75
|
errorMessage?: string | undefined;
|
|
76
76
|
toolCallId?: string | undefined;
|
package/convex/memory.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export declare const listFacts: import("convex/server").RegisteredQuery<"public"
|
|
|
7
7
|
_creationTime: number;
|
|
8
8
|
metadata?: any;
|
|
9
9
|
status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
|
|
10
|
-
sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" |
|
|
10
|
+
sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
|
|
11
11
|
sourceTurn?: string | undefined;
|
|
12
12
|
supersedes?: string[] | undefined;
|
|
13
13
|
links?: {
|
|
@@ -30,11 +30,11 @@ export declare const listFacts: import("convex/server").RegisteredQuery<"public"
|
|
|
30
30
|
createdBySessionKey?: string | undefined;
|
|
31
31
|
createdByAccountId?: string | undefined;
|
|
32
32
|
createdAt: number;
|
|
33
|
-
memoryId: string;
|
|
34
33
|
content: ArrayBuffer;
|
|
34
|
+
memoryId: string;
|
|
35
35
|
segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
|
|
36
|
-
tier: "short" | "long" | "permanent";
|
|
37
36
|
importance: number;
|
|
37
|
+
tier: "short" | "long" | "permanent";
|
|
38
38
|
decayRate: number;
|
|
39
39
|
accessCount: number;
|
|
40
40
|
lastAccessedAt: number;
|
|
@@ -44,7 +44,7 @@ export declare const listFacts: import("convex/server").RegisteredQuery<"public"
|
|
|
44
44
|
export declare const writeFact: import("convex/server").RegisteredMutation<"public", {
|
|
45
45
|
metadata?: any;
|
|
46
46
|
status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
|
|
47
|
-
sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" |
|
|
47
|
+
sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
|
|
48
48
|
sourceTurn?: string | undefined;
|
|
49
49
|
supersedes?: string[] | undefined;
|
|
50
50
|
links?: {
|
|
@@ -66,11 +66,11 @@ export declare const writeFact: import("convex/server").RegisteredMutation<"publ
|
|
|
66
66
|
createdByConversationId?: string | undefined;
|
|
67
67
|
createdBySessionKey?: string | undefined;
|
|
68
68
|
createdByAccountId?: string | undefined;
|
|
69
|
-
memoryId: string;
|
|
70
69
|
content: ArrayBuffer;
|
|
70
|
+
memoryId: string;
|
|
71
71
|
segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
|
|
72
|
-
tier: "short" | "long" | "permanent";
|
|
73
72
|
importance: number;
|
|
73
|
+
tier: "short" | "long" | "permanent";
|
|
74
74
|
decayRate: number;
|
|
75
75
|
workspaceId: string;
|
|
76
76
|
}, Promise<{
|
|
@@ -78,7 +78,7 @@ export declare const writeFact: import("convex/server").RegisteredMutation<"publ
|
|
|
78
78
|
_creationTime: number;
|
|
79
79
|
metadata?: any;
|
|
80
80
|
status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
|
|
81
|
-
sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" |
|
|
81
|
+
sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
|
|
82
82
|
sourceTurn?: string | undefined;
|
|
83
83
|
supersedes?: string[] | undefined;
|
|
84
84
|
links?: {
|
|
@@ -101,11 +101,11 @@ export declare const writeFact: import("convex/server").RegisteredMutation<"publ
|
|
|
101
101
|
createdBySessionKey?: string | undefined;
|
|
102
102
|
createdByAccountId?: string | undefined;
|
|
103
103
|
createdAt: number;
|
|
104
|
-
memoryId: string;
|
|
105
104
|
content: ArrayBuffer;
|
|
105
|
+
memoryId: string;
|
|
106
106
|
segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
|
|
107
|
-
tier: "short" | "long" | "permanent";
|
|
108
107
|
importance: number;
|
|
108
|
+
tier: "short" | "long" | "permanent";
|
|
109
109
|
decayRate: number;
|
|
110
110
|
accessCount: number;
|
|
111
111
|
lastAccessedAt: number;
|
|
@@ -123,7 +123,7 @@ export declare const listAllFacts: import("convex/server").RegisteredQuery<"publ
|
|
|
123
123
|
_creationTime: number;
|
|
124
124
|
metadata?: any;
|
|
125
125
|
status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
|
|
126
|
-
sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" |
|
|
126
|
+
sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
|
|
127
127
|
sourceTurn?: string | undefined;
|
|
128
128
|
supersedes?: string[] | undefined;
|
|
129
129
|
links?: {
|
|
@@ -146,11 +146,11 @@ export declare const listAllFacts: import("convex/server").RegisteredQuery<"publ
|
|
|
146
146
|
createdBySessionKey?: string | undefined;
|
|
147
147
|
createdByAccountId?: string | undefined;
|
|
148
148
|
createdAt: number;
|
|
149
|
-
memoryId: string;
|
|
150
149
|
content: ArrayBuffer;
|
|
150
|
+
memoryId: string;
|
|
151
151
|
segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
|
|
152
|
-
tier: "short" | "long" | "permanent";
|
|
153
152
|
importance: number;
|
|
153
|
+
tier: "short" | "long" | "permanent";
|
|
154
154
|
decayRate: number;
|
|
155
155
|
accessCount: number;
|
|
156
156
|
lastAccessedAt: number;
|
|
@@ -163,7 +163,7 @@ export declare const listAllFacts: import("convex/server").RegisteredQuery<"publ
|
|
|
163
163
|
export declare const upsertFactRecord: import("convex/server").RegisteredMutation<"public", {
|
|
164
164
|
metadata?: any;
|
|
165
165
|
status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
|
|
166
|
-
sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" |
|
|
166
|
+
sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
|
|
167
167
|
sourceTurn?: string | undefined;
|
|
168
168
|
supersedes?: string[] | undefined;
|
|
169
169
|
links?: {
|
|
@@ -186,11 +186,11 @@ export declare const upsertFactRecord: import("convex/server").RegisteredMutatio
|
|
|
186
186
|
createdBySessionKey?: string | undefined;
|
|
187
187
|
createdByAccountId?: string | undefined;
|
|
188
188
|
createdAt: number;
|
|
189
|
-
memoryId: string;
|
|
190
189
|
content: ArrayBuffer;
|
|
190
|
+
memoryId: string;
|
|
191
191
|
segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
|
|
192
|
-
tier: "short" | "long" | "permanent";
|
|
193
192
|
importance: number;
|
|
193
|
+
tier: "short" | "long" | "permanent";
|
|
194
194
|
decayRate: number;
|
|
195
195
|
accessCount: number;
|
|
196
196
|
lastAccessedAt: number;
|
|
@@ -273,7 +273,7 @@ export declare const searchContent: import("convex/server").RegisteredQuery<"pub
|
|
|
273
273
|
_creationTime: number;
|
|
274
274
|
metadata?: any;
|
|
275
275
|
status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
|
|
276
|
-
sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" |
|
|
276
|
+
sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
|
|
277
277
|
sourceTurn?: string | undefined;
|
|
278
278
|
supersedes?: string[] | undefined;
|
|
279
279
|
links?: {
|
|
@@ -296,11 +296,11 @@ export declare const searchContent: import("convex/server").RegisteredQuery<"pub
|
|
|
296
296
|
createdBySessionKey?: string | undefined;
|
|
297
297
|
createdByAccountId?: string | undefined;
|
|
298
298
|
createdAt: number;
|
|
299
|
-
memoryId: string;
|
|
300
299
|
content: ArrayBuffer;
|
|
300
|
+
memoryId: string;
|
|
301
301
|
segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
|
|
302
|
-
tier: "short" | "long" | "permanent";
|
|
303
302
|
importance: number;
|
|
303
|
+
tier: "short" | "long" | "permanent";
|
|
304
304
|
decayRate: number;
|
|
305
305
|
accessCount: number;
|
|
306
306
|
lastAccessedAt: number;
|
|
@@ -317,7 +317,7 @@ export declare const findSimilar: import("convex/server").RegisteredQuery<"publi
|
|
|
317
317
|
_creationTime: number;
|
|
318
318
|
metadata?: any;
|
|
319
319
|
status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
|
|
320
|
-
sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" |
|
|
320
|
+
sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
|
|
321
321
|
sourceTurn?: string | undefined;
|
|
322
322
|
supersedes?: string[] | undefined;
|
|
323
323
|
links?: {
|
|
@@ -340,11 +340,11 @@ export declare const findSimilar: import("convex/server").RegisteredQuery<"publi
|
|
|
340
340
|
createdBySessionKey?: string | undefined;
|
|
341
341
|
createdByAccountId?: string | undefined;
|
|
342
342
|
createdAt: number;
|
|
343
|
-
memoryId: string;
|
|
344
343
|
content: ArrayBuffer;
|
|
344
|
+
memoryId: string;
|
|
345
345
|
segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
|
|
346
|
-
tier: "short" | "long" | "permanent";
|
|
347
346
|
importance: number;
|
|
347
|
+
tier: "short" | "long" | "permanent";
|
|
348
348
|
decayRate: number;
|
|
349
349
|
accessCount: number;
|
|
350
350
|
lastAccessedAt: number;
|
package/convex/schema.d.ts
CHANGED
|
@@ -135,7 +135,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
135
135
|
memoryFacts: import("convex/server").TableDefinition<import("convex/values").VObject<{
|
|
136
136
|
metadata?: any;
|
|
137
137
|
status?: "asserted" | "provisional" | "confirmed" | "disputed" | "retracted" | undefined;
|
|
138
|
-
sourceType?: "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" |
|
|
138
|
+
sourceType?: "dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined;
|
|
139
139
|
sourceTurn?: string | undefined;
|
|
140
140
|
supersedes?: string[] | undefined;
|
|
141
141
|
links?: {
|
|
@@ -158,11 +158,11 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
158
158
|
createdBySessionKey?: string | undefined;
|
|
159
159
|
createdByAccountId?: string | undefined;
|
|
160
160
|
createdAt: number;
|
|
161
|
-
memoryId: string;
|
|
162
161
|
content: ArrayBuffer;
|
|
162
|
+
memoryId: string;
|
|
163
163
|
segment: "project" | "context" | "identity" | "preference" | "correction" | "relationship" | "knowledge";
|
|
164
|
-
tier: "short" | "long" | "permanent";
|
|
165
164
|
importance: number;
|
|
165
|
+
tier: "short" | "long" | "permanent";
|
|
166
166
|
decayRate: number;
|
|
167
167
|
accessCount: number;
|
|
168
168
|
lastAccessedAt: number;
|
|
@@ -187,7 +187,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
187
187
|
createdByConversationId: import("convex/values").VString<string | undefined, "optional">;
|
|
188
188
|
createdBySessionKey: import("convex/values").VString<string | undefined, "optional">;
|
|
189
189
|
createdByAccountId: import("convex/values").VString<string | undefined, "optional">;
|
|
190
|
-
sourceType: import("convex/values").VUnion<"user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" |
|
|
190
|
+
sourceType: import("convex/values").VUnion<"dream" | "user_instruction" | "owner_message" | "channel_message" | "tool_output" | "retrieved_document" | "compaction" | "extraction" | undefined, [import("convex/values").VLiteral<"user_instruction", "required">, import("convex/values").VLiteral<"owner_message", "required">, import("convex/values").VLiteral<"channel_message", "required">, import("convex/values").VLiteral<"tool_output", "required">, import("convex/values").VLiteral<"retrieved_document", "required">, import("convex/values").VLiteral<"compaction", "required">, import("convex/values").VLiteral<"extraction", "required">, import("convex/values").VLiteral<"dream", "required">], "optional", never>;
|
|
191
191
|
links: import("convex/values").VArray<{
|
|
192
192
|
reason?: string | undefined;
|
|
193
193
|
strength?: number | undefined;
|
|
@@ -214,7 +214,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
214
214
|
subjectKey: import("convex/values").VString<string | undefined, "optional">;
|
|
215
215
|
metadata: import("convex/values").VAny<any, "optional", string>;
|
|
216
216
|
embedding: import("convex/values").VArray<number[] | undefined, import("convex/values").VFloat64<number, "required">, "optional">;
|
|
217
|
-
}, "required", "metadata" | "createdAt" | "status" | "
|
|
217
|
+
}, "required", "metadata" | "createdAt" | "status" | "content" | "memoryId" | "segment" | "importance" | "sourceType" | "tier" | "decayRate" | "accessCount" | "lastAccessedAt" | "sourceTurn" | "supersedes" | "lifecycle" | "links" | "validFrom" | "validTo" | "confidence" | "sourcePointers" | "embedding" | "modality" | "mediaPointer" | "subjectKey" | "workspaceId" | "createdByKind" | "createdByChannelId" | "createdByConversationId" | "createdBySessionKey" | "createdByAccountId" | `metadata.${string}`>, {
|
|
218
218
|
by_workspace_lifecycle_createdAt: ["workspaceId", "lifecycle", "createdAt", "_creationTime"];
|
|
219
219
|
by_workspace_memoryId: ["workspaceId", "memoryId", "_creationTime"];
|
|
220
220
|
by_workspace_segment_lifecycle: ["workspaceId", "segment", "lifecycle", "_creationTime"];
|
|
@@ -371,12 +371,12 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
371
371
|
}, {}, {}>;
|
|
372
372
|
sessionEvents: import("convex/server").TableDefinition<import("convex/values").VObject<{
|
|
373
373
|
toolName?: string | undefined;
|
|
374
|
+
role?: string | undefined;
|
|
374
375
|
content?: ArrayBuffer | undefined;
|
|
375
376
|
args?: ArrayBuffer | undefined;
|
|
376
377
|
aborted?: boolean | undefined;
|
|
377
378
|
inner?: string | undefined;
|
|
378
379
|
delta?: string | undefined;
|
|
379
|
-
role?: string | undefined;
|
|
380
380
|
stopReason?: string | undefined;
|
|
381
381
|
errorMessage?: string | undefined;
|
|
382
382
|
toolCallId?: string | undefined;
|
|
@@ -421,7 +421,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
421
421
|
messageCount: import("convex/values").VFloat64<number | undefined, "optional">;
|
|
422
422
|
success: import("convex/values").VBoolean<boolean | undefined, "optional">;
|
|
423
423
|
finalError: import("convex/values").VString<string | undefined, "optional">;
|
|
424
|
-
}, "required", "type" | "agentId" | "sessionKey" | "toolName" | "content" | "ts" | "args" | "aborted" | "inner" | "delta" | "
|
|
424
|
+
}, "required", "type" | "agentId" | "sessionKey" | "toolName" | "role" | "content" | "ts" | "args" | "aborted" | "inner" | "delta" | "stopReason" | "errorMessage" | "toolCallId" | "isError" | "result" | "attempt" | "maxAttempts" | "delayMs" | "success" | "finalError" | "willRetry" | "messageCount" | "day" | "ownerId">, {
|
|
425
425
|
by_owner_day: ["ownerId", "day", "_creationTime"];
|
|
426
426
|
by_owner_session: ["ownerId", "sessionKey", "ts", "_creationTime"];
|
|
427
427
|
by_owner_error: ["ownerId", "isError", "ts", "_creationTime"];
|
|
@@ -859,10 +859,10 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
859
859
|
source: "bundled" | "config" | "managed" | "personal" | "project" | "workspace";
|
|
860
860
|
description: string;
|
|
861
861
|
createdAt: number;
|
|
862
|
+
body: string;
|
|
862
863
|
ownerId: string;
|
|
863
864
|
updatedAt: number;
|
|
864
865
|
frontmatter: string;
|
|
865
|
-
body: string;
|
|
866
866
|
eligibility: {
|
|
867
867
|
os: string[];
|
|
868
868
|
requiresBins: string[];
|
|
@@ -895,7 +895,7 @@ declare const _default: import("convex/server").SchemaDefinition<{
|
|
|
895
895
|
disableModelInvocation: import("convex/values").VBoolean<boolean, "required">;
|
|
896
896
|
createdAt: import("convex/values").VFloat64<number, "required">;
|
|
897
897
|
updatedAt: import("convex/values").VFloat64<number, "required">;
|
|
898
|
-
}, "required", "agentId" | "name" | "source" | "description" | "createdAt" | "
|
|
898
|
+
}, "required", "agentId" | "name" | "source" | "description" | "createdAt" | "body" | "ownerId" | "updatedAt" | "frontmatter" | "eligibility" | "disableModelInvocation" | "eligibility.os" | "eligibility.requiresBins" | "eligibility.requiresAnyBins" | "eligibility.requiresEnv" | "eligibility.requiresConfig">, {
|
|
899
899
|
by_owner_name: ["ownerId", "name", "_creationTime"];
|
|
900
900
|
by_owner_scope_name: ["ownerId", "source", "agentId", "name", "_creationTime"];
|
|
901
901
|
by_owner_source: ["ownerId", "source", "_creationTime"];
|
package/convex/skills.d.ts
CHANGED
|
@@ -10,10 +10,10 @@ export declare const list: import("convex/server").RegisteredQuery<"public", {
|
|
|
10
10
|
source: "bundled" | "config" | "managed" | "personal" | "project" | "workspace";
|
|
11
11
|
description: string;
|
|
12
12
|
createdAt: number;
|
|
13
|
+
body: string;
|
|
13
14
|
ownerId: string;
|
|
14
15
|
updatedAt: number;
|
|
15
16
|
frontmatter: string;
|
|
16
|
-
body: string;
|
|
17
17
|
eligibility: {
|
|
18
18
|
os: string[];
|
|
19
19
|
requiresBins: string[];
|
|
@@ -34,10 +34,10 @@ export declare const get: import("convex/server").RegisteredQuery<"public", {
|
|
|
34
34
|
source: "bundled" | "config" | "managed" | "personal" | "project" | "workspace";
|
|
35
35
|
description: string;
|
|
36
36
|
createdAt: number;
|
|
37
|
+
body: string;
|
|
37
38
|
ownerId: string;
|
|
38
39
|
updatedAt: number;
|
|
39
40
|
frontmatter: string;
|
|
40
|
-
body: string;
|
|
41
41
|
eligibility: {
|
|
42
42
|
os: string[];
|
|
43
43
|
requiresBins: string[];
|
|
@@ -52,9 +52,9 @@ export declare const upsert: import("convex/server").RegisteredMutation<"public"
|
|
|
52
52
|
name: string;
|
|
53
53
|
source: "bundled" | "config" | "managed" | "personal" | "project" | "workspace";
|
|
54
54
|
description: string;
|
|
55
|
+
body: string;
|
|
55
56
|
ownerId: string;
|
|
56
57
|
frontmatter: string;
|
|
57
|
-
body: string;
|
|
58
58
|
eligibility: {
|
|
59
59
|
os: string[];
|
|
60
60
|
requiresBins: string[];
|
package/dist/buildstamp.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"builtAt":
|
|
1
|
+
{"builtAt":1782494628001,"head":"0bb31be61f20c7c0a1de17024a71ea185306c42a","version":"1.14.0"}
|
|
@@ -1,18 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `brigade config <list|get|set|unset|file>` — config CRUD
|
|
2
|
+
* `brigade config <list|get|set|unset|file|schema|validate>` — config CRUD
|
|
3
|
+
* over brigade.json.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
* - Atomic write +
|
|
12
|
-
* `writeBrigadeConfig` — no extra wiring needed.
|
|
5
|
+
* The path parsing, nested get/set/delete, value parsing, and secret redaction
|
|
6
|
+
* all live in `core/config-ops.ts` — SHARED with the `config.*` gateway RPCs so
|
|
7
|
+
* the CLI and a remote client mutate config (and redact secrets) identically.
|
|
8
|
+
* This file is the thin CLI shell: arg handling + stdout/exit-code formatting.
|
|
9
|
+
*
|
|
10
|
+
* - Dot-notation paths (+ escaped dots + bracket indices/keys).
|
|
11
|
+
* - JSON5 parsing for `set` values when --strict-json is off, raw-string fallback.
|
|
12
|
+
* - Atomic write + .bak rotation inherited from `saveConfig`.
|
|
13
13
|
* - Secrets redaction in `list`/`get`: any segment matching
|
|
14
|
-
* /^(key|apiKey|token|password|secret)$/i
|
|
15
|
-
* as `__BRIGADE_REDACTED__`.
|
|
14
|
+
* /^(key|apiKey|token|password|secret|...)$/i renders as `__BRIGADE_REDACTED__`.
|
|
16
15
|
*
|
|
17
16
|
* On-disk path: `~/.brigade/brigade.json` (resolved via BRIGADE_DIR).
|
|
18
17
|
*/
|
|
@@ -41,19 +40,13 @@ export declare function runConfigFile(opts?: {
|
|
|
41
40
|
/**
|
|
42
41
|
* Print the brigade.json TypeBox schema as JSON — useful for IDE /
|
|
43
42
|
* external-tool autocompletion against the live shape.
|
|
44
|
-
*
|
|
45
|
-
* The output is the in-memory TypeBox schema descriptor (with `type`,
|
|
46
|
-
* `properties`, `required`, etc.) — JSON-Schema-compatible enough to feed
|
|
47
|
-
* into a JSON-Schema-aware editor.
|
|
48
43
|
*/
|
|
49
44
|
export declare function runConfigSchema(_opts?: {}): Promise<number>;
|
|
50
45
|
/**
|
|
51
46
|
* Validate the on-disk brigade.json against the TypeBox schema. Reports a
|
|
52
47
|
* pass/fail line plus per-issue path + message when invalid.
|
|
53
48
|
*
|
|
54
|
-
* Exit codes:
|
|
55
|
-
* 0 — config is valid (or doesn't exist yet — empty file is benign)
|
|
56
|
-
* 1 — config is invalid; issues listed
|
|
49
|
+
* Exit codes: 0 — valid (or absent); 1 — invalid (issues listed).
|
|
57
50
|
*/
|
|
58
51
|
export declare function runConfigValidate(opts?: {
|
|
59
52
|
json?: boolean;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config-cmd.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"config-cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config-cmd.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAKH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAiBzC,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;CACf;AACD,MAAM,WAAW,gBAAgB;IAChC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,MAAM,CAAC,EAAE,OAAO,CAAC;CACjB;AACD,MAAM,WAAW,iBAAiB;IACjC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,QAAQ,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CAoBhG;AAED,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,gBAAqB,GAAG,OAAO,CAAC,MAAM,CAAC,CA8BlH;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAsBpG;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE,iBAAsB,GAAG,OAAO,CAAC,MAAM,CAAC,CAUjF;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAQlF;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,GAAE,EAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAGrE;AAED;;;;;GAKG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,GAAE;IAAE,IAAI,CAAC,EAAE,OAAO,CAAA;CAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAuCtF;AAID,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsD5D"}
|
|
@@ -1,202 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* `brigade config <list|get|set|unset|file>` — config CRUD
|
|
2
|
+
* `brigade config <list|get|set|unset|file|schema|validate>` — config CRUD
|
|
3
|
+
* over brigade.json.
|
|
3
4
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
* - Atomic write +
|
|
12
|
-
* `writeBrigadeConfig` — no extra wiring needed.
|
|
5
|
+
* The path parsing, nested get/set/delete, value parsing, and secret redaction
|
|
6
|
+
* all live in `core/config-ops.ts` — SHARED with the `config.*` gateway RPCs so
|
|
7
|
+
* the CLI and a remote client mutate config (and redact secrets) identically.
|
|
8
|
+
* This file is the thin CLI shell: arg handling + stdout/exit-code formatting.
|
|
9
|
+
*
|
|
10
|
+
* - Dot-notation paths (+ escaped dots + bracket indices/keys).
|
|
11
|
+
* - JSON5 parsing for `set` values when --strict-json is off, raw-string fallback.
|
|
12
|
+
* - Atomic write + .bak rotation inherited from `saveConfig`.
|
|
13
13
|
* - Secrets redaction in `list`/`get`: any segment matching
|
|
14
|
-
* /^(key|apiKey|token|password|secret)$/i
|
|
15
|
-
* as `__BRIGADE_REDACTED__`.
|
|
14
|
+
* /^(key|apiKey|token|password|secret|...)$/i renders as `__BRIGADE_REDACTED__`.
|
|
16
15
|
*
|
|
17
16
|
* On-disk path: `~/.brigade/brigade.json` (resolved via BRIGADE_DIR).
|
|
18
17
|
*/
|
|
19
18
|
import * as path from "node:path";
|
|
20
19
|
import chalk from "chalk";
|
|
21
|
-
import JSON5 from "json5";
|
|
22
20
|
import { BrigadeConfigSchema, BRIGADE_CONFIG_FILENAME, collectBrigadeConfigErrors, } from "../../core/brigade-config.js";
|
|
23
21
|
import { BRIGADE_DIR, loadConfig, saveConfig } from "../../core/config.js";
|
|
24
|
-
|
|
25
|
-
// Case-insensitive match — segments that smell secret get their VALUE redacted
|
|
26
|
-
// in `list` and `get` output. The actual on-disk file is unchanged.
|
|
27
|
-
const SENSITIVE_SEGMENT = /^(key|apikey|token|secret|password|refreshtoken|accesstoken)$/i;
|
|
28
|
-
/* ───────────────────────── path helpers ───────────────────────── */
|
|
29
|
-
/**
|
|
30
|
-
* Parse a config path into segments. Supports:
|
|
31
|
-
*
|
|
32
|
-
* - dot-notation: `agents.defaults.provider`
|
|
33
|
-
* - escaped dot: `keys.foo\.bar` → ["keys", "foo.bar"]
|
|
34
|
-
* - bracket array index: `agents.fallbacks[0]` → ["agents", "fallbacks", "0"]
|
|
35
|
-
* - bracket literal key: `secrets.providers["my.vault"]` → ["secrets", "providers", "my.vault"]
|
|
36
|
-
*
|
|
37
|
-
* Bracket support is the genuine ergonomic win (operators editing array
|
|
38
|
-
* slots in `agents.defaults.model.fallbacks[]` shouldn't have to fall
|
|
39
|
-
* through to `--strict-json` whole-array overwrites).
|
|
40
|
-
*/
|
|
41
|
-
function parsePath(raw) {
|
|
42
|
-
const trimmed = raw.trim();
|
|
43
|
-
if (trimmed.length === 0) {
|
|
44
|
-
throw new Error("config path is empty");
|
|
45
|
-
}
|
|
46
|
-
const segments = [];
|
|
47
|
-
let buf = "";
|
|
48
|
-
for (let i = 0; i < trimmed.length; i++) {
|
|
49
|
-
const ch = trimmed[i];
|
|
50
|
-
// Escape a literal dot inside a key.
|
|
51
|
-
if (ch === "\\" && trimmed[i + 1] === ".") {
|
|
52
|
-
buf += ".";
|
|
53
|
-
i++;
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
// Dot separator.
|
|
57
|
-
if (ch === ".") {
|
|
58
|
-
if (buf.length === 0) {
|
|
59
|
-
throw new Error(`empty segment in config path "${raw}"`);
|
|
60
|
-
}
|
|
61
|
-
segments.push(buf);
|
|
62
|
-
buf = "";
|
|
63
|
-
continue;
|
|
64
|
-
}
|
|
65
|
-
// Bracket: either array index `[0]` or literal key `["foo.bar"]`.
|
|
66
|
-
if (ch === "[") {
|
|
67
|
-
if (buf.length > 0) {
|
|
68
|
-
segments.push(buf);
|
|
69
|
-
buf = "";
|
|
70
|
-
}
|
|
71
|
-
const close = trimmed.indexOf("]", i);
|
|
72
|
-
if (close === -1) {
|
|
73
|
-
throw new Error(`unclosed "[" in config path "${raw}"`);
|
|
74
|
-
}
|
|
75
|
-
let inside = trimmed.slice(i + 1, close).trim();
|
|
76
|
-
// Strip optional surrounding quotes — accept both `[0]` and `["key"]`.
|
|
77
|
-
if ((inside.startsWith('"') && inside.endsWith('"')) ||
|
|
78
|
-
(inside.startsWith("'") && inside.endsWith("'"))) {
|
|
79
|
-
inside = inside.slice(1, -1);
|
|
80
|
-
}
|
|
81
|
-
if (inside.length === 0) {
|
|
82
|
-
throw new Error(`empty bracket segment in config path "${raw}"`);
|
|
83
|
-
}
|
|
84
|
-
segments.push(inside);
|
|
85
|
-
i = close;
|
|
86
|
-
continue;
|
|
87
|
-
}
|
|
88
|
-
buf += ch;
|
|
89
|
-
}
|
|
90
|
-
if (buf.length > 0)
|
|
91
|
-
segments.push(buf);
|
|
92
|
-
if (segments.length === 0) {
|
|
93
|
-
throw new Error(`unable to parse config path "${raw}"`);
|
|
94
|
-
}
|
|
95
|
-
return segments;
|
|
96
|
-
}
|
|
97
|
-
/** True iff the segment looks like a non-negative integer (array index). */
|
|
98
|
-
function isIndexSegment(seg) {
|
|
99
|
-
return /^[0-9]+$/.test(seg);
|
|
100
|
-
}
|
|
101
|
-
function getNested(root, segments) {
|
|
102
|
-
let cur = root;
|
|
103
|
-
for (const seg of segments) {
|
|
104
|
-
if (cur === null || cur === undefined)
|
|
105
|
-
return undefined;
|
|
106
|
-
if (Array.isArray(cur) && isIndexSegment(seg)) {
|
|
107
|
-
cur = cur[Number(seg)];
|
|
108
|
-
continue;
|
|
109
|
-
}
|
|
110
|
-
if (typeof cur !== "object")
|
|
111
|
-
return undefined;
|
|
112
|
-
cur = cur[seg];
|
|
113
|
-
}
|
|
114
|
-
return cur;
|
|
115
|
-
}
|
|
116
|
-
function setNested(root, segments, value) {
|
|
117
|
-
let cur = root;
|
|
118
|
-
for (let i = 0; i < segments.length - 1; i++) {
|
|
119
|
-
const seg = segments[i] ?? "";
|
|
120
|
-
const nextSeg = segments[i + 1] ?? "";
|
|
121
|
-
const wantArray = isIndexSegment(nextSeg);
|
|
122
|
-
const existing = Array.isArray(cur) && isIndexSegment(seg) ? cur[Number(seg)] : cur[seg];
|
|
123
|
-
if (existing === undefined || existing === null || typeof existing !== "object") {
|
|
124
|
-
// Create container in the right shape for the NEXT segment.
|
|
125
|
-
const fresh = wantArray ? [] : {};
|
|
126
|
-
if (Array.isArray(cur) && isIndexSegment(seg)) {
|
|
127
|
-
cur[Number(seg)] = fresh;
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
cur[seg] = fresh;
|
|
131
|
-
}
|
|
132
|
-
cur = fresh;
|
|
133
|
-
}
|
|
134
|
-
else {
|
|
135
|
-
cur = Array.isArray(cur) && isIndexSegment(seg) ? cur[Number(seg)] : cur[seg];
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
const tail = segments[segments.length - 1] ?? "";
|
|
139
|
-
if (Array.isArray(cur) && isIndexSegment(tail)) {
|
|
140
|
-
cur[Number(tail)] = value;
|
|
141
|
-
}
|
|
142
|
-
else {
|
|
143
|
-
cur[tail] = value;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
function deleteNested(root, segments) {
|
|
147
|
-
let cur = root;
|
|
148
|
-
for (let i = 0; i < segments.length - 1; i++) {
|
|
149
|
-
const seg = segments[i] ?? "";
|
|
150
|
-
const next = Array.isArray(cur) && isIndexSegment(seg) ? cur[Number(seg)] : cur?.[seg];
|
|
151
|
-
if (next === undefined || next === null || typeof next !== "object")
|
|
152
|
-
return false;
|
|
153
|
-
cur = next;
|
|
154
|
-
}
|
|
155
|
-
const tail = segments[segments.length - 1] ?? "";
|
|
156
|
-
if (Array.isArray(cur) && isIndexSegment(tail)) {
|
|
157
|
-
const idx = Number(tail);
|
|
158
|
-
if (idx < cur.length) {
|
|
159
|
-
cur.splice(idx, 1); // shift down — matches array-mutation semantics
|
|
160
|
-
return true;
|
|
161
|
-
}
|
|
162
|
-
return false;
|
|
163
|
-
}
|
|
164
|
-
if (cur && typeof cur === "object" && tail in cur) {
|
|
165
|
-
delete cur[tail];
|
|
166
|
-
return true;
|
|
167
|
-
}
|
|
168
|
-
return false;
|
|
169
|
-
}
|
|
170
|
-
/* ───────────────────────── value parsing ─────────────────────── */
|
|
171
|
-
function parseValue(raw, opts = {}) {
|
|
172
|
-
if (opts.strictJson) {
|
|
173
|
-
return JSON.parse(raw);
|
|
174
|
-
}
|
|
175
|
-
try {
|
|
176
|
-
return JSON5.parse(raw);
|
|
177
|
-
}
|
|
178
|
-
catch {
|
|
179
|
-
// Fall through to raw string when JSON5 can't parse it.
|
|
180
|
-
return raw;
|
|
181
|
-
}
|
|
182
|
-
}
|
|
183
|
-
/* ───────────────────────── redaction ─────────────────────────── */
|
|
184
|
-
function redactDeep(value, segmentsParent = []) {
|
|
185
|
-
if (value === null || typeof value !== "object")
|
|
186
|
-
return value;
|
|
187
|
-
if (Array.isArray(value))
|
|
188
|
-
return value.map((v) => redactDeep(v, segmentsParent));
|
|
189
|
-
const out = {};
|
|
190
|
-
for (const [k, v] of Object.entries(value)) {
|
|
191
|
-
if (SENSITIVE_SEGMENT.test(k) && typeof v === "string" && v.length > 0) {
|
|
192
|
-
out[k] = REDACTED_SENTINEL;
|
|
193
|
-
}
|
|
194
|
-
else {
|
|
195
|
-
out[k] = redactDeep(v, [...segmentsParent, k]);
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
return out;
|
|
199
|
-
}
|
|
22
|
+
import { deleteNested, getNested, parseConfigValue, parsePath, redactDeep, setNested, } from "../../core/config-ops.js";
|
|
200
23
|
/* ───────────────────────── runtime ───────────────────────────── */
|
|
201
24
|
export async function runConfigGet(rawPath, opts = {}) {
|
|
202
25
|
const cfg = loadConfig();
|
|
@@ -224,7 +47,7 @@ export async function runConfigSet(rawPath, rawValue, opts = {}) {
|
|
|
224
47
|
const segments = parsePath(rawPath);
|
|
225
48
|
let parsed;
|
|
226
49
|
try {
|
|
227
|
-
parsed =
|
|
50
|
+
parsed = parseConfigValue(rawValue, { strictJson: opts.strictJson });
|
|
228
51
|
}
|
|
229
52
|
catch (err) {
|
|
230
53
|
process.stderr.write(`brigade config: failed to parse value: ${err.message}\n`);
|
|
@@ -294,10 +117,6 @@ export async function runConfigFile(opts = {}) {
|
|
|
294
117
|
/**
|
|
295
118
|
* Print the brigade.json TypeBox schema as JSON — useful for IDE /
|
|
296
119
|
* external-tool autocompletion against the live shape.
|
|
297
|
-
*
|
|
298
|
-
* The output is the in-memory TypeBox schema descriptor (with `type`,
|
|
299
|
-
* `properties`, `required`, etc.) — JSON-Schema-compatible enough to feed
|
|
300
|
-
* into a JSON-Schema-aware editor.
|
|
301
120
|
*/
|
|
302
121
|
export async function runConfigSchema(_opts = {}) {
|
|
303
122
|
process.stdout.write(`${JSON.stringify(BrigadeConfigSchema, null, 2)}\n`);
|
|
@@ -307,9 +126,7 @@ export async function runConfigSchema(_opts = {}) {
|
|
|
307
126
|
* Validate the on-disk brigade.json against the TypeBox schema. Reports a
|
|
308
127
|
* pass/fail line plus per-issue path + message when invalid.
|
|
309
128
|
*
|
|
310
|
-
* Exit codes:
|
|
311
|
-
* 0 — config is valid (or doesn't exist yet — empty file is benign)
|
|
312
|
-
* 1 — config is invalid; issues listed
|
|
129
|
+
* Exit codes: 0 — valid (or absent); 1 — invalid (issues listed).
|
|
313
130
|
*/
|
|
314
131
|
export async function runConfigValidate(opts = {}) {
|
|
315
132
|
const filePath = path.join(BRIGADE_DIR, BRIGADE_CONFIG_FILENAME);
|