@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.
@@ -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';
@@ -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: