@lumenflow/core 2.4.0 → 2.5.1
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/dist/arg-parser.d.ts +7 -0
- package/dist/arg-parser.js +11 -1
- package/dist/lane-checker.d.ts +29 -2
- package/dist/lane-checker.js +176 -20
- package/dist/lane-lock.d.ts +8 -0
- package/dist/lane-lock.js +21 -0
- package/dist/lumenflow-config-schema.d.ts +220 -0
- package/dist/lumenflow-config-schema.js +180 -0
- package/dist/lumenflow-config.d.ts +3 -1
- package/dist/lumenflow-config.js +9 -0
- package/dist/micro-worktree.d.ts +169 -4
- package/dist/micro-worktree.js +333 -26
- package/dist/wu-constants.d.ts +8 -0
- package/dist/wu-constants.js +8 -0
- package/dist/wu-done-concurrent-merge.d.ts +13 -0
- package/dist/wu-done-concurrent-merge.js +41 -1
- package/dist/wu-done-metadata.js +3 -3
- package/dist/wu-paths.d.ts +20 -0
- package/dist/wu-paths.js +10 -0
- package/dist/wu-preflight-validators.d.ts +30 -0
- package/dist/wu-preflight-validators.js +6 -2
- package/dist/wu-transaction-collectors.d.ts +13 -0
- package/dist/wu-transaction-collectors.js +20 -32
- package/package.json +3 -2
|
@@ -7,6 +7,30 @@
|
|
|
7
7
|
* @module lumenflow-config-schema
|
|
8
8
|
*/
|
|
9
9
|
import { z } from 'zod';
|
|
10
|
+
/**
|
|
11
|
+
* WU-1325: Lock policy for lane-level WIP enforcement
|
|
12
|
+
*
|
|
13
|
+
* Controls how lane locks behave:
|
|
14
|
+
* - 'all' (default): Lock acquired on claim, held through block, released on done
|
|
15
|
+
* - 'active': Lock acquired on claim, released on block, re-acquired on unblock
|
|
16
|
+
* - 'none': No lock files created, WIP checking disabled
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```yaml
|
|
20
|
+
* lanes:
|
|
21
|
+
* definitions:
|
|
22
|
+
* - name: 'Content: Documentation'
|
|
23
|
+
* wip_limit: 4
|
|
24
|
+
* lock_policy: 'none' # Docs don't need lock coordination
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare const LockPolicySchema: z.ZodDefault<z.ZodEnum<{
|
|
28
|
+
none: "none";
|
|
29
|
+
all: "all";
|
|
30
|
+
active: "active";
|
|
31
|
+
}>>;
|
|
32
|
+
/** WU-1325: TypeScript type for lock policy */
|
|
33
|
+
export type LockPolicy = z.infer<typeof LockPolicySchema>;
|
|
10
34
|
/**
|
|
11
35
|
* Event archival configuration (WU-1207)
|
|
12
36
|
*
|
|
@@ -36,6 +60,8 @@ export declare const DirectoriesSchema: z.ZodObject<{
|
|
|
36
60
|
skillsDir: z.ZodDefault<z.ZodString>;
|
|
37
61
|
agentsDir: z.ZodDefault<z.ZodString>;
|
|
38
62
|
plansDir: z.ZodDefault<z.ZodString>;
|
|
63
|
+
templatesDir: z.ZodDefault<z.ZodString>;
|
|
64
|
+
onboardingDir: z.ZodDefault<z.ZodString>;
|
|
39
65
|
}, z.core.$strip>;
|
|
40
66
|
/**
|
|
41
67
|
* Beacon paths configuration (.lumenflow directory structure)
|
|
@@ -56,6 +82,19 @@ export declare const BeaconPathsSchema: z.ZodObject<{
|
|
|
56
82
|
keepArchives: z.ZodDefault<z.ZodBoolean>;
|
|
57
83
|
}, z.core.$strip>>;
|
|
58
84
|
}, z.core.$strip>;
|
|
85
|
+
/**
|
|
86
|
+
* WU-1332: Push retry configuration for micro-worktree operations
|
|
87
|
+
*
|
|
88
|
+
* When non-fast-forward push errors occur (origin/main moved during operation),
|
|
89
|
+
* retry with exponential backoff. Uses p-retry for robust retry behavior.
|
|
90
|
+
*/
|
|
91
|
+
export declare const PushRetryConfigSchema: z.ZodObject<{
|
|
92
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
93
|
+
retries: z.ZodDefault<z.ZodNumber>;
|
|
94
|
+
min_delay_ms: z.ZodDefault<z.ZodNumber>;
|
|
95
|
+
max_delay_ms: z.ZodDefault<z.ZodNumber>;
|
|
96
|
+
jitter: z.ZodDefault<z.ZodBoolean>;
|
|
97
|
+
}, z.core.$strip>;
|
|
59
98
|
/**
|
|
60
99
|
* Git configuration
|
|
61
100
|
*/
|
|
@@ -72,6 +111,13 @@ export declare const GitConfigSchema: z.ZodObject<{
|
|
|
72
111
|
agentBranchPatterns: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
73
112
|
agentBranchPatternsOverride: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
74
113
|
disableAgentPatternRegistry: z.ZodDefault<z.ZodBoolean>;
|
|
114
|
+
push_retry: z.ZodDefault<z.ZodObject<{
|
|
115
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
116
|
+
retries: z.ZodDefault<z.ZodNumber>;
|
|
117
|
+
min_delay_ms: z.ZodDefault<z.ZodNumber>;
|
|
118
|
+
max_delay_ms: z.ZodDefault<z.ZodNumber>;
|
|
119
|
+
jitter: z.ZodDefault<z.ZodBoolean>;
|
|
120
|
+
}, z.core.$strip>>;
|
|
75
121
|
}, z.core.$strip>;
|
|
76
122
|
/**
|
|
77
123
|
* WU (Work Unit) configuration
|
|
@@ -311,6 +357,92 @@ export declare const TelemetryConfigSchema: z.ZodObject<{
|
|
|
311
357
|
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
312
358
|
}, z.core.$strip>>;
|
|
313
359
|
}, z.core.$strip>;
|
|
360
|
+
/**
|
|
361
|
+
* WU-1345: Lane enforcement configuration schema
|
|
362
|
+
*
|
|
363
|
+
* Controls how lane format validation behaves.
|
|
364
|
+
*/
|
|
365
|
+
export declare const LanesEnforcementSchema: z.ZodObject<{
|
|
366
|
+
require_parent: z.ZodDefault<z.ZodBoolean>;
|
|
367
|
+
allow_custom: z.ZodDefault<z.ZodBoolean>;
|
|
368
|
+
}, z.core.$strip>;
|
|
369
|
+
/**
|
|
370
|
+
* WU-1322: Lane definition schema for .lumenflow.config.yaml
|
|
371
|
+
*
|
|
372
|
+
* Extends the existing lane configuration with lock_policy field.
|
|
373
|
+
* Compatible with WU-1016 (wip_limit) and WU-1187 (wip_justification).
|
|
374
|
+
*/
|
|
375
|
+
export declare const LaneDefinitionSchema: z.ZodObject<{
|
|
376
|
+
name: z.ZodString;
|
|
377
|
+
wip_limit: z.ZodOptional<z.ZodNumber>;
|
|
378
|
+
wip_justification: z.ZodOptional<z.ZodString>;
|
|
379
|
+
lock_policy: z.ZodDefault<z.ZodDefault<z.ZodEnum<{
|
|
380
|
+
none: "none";
|
|
381
|
+
all: "all";
|
|
382
|
+
active: "active";
|
|
383
|
+
}>>>;
|
|
384
|
+
code_paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
385
|
+
}, z.core.$strip>;
|
|
386
|
+
/**
|
|
387
|
+
* WU-1345: Complete lanes configuration schema
|
|
388
|
+
*
|
|
389
|
+
* Supports three formats:
|
|
390
|
+
* 1. definitions array (recommended)
|
|
391
|
+
* 2. engineering + business arrays (legacy/alternate)
|
|
392
|
+
* 3. flat array (simple format - parsed as definitions)
|
|
393
|
+
*
|
|
394
|
+
* @example
|
|
395
|
+
* ```yaml
|
|
396
|
+
* lanes:
|
|
397
|
+
* enforcement:
|
|
398
|
+
* require_parent: true
|
|
399
|
+
* allow_custom: false
|
|
400
|
+
* definitions:
|
|
401
|
+
* - name: 'Framework: Core'
|
|
402
|
+
* wip_limit: 1
|
|
403
|
+
* code_paths:
|
|
404
|
+
* - 'packages/@lumenflow/core/**'
|
|
405
|
+
* ```
|
|
406
|
+
*/
|
|
407
|
+
export declare const LanesConfigSchema: z.ZodObject<{
|
|
408
|
+
enforcement: z.ZodOptional<z.ZodObject<{
|
|
409
|
+
require_parent: z.ZodDefault<z.ZodBoolean>;
|
|
410
|
+
allow_custom: z.ZodDefault<z.ZodBoolean>;
|
|
411
|
+
}, z.core.$strip>>;
|
|
412
|
+
definitions: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
413
|
+
name: z.ZodString;
|
|
414
|
+
wip_limit: z.ZodOptional<z.ZodNumber>;
|
|
415
|
+
wip_justification: z.ZodOptional<z.ZodString>;
|
|
416
|
+
lock_policy: z.ZodDefault<z.ZodDefault<z.ZodEnum<{
|
|
417
|
+
none: "none";
|
|
418
|
+
all: "all";
|
|
419
|
+
active: "active";
|
|
420
|
+
}>>>;
|
|
421
|
+
code_paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
422
|
+
}, z.core.$strip>>>;
|
|
423
|
+
engineering: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
424
|
+
name: z.ZodString;
|
|
425
|
+
wip_limit: z.ZodOptional<z.ZodNumber>;
|
|
426
|
+
wip_justification: z.ZodOptional<z.ZodString>;
|
|
427
|
+
lock_policy: z.ZodDefault<z.ZodDefault<z.ZodEnum<{
|
|
428
|
+
none: "none";
|
|
429
|
+
all: "all";
|
|
430
|
+
active: "active";
|
|
431
|
+
}>>>;
|
|
432
|
+
code_paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
433
|
+
}, z.core.$strip>>>;
|
|
434
|
+
business: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
435
|
+
name: z.ZodString;
|
|
436
|
+
wip_limit: z.ZodOptional<z.ZodNumber>;
|
|
437
|
+
wip_justification: z.ZodOptional<z.ZodString>;
|
|
438
|
+
lock_policy: z.ZodDefault<z.ZodDefault<z.ZodEnum<{
|
|
439
|
+
none: "none";
|
|
440
|
+
all: "all";
|
|
441
|
+
active: "active";
|
|
442
|
+
}>>>;
|
|
443
|
+
code_paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
444
|
+
}, z.core.$strip>>>;
|
|
445
|
+
}, z.core.$strip>;
|
|
314
446
|
/**
|
|
315
447
|
* Complete LumenFlow configuration schema
|
|
316
448
|
*/
|
|
@@ -332,6 +464,8 @@ export declare const LumenFlowConfigSchema: z.ZodObject<{
|
|
|
332
464
|
skillsDir: z.ZodDefault<z.ZodString>;
|
|
333
465
|
agentsDir: z.ZodDefault<z.ZodString>;
|
|
334
466
|
plansDir: z.ZodDefault<z.ZodString>;
|
|
467
|
+
templatesDir: z.ZodDefault<z.ZodString>;
|
|
468
|
+
onboardingDir: z.ZodDefault<z.ZodString>;
|
|
335
469
|
}, z.core.$strip>>;
|
|
336
470
|
beacon: z.ZodDefault<z.ZodObject<{
|
|
337
471
|
base: z.ZodDefault<z.ZodString>;
|
|
@@ -362,6 +496,13 @@ export declare const LumenFlowConfigSchema: z.ZodObject<{
|
|
|
362
496
|
agentBranchPatterns: z.ZodDefault<z.ZodArray<z.ZodString>>;
|
|
363
497
|
agentBranchPatternsOverride: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
364
498
|
disableAgentPatternRegistry: z.ZodDefault<z.ZodBoolean>;
|
|
499
|
+
push_retry: z.ZodDefault<z.ZodObject<{
|
|
500
|
+
enabled: z.ZodDefault<z.ZodBoolean>;
|
|
501
|
+
retries: z.ZodDefault<z.ZodNumber>;
|
|
502
|
+
min_delay_ms: z.ZodDefault<z.ZodNumber>;
|
|
503
|
+
max_delay_ms: z.ZodDefault<z.ZodNumber>;
|
|
504
|
+
jitter: z.ZodDefault<z.ZodBoolean>;
|
|
505
|
+
}, z.core.$strip>>;
|
|
365
506
|
}, z.core.$strip>>;
|
|
366
507
|
wu: z.ZodDefault<z.ZodObject<{
|
|
367
508
|
idPattern: z.ZodDefault<z.ZodString>;
|
|
@@ -499,12 +640,52 @@ export declare const LumenFlowConfigSchema: z.ZodObject<{
|
|
|
499
640
|
}>>;
|
|
500
641
|
}, z.core.$strip>>;
|
|
501
642
|
}, z.core.$strip>>;
|
|
643
|
+
lanes: z.ZodOptional<z.ZodObject<{
|
|
644
|
+
enforcement: z.ZodOptional<z.ZodObject<{
|
|
645
|
+
require_parent: z.ZodDefault<z.ZodBoolean>;
|
|
646
|
+
allow_custom: z.ZodDefault<z.ZodBoolean>;
|
|
647
|
+
}, z.core.$strip>>;
|
|
648
|
+
definitions: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
649
|
+
name: z.ZodString;
|
|
650
|
+
wip_limit: z.ZodOptional<z.ZodNumber>;
|
|
651
|
+
wip_justification: z.ZodOptional<z.ZodString>;
|
|
652
|
+
lock_policy: z.ZodDefault<z.ZodDefault<z.ZodEnum<{
|
|
653
|
+
none: "none";
|
|
654
|
+
all: "all";
|
|
655
|
+
active: "active";
|
|
656
|
+
}>>>;
|
|
657
|
+
code_paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
658
|
+
}, z.core.$strip>>>;
|
|
659
|
+
engineering: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
660
|
+
name: z.ZodString;
|
|
661
|
+
wip_limit: z.ZodOptional<z.ZodNumber>;
|
|
662
|
+
wip_justification: z.ZodOptional<z.ZodString>;
|
|
663
|
+
lock_policy: z.ZodDefault<z.ZodDefault<z.ZodEnum<{
|
|
664
|
+
none: "none";
|
|
665
|
+
all: "all";
|
|
666
|
+
active: "active";
|
|
667
|
+
}>>>;
|
|
668
|
+
code_paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
669
|
+
}, z.core.$strip>>>;
|
|
670
|
+
business: z.ZodOptional<z.ZodArray<z.ZodObject<{
|
|
671
|
+
name: z.ZodString;
|
|
672
|
+
wip_limit: z.ZodOptional<z.ZodNumber>;
|
|
673
|
+
wip_justification: z.ZodOptional<z.ZodString>;
|
|
674
|
+
lock_policy: z.ZodDefault<z.ZodDefault<z.ZodEnum<{
|
|
675
|
+
none: "none";
|
|
676
|
+
all: "all";
|
|
677
|
+
active: "active";
|
|
678
|
+
}>>>;
|
|
679
|
+
code_paths: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
680
|
+
}, z.core.$strip>>>;
|
|
681
|
+
}, z.core.$strip>>;
|
|
502
682
|
}, z.core.$strip>;
|
|
503
683
|
/**
|
|
504
684
|
* TypeScript types inferred from schemas
|
|
505
685
|
*/
|
|
506
686
|
export type Directories = z.infer<typeof DirectoriesSchema>;
|
|
507
687
|
export type BeaconPaths = z.infer<typeof BeaconPathsSchema>;
|
|
688
|
+
export type PushRetryConfig = z.infer<typeof PushRetryConfigSchema>;
|
|
508
689
|
export type GitConfig = z.infer<typeof GitConfigSchema>;
|
|
509
690
|
export type WuConfig = z.infer<typeof WuConfigSchema>;
|
|
510
691
|
export type GatesConfig = z.infer<typeof GatesConfigSchema>;
|
|
@@ -524,6 +705,9 @@ export type ValidationMode = z.infer<typeof ValidationModeSchema>;
|
|
|
524
705
|
export type MethodologyTelemetryConfig = z.infer<typeof MethodologyTelemetryConfigSchema>;
|
|
525
706
|
export type TelemetryConfig = z.infer<typeof TelemetryConfigSchema>;
|
|
526
707
|
export type LumenFlowConfig = z.infer<typeof LumenFlowConfigSchema>;
|
|
708
|
+
export type LaneDefinition = z.infer<typeof LaneDefinitionSchema>;
|
|
709
|
+
export type LanesEnforcement = z.infer<typeof LanesEnforcementSchema>;
|
|
710
|
+
export type LanesConfig = z.infer<typeof LanesConfigSchema>;
|
|
527
711
|
export type { MethodologyConfig, MethodologyOverrides } from './resolve-policy.js';
|
|
528
712
|
/**
|
|
529
713
|
* Validate configuration data
|
|
@@ -549,6 +733,8 @@ export declare function validateConfig(data: unknown): z.ZodSafeParseResult<{
|
|
|
549
733
|
skillsDir: string;
|
|
550
734
|
agentsDir: string;
|
|
551
735
|
plansDir: string;
|
|
736
|
+
templatesDir: string;
|
|
737
|
+
onboardingDir: string;
|
|
552
738
|
};
|
|
553
739
|
beacon: {
|
|
554
740
|
base: string;
|
|
@@ -578,6 +764,13 @@ export declare function validateConfig(data: unknown): z.ZodSafeParseResult<{
|
|
|
578
764
|
requireRemote: boolean;
|
|
579
765
|
agentBranchPatterns: string[];
|
|
580
766
|
disableAgentPatternRegistry: boolean;
|
|
767
|
+
push_retry: {
|
|
768
|
+
enabled: boolean;
|
|
769
|
+
retries: number;
|
|
770
|
+
min_delay_ms: number;
|
|
771
|
+
max_delay_ms: number;
|
|
772
|
+
jitter: boolean;
|
|
773
|
+
};
|
|
581
774
|
agentBranchPatternsOverride?: string[];
|
|
582
775
|
};
|
|
583
776
|
wu: {
|
|
@@ -697,6 +890,33 @@ export declare function validateConfig(data: unknown): z.ZodSafeParseResult<{
|
|
|
697
890
|
coverage_mode?: "off" | "warn" | "block";
|
|
698
891
|
};
|
|
699
892
|
};
|
|
893
|
+
lanes?: {
|
|
894
|
+
enforcement?: {
|
|
895
|
+
require_parent: boolean;
|
|
896
|
+
allow_custom: boolean;
|
|
897
|
+
};
|
|
898
|
+
definitions?: {
|
|
899
|
+
name: string;
|
|
900
|
+
lock_policy: "none" | "all" | "active";
|
|
901
|
+
wip_limit?: number;
|
|
902
|
+
wip_justification?: string;
|
|
903
|
+
code_paths?: string[];
|
|
904
|
+
}[];
|
|
905
|
+
engineering?: {
|
|
906
|
+
name: string;
|
|
907
|
+
lock_policy: "none" | "all" | "active";
|
|
908
|
+
wip_limit?: number;
|
|
909
|
+
wip_justification?: string;
|
|
910
|
+
code_paths?: string[];
|
|
911
|
+
}[];
|
|
912
|
+
business?: {
|
|
913
|
+
name: string;
|
|
914
|
+
lock_policy: "none" | "all" | "active";
|
|
915
|
+
wip_limit?: number;
|
|
916
|
+
wip_justification?: string;
|
|
917
|
+
code_paths?: string[];
|
|
918
|
+
}[];
|
|
919
|
+
};
|
|
700
920
|
}>;
|
|
701
921
|
/**
|
|
702
922
|
* Parse configuration with defaults
|
|
@@ -11,6 +11,24 @@ import { z } from 'zod';
|
|
|
11
11
|
import { GatesExecutionConfigSchema } from './gates-config.js';
|
|
12
12
|
// WU-1259: Import methodology config schema for resolvePolicy()
|
|
13
13
|
import { MethodologyConfigSchema } from './resolve-policy.js';
|
|
14
|
+
/**
|
|
15
|
+
* WU-1325: Lock policy for lane-level WIP enforcement
|
|
16
|
+
*
|
|
17
|
+
* Controls how lane locks behave:
|
|
18
|
+
* - 'all' (default): Lock acquired on claim, held through block, released on done
|
|
19
|
+
* - 'active': Lock acquired on claim, released on block, re-acquired on unblock
|
|
20
|
+
* - 'none': No lock files created, WIP checking disabled
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```yaml
|
|
24
|
+
* lanes:
|
|
25
|
+
* definitions:
|
|
26
|
+
* - name: 'Content: Documentation'
|
|
27
|
+
* wip_limit: 4
|
|
28
|
+
* lock_policy: 'none' # Docs don't need lock coordination
|
|
29
|
+
* ```
|
|
30
|
+
*/
|
|
31
|
+
export const LockPolicySchema = z.enum(['all', 'active', 'none']).default('all');
|
|
14
32
|
/**
|
|
15
33
|
* Event archival configuration (WU-1207)
|
|
16
34
|
*
|
|
@@ -69,6 +87,10 @@ export const DirectoriesSchema = z.object({
|
|
|
69
87
|
agentsDir: z.string().default('.claude/agents'),
|
|
70
88
|
/** Plans directory (default: 'docs/04-operations/plans') - WU-1301 */
|
|
71
89
|
plansDir: z.string().default('docs/04-operations/plans'),
|
|
90
|
+
/** Templates directory (default: '.lumenflow/templates') - WU-1310 */
|
|
91
|
+
templatesDir: z.string().default('.lumenflow/templates'),
|
|
92
|
+
/** Onboarding directory (default: 'docs/04-operations/_frameworks/lumenflow/agent/onboarding') - WU-1310 */
|
|
93
|
+
onboardingDir: z.string().default('docs/04-operations/_frameworks/lumenflow/agent/onboarding'),
|
|
72
94
|
});
|
|
73
95
|
/**
|
|
74
96
|
* Beacon paths configuration (.lumenflow directory structure)
|
|
@@ -100,6 +122,45 @@ export const BeaconPathsSchema = z.object({
|
|
|
100
122
|
*/
|
|
101
123
|
eventArchival: EventArchivalConfigSchema.default(() => EventArchivalConfigSchema.parse({})),
|
|
102
124
|
});
|
|
125
|
+
/**
|
|
126
|
+
* WU-1332: Push retry configuration for micro-worktree operations
|
|
127
|
+
*
|
|
128
|
+
* When non-fast-forward push errors occur (origin/main moved during operation),
|
|
129
|
+
* retry with exponential backoff. Uses p-retry for robust retry behavior.
|
|
130
|
+
*/
|
|
131
|
+
export const PushRetryConfigSchema = z.object({
|
|
132
|
+
/**
|
|
133
|
+
* Enable push retry with rebase on non-fast-forward errors.
|
|
134
|
+
* When true, failed pushes trigger automatic rebase and retry.
|
|
135
|
+
* When false, the original error is thrown immediately.
|
|
136
|
+
* @default true
|
|
137
|
+
*/
|
|
138
|
+
enabled: z.boolean().default(true),
|
|
139
|
+
/**
|
|
140
|
+
* Maximum number of retry attempts (including the initial attempt).
|
|
141
|
+
* After this many failures, the operation fails with clear guidance.
|
|
142
|
+
* @default 3
|
|
143
|
+
*/
|
|
144
|
+
retries: z.number().int().positive().default(3),
|
|
145
|
+
/**
|
|
146
|
+
* Minimum delay in milliseconds between retries.
|
|
147
|
+
* Used as the base for exponential backoff.
|
|
148
|
+
* @default 100
|
|
149
|
+
*/
|
|
150
|
+
min_delay_ms: z.number().int().nonnegative().default(100),
|
|
151
|
+
/**
|
|
152
|
+
* Maximum delay in milliseconds between retries.
|
|
153
|
+
* Caps the exponential backoff to prevent excessive waits.
|
|
154
|
+
* @default 1000
|
|
155
|
+
*/
|
|
156
|
+
max_delay_ms: z.number().int().positive().default(1000),
|
|
157
|
+
/**
|
|
158
|
+
* Add randomization to retry delays (recommended for concurrent agents).
|
|
159
|
+
* Helps prevent thundering herd when multiple agents retry simultaneously.
|
|
160
|
+
* @default true
|
|
161
|
+
*/
|
|
162
|
+
jitter: z.boolean().default(true),
|
|
163
|
+
});
|
|
103
164
|
/**
|
|
104
165
|
* Git configuration
|
|
105
166
|
*/
|
|
@@ -189,6 +250,23 @@ export const GitConfigSchema = z.object({
|
|
|
189
250
|
* ```
|
|
190
251
|
*/
|
|
191
252
|
disableAgentPatternRegistry: z.boolean().default(false),
|
|
253
|
+
/**
|
|
254
|
+
* WU-1332: Push retry configuration for micro-worktree operations.
|
|
255
|
+
* When push fails due to non-fast-forward (origin moved), automatically
|
|
256
|
+
* rebase and retry with exponential backoff.
|
|
257
|
+
*
|
|
258
|
+
* @example
|
|
259
|
+
* ```yaml
|
|
260
|
+
* git:
|
|
261
|
+
* push_retry:
|
|
262
|
+
* enabled: true
|
|
263
|
+
* retries: 5 # Try 5 times total
|
|
264
|
+
* min_delay_ms: 200 # Start with 200ms delay
|
|
265
|
+
* max_delay_ms: 2000 # Cap at 2 second delay
|
|
266
|
+
* jitter: true # Add randomization
|
|
267
|
+
* ```
|
|
268
|
+
*/
|
|
269
|
+
push_retry: PushRetryConfigSchema.default(() => PushRetryConfigSchema.parse({})),
|
|
192
270
|
});
|
|
193
271
|
/**
|
|
194
272
|
* WU (Work Unit) configuration
|
|
@@ -504,6 +582,89 @@ export const TelemetryConfigSchema = z.object({
|
|
|
504
582
|
*/
|
|
505
583
|
methodology: MethodologyTelemetryConfigSchema.default(() => MethodologyTelemetryConfigSchema.parse({})),
|
|
506
584
|
});
|
|
585
|
+
/**
|
|
586
|
+
* WU-1345: Lane enforcement configuration schema
|
|
587
|
+
*
|
|
588
|
+
* Controls how lane format validation behaves.
|
|
589
|
+
*/
|
|
590
|
+
export const LanesEnforcementSchema = z.object({
|
|
591
|
+
/**
|
|
592
|
+
* When true, lanes MUST use "Parent: Sublane" format if parent has taxonomy.
|
|
593
|
+
* @default true
|
|
594
|
+
*/
|
|
595
|
+
require_parent: z.boolean().default(true),
|
|
596
|
+
/**
|
|
597
|
+
* When false, only lanes in the taxonomy are allowed.
|
|
598
|
+
* When true, custom lanes can be used.
|
|
599
|
+
* @default false
|
|
600
|
+
*/
|
|
601
|
+
allow_custom: z.boolean().default(false),
|
|
602
|
+
});
|
|
603
|
+
/**
|
|
604
|
+
* WU-1322: Lane definition schema for .lumenflow.config.yaml
|
|
605
|
+
*
|
|
606
|
+
* Extends the existing lane configuration with lock_policy field.
|
|
607
|
+
* Compatible with WU-1016 (wip_limit) and WU-1187 (wip_justification).
|
|
608
|
+
*/
|
|
609
|
+
export const LaneDefinitionSchema = z.object({
|
|
610
|
+
/** Lane name in "Parent: Sublane" format (e.g., "Framework: Core") */
|
|
611
|
+
name: z.string(),
|
|
612
|
+
/** WU-1016: Maximum WUs allowed in progress concurrently for this lane */
|
|
613
|
+
wip_limit: z.number().int().positive().optional(),
|
|
614
|
+
/** WU-1187: Required justification when wip_limit > 1 */
|
|
615
|
+
wip_justification: z.string().optional(),
|
|
616
|
+
/**
|
|
617
|
+
* WU-1322: Lock policy for this lane.
|
|
618
|
+
* - 'all': Lock lane for all other agents (default)
|
|
619
|
+
* - 'active': Lock only for agents with overlapping code_paths
|
|
620
|
+
* - 'none': No locking (suitable for documentation lanes)
|
|
621
|
+
*
|
|
622
|
+
* @default 'all'
|
|
623
|
+
*
|
|
624
|
+
* @example
|
|
625
|
+
* ```yaml
|
|
626
|
+
* lanes:
|
|
627
|
+
* definitions:
|
|
628
|
+
* - name: 'Content: Documentation'
|
|
629
|
+
* wip_limit: 4
|
|
630
|
+
* lock_policy: 'none' # Docs can be worked in parallel
|
|
631
|
+
* ```
|
|
632
|
+
*/
|
|
633
|
+
lock_policy: LockPolicySchema.default('all'),
|
|
634
|
+
/** Code paths associated with this lane (glob patterns) */
|
|
635
|
+
code_paths: z.array(z.string()).optional(),
|
|
636
|
+
});
|
|
637
|
+
/**
|
|
638
|
+
* WU-1345: Complete lanes configuration schema
|
|
639
|
+
*
|
|
640
|
+
* Supports three formats:
|
|
641
|
+
* 1. definitions array (recommended)
|
|
642
|
+
* 2. engineering + business arrays (legacy/alternate)
|
|
643
|
+
* 3. flat array (simple format - parsed as definitions)
|
|
644
|
+
*
|
|
645
|
+
* @example
|
|
646
|
+
* ```yaml
|
|
647
|
+
* lanes:
|
|
648
|
+
* enforcement:
|
|
649
|
+
* require_parent: true
|
|
650
|
+
* allow_custom: false
|
|
651
|
+
* definitions:
|
|
652
|
+
* - name: 'Framework: Core'
|
|
653
|
+
* wip_limit: 1
|
|
654
|
+
* code_paths:
|
|
655
|
+
* - 'packages/@lumenflow/core/**'
|
|
656
|
+
* ```
|
|
657
|
+
*/
|
|
658
|
+
export const LanesConfigSchema = z.object({
|
|
659
|
+
/** Lane enforcement configuration (validation rules) */
|
|
660
|
+
enforcement: LanesEnforcementSchema.optional(),
|
|
661
|
+
/** Primary lane definitions array (recommended format) */
|
|
662
|
+
definitions: z.array(LaneDefinitionSchema).optional(),
|
|
663
|
+
/** Engineering lanes (alternate format) */
|
|
664
|
+
engineering: z.array(LaneDefinitionSchema).optional(),
|
|
665
|
+
/** Business lanes (alternate format) */
|
|
666
|
+
business: z.array(LaneDefinitionSchema).optional(),
|
|
667
|
+
});
|
|
507
668
|
/**
|
|
508
669
|
* Complete LumenFlow configuration schema
|
|
509
670
|
*/
|
|
@@ -551,6 +712,25 @@ export const LumenFlowConfigSchema = z.object({
|
|
|
551
712
|
* ```
|
|
552
713
|
*/
|
|
553
714
|
methodology: MethodologyConfigSchema.optional(),
|
|
715
|
+
/**
|
|
716
|
+
* WU-1345: Lanes configuration
|
|
717
|
+
* Defines delivery lanes with WIP limits, code paths, and lock policies.
|
|
718
|
+
* Required for resolveLaneConfigsFromConfig() to work with getConfig().
|
|
719
|
+
*
|
|
720
|
+
* @example
|
|
721
|
+
* ```yaml
|
|
722
|
+
* lanes:
|
|
723
|
+
* enforcement:
|
|
724
|
+
* require_parent: true
|
|
725
|
+
* allow_custom: false
|
|
726
|
+
* definitions:
|
|
727
|
+
* - name: 'Framework: Core'
|
|
728
|
+
* wip_limit: 1
|
|
729
|
+
* code_paths:
|
|
730
|
+
* - 'packages/@lumenflow/core/**'
|
|
731
|
+
* ```
|
|
732
|
+
*/
|
|
733
|
+
lanes: LanesConfigSchema.optional(),
|
|
554
734
|
});
|
|
555
735
|
/**
|
|
556
736
|
* Validate configuration data
|
|
@@ -72,6 +72,8 @@ export declare function getResolvedPaths(options?: {
|
|
|
72
72
|
agentsDir: string;
|
|
73
73
|
memoryBank: string;
|
|
74
74
|
plansDir: string;
|
|
75
|
+
templatesDir: string;
|
|
76
|
+
onboardingDir: string;
|
|
75
77
|
};
|
|
76
78
|
/**
|
|
77
79
|
* Validate a config file
|
|
@@ -93,5 +95,5 @@ export declare function validateConfigFile(configPath: string): {
|
|
|
93
95
|
export declare function createSampleConfig(outputPath: string, options?: {
|
|
94
96
|
includeComments?: boolean;
|
|
95
97
|
}): void;
|
|
96
|
-
export type { LumenFlowConfig, Directories, BeaconPaths, GitConfig, WuConfig, GatesConfig, MemoryConfig, UiConfig, YamlConfig, } from './lumenflow-config-schema.js';
|
|
98
|
+
export type { LumenFlowConfig, Directories, BeaconPaths, PushRetryConfig, GitConfig, WuConfig, GatesConfig, MemoryConfig, UiConfig, YamlConfig, } from './lumenflow-config-schema.js';
|
|
97
99
|
export { getDefaultConfig } from './lumenflow-config-schema.js';
|
package/dist/lumenflow-config.js
CHANGED
|
@@ -55,6 +55,7 @@ function loadConfigFile(projectRoot) {
|
|
|
55
55
|
return data || {};
|
|
56
56
|
}
|
|
57
57
|
catch (error) {
|
|
58
|
+
// eslint-disable-next-line no-console -- Config loading runs before logger init
|
|
58
59
|
console.warn(`Warning: Failed to parse ${CONFIG_FILE_NAME}:`, error);
|
|
59
60
|
return null;
|
|
60
61
|
}
|
|
@@ -145,6 +146,8 @@ export function getResolvedPaths(options = {}) {
|
|
|
145
146
|
agentsDir: path.join(projectRoot, config.directories.agentsDir),
|
|
146
147
|
memoryBank: path.join(projectRoot, config.directories.memoryBank),
|
|
147
148
|
plansDir: path.join(projectRoot, config.directories.plansDir),
|
|
149
|
+
templatesDir: path.join(projectRoot, config.directories.templatesDir),
|
|
150
|
+
onboardingDir: path.join(projectRoot, config.directories.onboardingDir),
|
|
148
151
|
};
|
|
149
152
|
}
|
|
150
153
|
/**
|
|
@@ -206,6 +209,12 @@ directories:
|
|
|
206
209
|
skillsDir: "${defaultConfig.directories.skillsDir}"
|
|
207
210
|
# Agents directory
|
|
208
211
|
agentsDir: "${defaultConfig.directories.agentsDir}"
|
|
212
|
+
# Plans directory
|
|
213
|
+
plansDir: "${defaultConfig.directories.plansDir}"
|
|
214
|
+
# Templates directory
|
|
215
|
+
templatesDir: "${defaultConfig.directories.templatesDir}"
|
|
216
|
+
# Onboarding directory
|
|
217
|
+
onboardingDir: "${defaultConfig.directories.onboardingDir}"
|
|
209
218
|
|
|
210
219
|
# Beacon paths (.lumenflow directory structure)
|
|
211
220
|
beacon:
|