@lumenflow/cli 2.20.1 → 2.21.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.
Files changed (111) hide show
  1. package/README.md +8 -4
  2. package/dist/hooks/enforcement-checks.js +120 -0
  3. package/dist/hooks/enforcement-checks.js.map +1 -1
  4. package/dist/init-lane-validation.js +141 -0
  5. package/dist/init-lane-validation.js.map +1 -0
  6. package/dist/init-templates.js +36 -8
  7. package/dist/init-templates.js.map +1 -1
  8. package/dist/init.js +27 -58
  9. package/dist/init.js.map +1 -1
  10. package/dist/initiative-create.js +35 -4
  11. package/dist/initiative-create.js.map +1 -1
  12. package/dist/lane-lifecycle-process.js +364 -0
  13. package/dist/lane-lifecycle-process.js.map +1 -0
  14. package/dist/lane-lock.js +41 -0
  15. package/dist/lane-lock.js.map +1 -0
  16. package/dist/lane-setup.js +55 -0
  17. package/dist/lane-setup.js.map +1 -0
  18. package/dist/lane-status.js +38 -0
  19. package/dist/lane-status.js.map +1 -0
  20. package/dist/lane-validate.js +43 -0
  21. package/dist/lane-validate.js.map +1 -0
  22. package/dist/onboarding-smoke-test.js +17 -0
  23. package/dist/onboarding-smoke-test.js.map +1 -1
  24. package/dist/public-manifest.js +28 -0
  25. package/dist/public-manifest.js.map +1 -1
  26. package/dist/wu-claim-cloud.js +16 -0
  27. package/dist/wu-claim-cloud.js.map +1 -1
  28. package/dist/wu-claim.js +12 -2
  29. package/dist/wu-claim.js.map +1 -1
  30. package/dist/wu-create-content.js +8 -2
  31. package/dist/wu-create-content.js.map +1 -1
  32. package/dist/wu-create-validation.js +5 -3
  33. package/dist/wu-create-validation.js.map +1 -1
  34. package/dist/wu-create.js +21 -1
  35. package/dist/wu-create.js.map +1 -1
  36. package/dist/wu-done.js +57 -8
  37. package/dist/wu-done.js.map +1 -1
  38. package/dist/wu-prep.js +22 -0
  39. package/dist/wu-prep.js.map +1 -1
  40. package/package.json +15 -11
  41. package/dist/__tests__/agent-log-issue.test.js +0 -56
  42. package/dist/__tests__/agent-spawn-coordination.test.js +0 -451
  43. package/dist/__tests__/backlog-prune.test.js +0 -478
  44. package/dist/__tests__/cli-entry-point.test.js +0 -160
  45. package/dist/__tests__/cli-subprocess.test.js +0 -89
  46. package/dist/__tests__/commands/integrate.test.js +0 -165
  47. package/dist/__tests__/commands.test.js +0 -271
  48. package/dist/__tests__/deps-operations.test.js +0 -206
  49. package/dist/__tests__/doctor.test.js +0 -510
  50. package/dist/__tests__/file-operations.test.js +0 -906
  51. package/dist/__tests__/flow-report.test.js +0 -24
  52. package/dist/__tests__/gates-config.test.js +0 -303
  53. package/dist/__tests__/gates-integration-tests.test.js +0 -112
  54. package/dist/__tests__/git-operations.test.js +0 -668
  55. package/dist/__tests__/guard-main-branch.test.js +0 -79
  56. package/dist/__tests__/guards-validation.test.js +0 -416
  57. package/dist/__tests__/hooks/enforcement.test.js +0 -279
  58. package/dist/__tests__/init-config-lanes.test.js +0 -131
  59. package/dist/__tests__/init-docs-structure.test.js +0 -152
  60. package/dist/__tests__/init-greenfield.test.js +0 -247
  61. package/dist/__tests__/init-lane-inference.test.js +0 -125
  62. package/dist/__tests__/init-onboarding-docs.test.js +0 -132
  63. package/dist/__tests__/init-quick-ref.test.js +0 -144
  64. package/dist/__tests__/init-scripts.test.js +0 -207
  65. package/dist/__tests__/init-template-portability.test.js +0 -96
  66. package/dist/__tests__/init.test.js +0 -968
  67. package/dist/__tests__/initiative-add-wu.test.js +0 -490
  68. package/dist/__tests__/initiative-e2e.test.js +0 -442
  69. package/dist/__tests__/initiative-plan-replacement.test.js +0 -161
  70. package/dist/__tests__/initiative-plan.test.js +0 -340
  71. package/dist/__tests__/initiative-remove-wu.test.js +0 -458
  72. package/dist/__tests__/lumenflow-upgrade.test.js +0 -260
  73. package/dist/__tests__/mem-cleanup-execution.test.js +0 -19
  74. package/dist/__tests__/memory-integration.test.js +0 -333
  75. package/dist/__tests__/merge-block.test.js +0 -220
  76. package/dist/__tests__/metrics-cli.test.js +0 -619
  77. package/dist/__tests__/metrics-snapshot.test.js +0 -24
  78. package/dist/__tests__/no-beacon-references-docs.test.js +0 -30
  79. package/dist/__tests__/no-beacon-references.test.js +0 -39
  80. package/dist/__tests__/onboarding-smoke-test.test.js +0 -211
  81. package/dist/__tests__/path-centralization-cli.test.js +0 -234
  82. package/dist/__tests__/plan-create.test.js +0 -126
  83. package/dist/__tests__/plan-edit.test.js +0 -157
  84. package/dist/__tests__/plan-link.test.js +0 -239
  85. package/dist/__tests__/plan-promote.test.js +0 -181
  86. package/dist/__tests__/release.test.js +0 -372
  87. package/dist/__tests__/rotate-progress.test.js +0 -127
  88. package/dist/__tests__/safe-git.test.js +0 -190
  89. package/dist/__tests__/session-coordinator.test.js +0 -109
  90. package/dist/__tests__/state-bootstrap.test.js +0 -432
  91. package/dist/__tests__/state-doctor.test.js +0 -328
  92. package/dist/__tests__/sync-templates.test.js +0 -255
  93. package/dist/__tests__/templates-sync.test.js +0 -219
  94. package/dist/__tests__/trace-gen.test.js +0 -115
  95. package/dist/__tests__/wu-create-required-fields.test.js +0 -143
  96. package/dist/__tests__/wu-create-strict.test.js +0 -118
  97. package/dist/__tests__/wu-create.test.js +0 -121
  98. package/dist/__tests__/wu-done-auto-cleanup.test.js +0 -135
  99. package/dist/__tests__/wu-done-docs-only-policy.test.js +0 -20
  100. package/dist/__tests__/wu-done-staging-whitelist.test.js +0 -35
  101. package/dist/__tests__/wu-done.test.js +0 -36
  102. package/dist/__tests__/wu-edit-strict.test.js +0 -109
  103. package/dist/__tests__/wu-edit.test.js +0 -119
  104. package/dist/__tests__/wu-lifecycle-integration.test.js +0 -388
  105. package/dist/__tests__/wu-prep-default-exec.test.js +0 -35
  106. package/dist/__tests__/wu-prep.test.js +0 -140
  107. package/dist/__tests__/wu-proto.test.js +0 -97
  108. package/dist/__tests__/wu-validate-strict.test.js +0 -113
  109. package/dist/__tests__/wu-validate.test.js +0 -36
  110. package/dist/spawn-list.js +0 -143
  111. package/dist/spawn-list.js.map +0 -1
@@ -1,113 +0,0 @@
1
- /**
2
- * @file wu-validate-strict.test.ts
3
- * Test suite for wu:validate strict validation behavior (WU-1329)
4
- *
5
- * WU-1329: Make wu:validate treat warnings as errors by default
6
- *
7
- * Tests:
8
- * - Default strict mode behavior (warnings treated as errors)
9
- * - --no-strict flag restores original behavior (warnings advisory)
10
- * - Help text documents strict default
11
- */
12
- import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
13
- import { WU_OPTIONS, NEGATED_OPTIONS } from '@lumenflow/core/dist/arg-parser.js';
14
- describe('wu:validate strict validation (WU-1329)', () => {
15
- describe('WU_OPTIONS.noStrict configuration', () => {
16
- // WU-1329: Verify the noStrict option is properly configured
17
- it('should have noStrict option defined in WU_OPTIONS', () => {
18
- expect(WU_OPTIONS.noStrict).toBeDefined();
19
- expect(WU_OPTIONS.noStrict.name).toBe('noStrict');
20
- expect(WU_OPTIONS.noStrict.flags).toBe('--no-strict');
21
- expect(WU_OPTIONS.noStrict.isNegated).toBe(true);
22
- });
23
- it('should include description about bypassing strict validation', () => {
24
- expect(WU_OPTIONS.noStrict.description).toContain('Bypass strict validation');
25
- });
26
- // WU-1329: Verify 'strict' is in NEGATED_OPTIONS array
27
- it('should include strict in NEGATED_OPTIONS array', () => {
28
- expect(NEGATED_OPTIONS).toContain('strict');
29
- });
30
- });
31
- describe('strict mode logic', () => {
32
- // WU-1329: Verify the strict mode conversion pattern
33
- it('should default to strict=true when noStrict is undefined', () => {
34
- const args = { noStrict: undefined };
35
- const strict = !args.noStrict;
36
- expect(strict).toBe(true);
37
- });
38
- it('should set strict=false when noStrict is true (--no-strict flag)', () => {
39
- const args = { noStrict: true };
40
- const strict = !args.noStrict;
41
- expect(strict).toBe(false);
42
- });
43
- it('should set strict=true when noStrict is false (explicit)', () => {
44
- const args = { noStrict: false };
45
- const strict = !args.noStrict;
46
- expect(strict).toBe(true);
47
- });
48
- });
49
- describe('--no-strict logging behavior', () => {
50
- let consoleSpy;
51
- beforeEach(() => {
52
- consoleSpy = vi.spyOn(console, 'warn').mockImplementation(() => { });
53
- });
54
- afterEach(() => {
55
- consoleSpy.mockRestore();
56
- });
57
- // WU-1329: The logging behavior is implemented in main() functions
58
- // This test documents the expected behavior pattern using the spy
59
- it('should log when --no-strict bypass is used', () => {
60
- // Simulate the logging pattern from wu-validate.ts main()
61
- const noStrict = true;
62
- const LOG_PREFIX = '[wu:validate]';
63
- const message = `${LOG_PREFIX} WARNING: strict validation bypassed (--no-strict). Warnings will be advisory only.`;
64
- if (noStrict) {
65
- // Use the spy to simulate logging
66
- consoleSpy(message);
67
- }
68
- expect(consoleSpy).toHaveBeenCalledWith(expect.stringContaining('strict validation bypassed'));
69
- });
70
- it('should not log when strict mode is active', () => {
71
- // When noStrict is false, no logging should occur
72
- const noStrict = false;
73
- if (noStrict) {
74
- consoleSpy('This should not be called');
75
- }
76
- expect(consoleSpy).not.toHaveBeenCalled();
77
- });
78
- });
79
- describe('validateSingleWU strict mode behavior', () => {
80
- // WU-1329: These tests document the expected behavior
81
- // The actual validation is done by calling the CLI command
82
- it('should treat warnings as errors by default (strict=true)', () => {
83
- // In strict mode, any warnings from completeness validation
84
- // should become errors and cause validation to fail
85
- const strict = true;
86
- const warnings = ['Missing recommended field: notes'];
87
- const errors = [];
88
- if (strict && warnings.length > 0) {
89
- errors.push(...warnings.map((w) => `[STRICT] ${w}`));
90
- }
91
- expect(errors.length).toBeGreaterThan(0);
92
- expect(errors[0]).toContain('[STRICT]');
93
- });
94
- it('should allow warnings when strict=false (--no-strict)', () => {
95
- // In non-strict mode, warnings should remain warnings
96
- // and validation should pass
97
- const strict = false;
98
- const warnings = ['Missing recommended field: notes'];
99
- const errors = [];
100
- if (strict && warnings.length > 0) {
101
- errors.push(...warnings.map((w) => `[STRICT] ${w}`));
102
- }
103
- expect(errors.length).toBe(0);
104
- });
105
- });
106
- describe('help text documentation', () => {
107
- // WU-1329: Verify help text documents strict default
108
- it('should document that --no-strict bypasses strict validation', () => {
109
- const expectedDescription = 'Bypass strict validation';
110
- expect(WU_OPTIONS.noStrict.description).toContain(expectedDescription);
111
- });
112
- });
113
- });
@@ -1,36 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { summarizeValidationResults } from '../wu-validate.js';
3
- describe('wu:validate JSON summary (WU-1441)', () => {
4
- it('should summarize invalid WUs with totals', () => {
5
- const results = [
6
- { wuId: 'WU-1', valid: true, warnings: [], errors: [] },
7
- { wuId: 'WU-2', valid: false, warnings: [], errors: ['[STRICT] Missing notes'] },
8
- ];
9
- const summary = summarizeValidationResults(results);
10
- expect(summary.valid).toBe(false);
11
- expect(summary.totalValid).toBe(1);
12
- expect(summary.totalInvalid).toBe(1);
13
- expect(summary.totalWarnings).toBe(0);
14
- expect(summary.invalid).toEqual([
15
- {
16
- wuId: 'WU-2',
17
- errors: ['[STRICT] Missing notes'],
18
- },
19
- ]);
20
- });
21
- it('should include warnings per WU', () => {
22
- const results = [
23
- { wuId: 'WU-3', valid: true, warnings: ['Warn'], errors: [] },
24
- { wuId: 'WU-4', valid: true, warnings: [], errors: [] },
25
- ];
26
- const summary = summarizeValidationResults(results);
27
- expect(summary.valid).toBe(true);
28
- expect(summary.totalWarnings).toBe(1);
29
- expect(summary.warnings).toEqual([
30
- {
31
- wuId: 'WU-3',
32
- warnings: ['Warn'],
33
- },
34
- ]);
35
- });
36
- });
@@ -1,143 +0,0 @@
1
- #!/usr/bin/env node
2
- /**
3
- * Spawn List Command (WU-1950)
4
- *
5
- * Displays spawn trees for WUs or initiatives.
6
- * WU-1604: Includes explicit delegation lineage records from wu:delegate.
7
- * Shows parent-child relationships with status indicators.
8
- *
9
- * Usage:
10
- * pnpm spawn:list --wu WU-XXX # Spawns for a specific WU
11
- * pnpm spawn:list --initiative INIT-XXX # All spawns in an initiative
12
- * pnpm spawn:list --json # JSON output
13
- *
14
- * @see {@link packages/@lumenflow/cli/src/lib/spawn-tree.ts} - Tree builder
15
- * @see {@link packages/@lumenflow/cli/src/__tests__/spawn-list.test.ts} - Tests
16
- */
17
- import { createWUParser, WU_OPTIONS } from '@lumenflow/core/arg-parser';
18
- import { die } from '@lumenflow/core/error-handler';
19
- import { PATTERNS, LUMENFLOW_PATHS } from '@lumenflow/core/wu-constants';
20
- import { WU_PATHS } from '@lumenflow/core/wu-paths';
21
- /** Local EMOJI constants for spawn-list output */
22
- const EMOJI = {
23
- WARNING: '⚠️',
24
- ERROR: '❌',
25
- };
26
- /** Custom options for spawn-list command */
27
- const SPAWN_LIST_OPTIONS = {
28
- initiative: {
29
- name: 'initiative',
30
- flags: '--initiative <initId>',
31
- description: 'Initiative ID to show all spawns for (e.g., INIT-001)',
32
- },
33
- json: {
34
- name: 'json',
35
- flags: '--json',
36
- description: 'Output as JSON',
37
- default: false,
38
- },
39
- };
40
- import { buildSpawnTree, formatSpawnTree, getSpawnsByWU, getSpawnsByInitiative, treeToJSON, STATUS_INDICATORS, } from '@lumenflow/core/spawn-tree';
41
- import { SpawnStatus } from '@lumenflow/core/spawn-registry-schema';
42
- import { runCLI } from './cli-entry-point.js';
43
- const LOG_PREFIX = '[spawn:list]';
44
- /** Default paths for spawn registry and WU files (WU-1301: uses config-based paths) */
45
- const DEFAULT_PATHS = Object.freeze({
46
- REGISTRY_DIR: LUMENFLOW_PATHS.STATE_DIR,
47
- WU_DIR: WU_PATHS.WU_DIR(),
48
- });
49
- /** Initiative ID pattern */
50
- const INIT_PATTERN = /^INIT-\d+$/;
51
- /**
52
- * Prints the legend for status indicators
53
- */
54
- function printLegend() {
55
- console.log('\nLegend:');
56
- console.log(` ${STATUS_INDICATORS[SpawnStatus.PENDING]} pending`);
57
- console.log(` ${STATUS_INDICATORS[SpawnStatus.COMPLETED]} completed`);
58
- console.log(` ${STATUS_INDICATORS[SpawnStatus.TIMEOUT]} timeout`);
59
- console.log(` ${STATUS_INDICATORS[SpawnStatus.CRASHED]} crashed`);
60
- }
61
- /**
62
- * Main entry point
63
- */
64
- async function main() {
65
- const args = createWUParser({
66
- name: 'spawn-list',
67
- description: 'Display spawn trees for WUs or initiatives',
68
- options: [WU_OPTIONS.wu, SPAWN_LIST_OPTIONS.initiative, SPAWN_LIST_OPTIONS.json],
69
- required: [],
70
- allowPositionalId: false,
71
- });
72
- const { wu, initiative, json } = args;
73
- // Validate: exactly one of --wu or --initiative required
74
- if (!wu && !initiative) {
75
- die('Either --wu or --initiative is required.\n\nUsage:\n pnpm spawn:list --wu WU-XXX\n pnpm spawn:list --initiative INIT-XXX');
76
- }
77
- if (wu && initiative) {
78
- die('Cannot specify both --wu and --initiative. Choose one.');
79
- }
80
- // Handle --wu
81
- if (wu) {
82
- const wuId = wu.toUpperCase();
83
- if (!PATTERNS.WU_ID.test(wuId)) {
84
- die(`Invalid WU ID format: ${wu}. Expected format: WU-XXX`);
85
- }
86
- const spawns = await getSpawnsByWU(wuId, DEFAULT_PATHS.REGISTRY_DIR);
87
- if (json) {
88
- const tree = buildSpawnTree(spawns, wuId);
89
- console.log(JSON.stringify(treeToJSON(tree), null, 2));
90
- return;
91
- }
92
- if (spawns.length === 0) {
93
- console.log(`${LOG_PREFIX} ${EMOJI.WARNING} No spawns found for ${wuId}`);
94
- console.log(`\n${wuId} (root)`);
95
- console.log(' (no spawns)');
96
- return;
97
- }
98
- console.log(`${LOG_PREFIX} Spawn tree for ${wuId}:\n`);
99
- const tree = buildSpawnTree(spawns, wuId);
100
- console.log(formatSpawnTree(tree));
101
- printLegend();
102
- console.log(`\nTotal: ${spawns.length} spawn(s)`);
103
- return;
104
- }
105
- // Handle --initiative
106
- if (initiative) {
107
- const initId = initiative.toUpperCase();
108
- if (!INIT_PATTERN.test(initId)) {
109
- die(`Invalid initiative ID format: ${initiative}. Expected format: INIT-XXX`);
110
- }
111
- const spawns = await getSpawnsByInitiative(initId, DEFAULT_PATHS.REGISTRY_DIR, DEFAULT_PATHS.WU_DIR);
112
- if (json) {
113
- // For initiative, output flat list since there may be multiple root WUs
114
- console.log(JSON.stringify(spawns, null, 2));
115
- return;
116
- }
117
- if (spawns.length === 0) {
118
- console.log(`${LOG_PREFIX} ${EMOJI.WARNING} No spawns found for ${initId}`);
119
- return;
120
- }
121
- // Group spawns by parent WU and display trees
122
- console.log(`${LOG_PREFIX} Spawns for ${initId}:\n`);
123
- // Find unique root WUs (parents that are not targets of other spawns)
124
- const typedSpawns = spawns;
125
- const targetWuIds = new Set(typedSpawns.map((s) => s.targetWuId));
126
- const rootWuIds = [...new Set(typedSpawns.map((s) => s.parentWuId))].filter((id) => !targetWuIds.has(id));
127
- for (const rootWuId of rootWuIds) {
128
- const tree = buildSpawnTree(spawns, rootWuId);
129
- console.log(formatSpawnTree(tree));
130
- console.log('');
131
- }
132
- printLegend();
133
- console.log(`\nTotal: ${spawns.length} spawn(s) across ${rootWuIds.length} root WU(s)`);
134
- }
135
- }
136
- // WU-1181: Use import.meta.main instead of process.argv[1] comparison
137
- // The old pattern fails with pnpm symlinks because process.argv[1] is the symlink
138
- // path but import.meta.url resolves to the real path - they never match
139
- // WU-1537: Use import.meta.main + runCLI for consistent EPIPE and error handling
140
- if (import.meta.main) {
141
- void runCLI(main);
142
- }
143
- //# sourceMappingURL=spawn-list.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spawn-list.js","sourceRoot":"","sources":["../src/spawn-list.ts"],"names":[],"mappings":"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"}