@lumenflow/cli 3.1.3 → 3.2.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/agent-issues-query.js.map +1 -0
- package/dist/agent-log-issue.js.map +1 -0
- package/dist/agent-session-end.js.map +1 -0
- package/dist/agent-session.js.map +1 -0
- package/dist/backlog-prune.js.map +1 -0
- package/dist/cli-entry-point.js +139 -0
- package/dist/cli-entry-point.js.map +1 -0
- package/dist/commands/integrate.js.map +1 -0
- package/dist/commands.js.map +1 -0
- package/dist/config-get.js.map +1 -0
- package/dist/config-set.js.map +1 -0
- package/dist/constants.js +98 -0
- package/dist/constants.js.map +1 -0
- package/dist/delegation-list.js.map +1 -0
- package/dist/deps-add.js +259 -0
- package/dist/deps-add.js.map +1 -0
- package/dist/deps-remove.js +105 -0
- package/dist/deps-remove.js.map +1 -0
- package/dist/docs-sync.js.map +1 -0
- package/dist/doctor.js.map +1 -0
- package/dist/file-delete.js.map +1 -0
- package/dist/file-edit.js.map +1 -0
- package/dist/file-read.js.map +1 -0
- package/dist/file-write.js.map +1 -0
- package/dist/flow-bottlenecks.js.map +1 -0
- package/dist/flow-report.js.map +1 -0
- package/dist/formatters.js +151 -0
- package/dist/formatters.js.map +1 -0
- package/dist/gate-defaults.js +137 -0
- package/dist/gate-defaults.js.map +1 -0
- package/dist/gate-registry.js +73 -0
- package/dist/gate-registry.js.map +1 -0
- package/dist/gates-graceful-degradation.js +153 -0
- package/dist/gates-graceful-degradation.js.map +1 -0
- package/dist/gates-plan-resolvers.js +190 -0
- package/dist/gates-plan-resolvers.js.map +1 -0
- package/dist/gates-runners.js +545 -0
- package/dist/gates-runners.js.map +1 -0
- package/dist/gates-types.js +4 -0
- package/dist/gates-types.js.map +1 -0
- package/dist/gates-utils.js +333 -0
- package/dist/gates-utils.js.map +1 -0
- package/dist/gates.js.map +1 -0
- package/dist/git-branch.js.map +1 -0
- package/dist/git-diff.js.map +1 -0
- package/dist/git-log.js.map +1 -0
- package/dist/git-status.js.map +1 -0
- package/dist/guard-locked.js +172 -0
- package/dist/guard-locked.js.map +1 -0
- package/dist/guard-main-branch.js +217 -0
- package/dist/guard-main-branch.js.map +1 -0
- package/dist/guard-worktree-commit.js +163 -0
- package/dist/guard-worktree-commit.js.map +1 -0
- package/dist/hooks/auto-checkpoint-utils.js +54 -0
- package/dist/hooks/auto-checkpoint-utils.js.map +1 -0
- package/dist/hooks/enforcement-checks.js +399 -0
- package/dist/hooks/enforcement-checks.js.map +1 -0
- package/dist/hooks/enforcement-generator.js +139 -0
- package/dist/hooks/enforcement-generator.js.map +1 -0
- package/dist/hooks/enforcement-sync.js +380 -0
- package/dist/hooks/enforcement-sync.js.map +1 -0
- package/dist/hooks/generators/auto-checkpoint.js +125 -0
- package/dist/hooks/generators/auto-checkpoint.js.map +1 -0
- package/dist/hooks/generators/enforce-worktree.js +190 -0
- package/dist/hooks/generators/enforce-worktree.js.map +1 -0
- package/dist/hooks/generators/index.js +18 -0
- package/dist/hooks/generators/index.js.map +1 -0
- package/dist/hooks/generators/pre-compact-checkpoint.js +136 -0
- package/dist/hooks/generators/pre-compact-checkpoint.js.map +1 -0
- package/dist/hooks/generators/require-wu.js +117 -0
- package/dist/hooks/generators/require-wu.js.map +1 -0
- package/dist/hooks/generators/session-start-recovery.js +103 -0
- package/dist/hooks/generators/session-start-recovery.js.map +1 -0
- package/dist/hooks/generators/signal-utils.js +54 -0
- package/dist/hooks/generators/signal-utils.js.map +1 -0
- package/dist/hooks/generators/warn-incomplete.js +67 -0
- package/dist/hooks/generators/warn-incomplete.js.map +1 -0
- package/dist/hooks/index.js +10 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.js.map +1 -0
- package/dist/init-detection.js +232 -0
- package/dist/init-detection.js.map +1 -0
- package/dist/init-lane-validation.js +147 -0
- package/dist/init-lane-validation.js.map +1 -0
- package/dist/init-scaffolding.js +158 -0
- package/dist/init-scaffolding.js.map +1 -0
- package/dist/init-templates.js +1983 -0
- package/dist/init-templates.js.map +1 -0
- package/dist/init.js.map +1 -0
- package/dist/initiative-add-wu.js.map +1 -0
- package/dist/initiative-bulk-assign-wus.js.map +1 -0
- package/dist/initiative-create.js.map +1 -0
- package/dist/initiative-edit.js.map +1 -0
- package/dist/initiative-list.js.map +1 -0
- package/dist/initiative-plan.js.map +1 -0
- package/dist/initiative-remove-wu.js.map +1 -0
- package/dist/initiative-status.js.map +1 -0
- package/dist/lane-edit.js.map +1 -0
- package/dist/lane-health.js.map +1 -0
- package/dist/lane-lifecycle-process.js +381 -0
- package/dist/lane-lifecycle-process.js.map +1 -0
- package/dist/lane-lock.js.map +1 -0
- package/dist/lane-setup.js.map +1 -0
- package/dist/lane-status.js.map +1 -0
- package/dist/lane-suggest.js.map +1 -0
- package/dist/lane-validate.js.map +1 -0
- package/dist/lifecycle-regression-harness.js +181 -0
- package/dist/lifecycle-regression-harness.js.map +1 -0
- package/dist/lumenflow-upgrade.js +18 -10
- package/dist/lumenflow-upgrade.js.map +1 -0
- package/dist/mem-checkpoint.js.map +1 -0
- package/dist/mem-cleanup.js.map +1 -0
- package/dist/mem-context.js.map +1 -0
- package/dist/mem-create.js.map +1 -0
- package/dist/mem-delete.js.map +1 -0
- package/dist/mem-export.js.map +1 -0
- package/dist/mem-inbox.js.map +1 -0
- package/dist/mem-index.js +214 -0
- package/dist/mem-index.js.map +1 -0
- package/dist/mem-init.js.map +1 -0
- package/dist/mem-profile.js +210 -0
- package/dist/mem-profile.js.map +1 -0
- package/dist/mem-promote.js +257 -0
- package/dist/mem-promote.js.map +1 -0
- package/dist/mem-ready.js.map +1 -0
- package/dist/mem-recover.js.map +1 -0
- package/dist/mem-signal.js.map +1 -0
- package/dist/mem-start.js.map +1 -0
- package/dist/mem-summarize.js.map +1 -0
- package/dist/mem-triage.js.map +1 -0
- package/dist/merge-block.js +225 -0
- package/dist/merge-block.js.map +1 -0
- package/dist/metrics-cli.js.map +1 -0
- package/dist/metrics-snapshot.js.map +1 -0
- package/dist/object-guards.js +9 -0
- package/dist/object-guards.js.map +1 -0
- package/dist/onboard.js.map +1 -0
- package/dist/onboarding-smoke-test.js +432 -0
- package/dist/onboarding-smoke-test.js.map +1 -0
- package/dist/orchestrate-init-status.js.map +1 -0
- package/dist/orchestrate-initiative.js.map +1 -0
- package/dist/orchestrate-monitor.js.map +1 -0
- package/dist/pack-author.js.map +1 -0
- package/dist/pack-hash.js.map +1 -0
- package/dist/pack-install.js.map +1 -0
- package/dist/pack-publish.js.map +1 -0
- package/dist/pack-scaffold.js.map +1 -0
- package/dist/pack-search.js.map +1 -0
- package/dist/pack-validate.js.map +1 -0
- package/dist/plan-create.js.map +1 -0
- package/dist/plan-edit.js.map +1 -0
- package/dist/plan-link.js.map +1 -0
- package/dist/plan-promote.js.map +1 -0
- package/dist/public-manifest.js +931 -0
- package/dist/public-manifest.js.map +1 -0
- package/dist/release.js +664 -116
- package/dist/release.js.map +1 -0
- package/dist/rotate-progress.js +253 -0
- package/dist/rotate-progress.js.map +1 -0
- package/dist/session-coordinator.js +303 -0
- package/dist/session-coordinator.js.map +1 -0
- package/dist/shared-validators.js +81 -0
- package/dist/shared-validators.js.map +1 -0
- package/dist/signal-cleanup.js.map +1 -0
- package/dist/state-bootstrap.js.map +1 -0
- package/dist/state-cleanup.js.map +1 -0
- package/dist/state-doctor-fix.js +226 -0
- package/dist/state-doctor-fix.js.map +1 -0
- package/dist/state-doctor-stamps.js +23 -0
- package/dist/state-doctor-stamps.js.map +1 -0
- package/dist/state-doctor.js.map +1 -0
- package/dist/strict-progress.js +255 -0
- package/dist/strict-progress.js.map +1 -0
- package/dist/sync-templates.js.map +1 -0
- package/dist/task-claim.js.map +1 -0
- package/dist/trace-gen.js +401 -0
- package/dist/trace-gen.js.map +1 -0
- package/dist/validate-agent-skills.js +224 -0
- package/dist/validate-agent-skills.js.map +1 -0
- package/dist/validate-agent-sync.js +152 -0
- package/dist/validate-agent-sync.js.map +1 -0
- package/dist/validate-backlog-sync.js +77 -0
- package/dist/validate-backlog-sync.js.map +1 -0
- package/dist/validate-skills-spec.js +211 -0
- package/dist/validate-skills-spec.js.map +1 -0
- package/dist/validate.js.map +1 -0
- package/dist/validator-defaults.js +107 -0
- package/dist/validator-defaults.js.map +1 -0
- package/dist/validator-registry.js +71 -0
- package/dist/validator-registry.js.map +1 -0
- package/dist/workspace-init.js.map +1 -0
- package/dist/wu-block.js.map +1 -0
- package/dist/wu-brief.js.map +1 -0
- package/dist/wu-claim-branch.js +123 -0
- package/dist/wu-claim-branch.js.map +1 -0
- package/dist/wu-claim-cloud.js +79 -0
- package/dist/wu-claim-cloud.js.map +1 -0
- package/dist/wu-claim-mode.js +82 -0
- package/dist/wu-claim-mode.js.map +1 -0
- package/dist/wu-claim-output.js +85 -0
- package/dist/wu-claim-output.js.map +1 -0
- package/dist/wu-claim-repair-guidance.js +12 -0
- package/dist/wu-claim-repair-guidance.js.map +1 -0
- package/dist/wu-claim-resume-handler.js +87 -0
- package/dist/wu-claim-resume-handler.js.map +1 -0
- package/dist/wu-claim-state.js +581 -0
- package/dist/wu-claim-state.js.map +1 -0
- package/dist/wu-claim-validation.js +458 -0
- package/dist/wu-claim-validation.js.map +1 -0
- package/dist/wu-claim-worktree.js +238 -0
- package/dist/wu-claim-worktree.js.map +1 -0
- package/dist/wu-claim.js.map +1 -0
- package/dist/wu-cleanup-cloud.js +78 -0
- package/dist/wu-cleanup-cloud.js.map +1 -0
- package/dist/wu-cleanup.js.map +1 -0
- package/dist/wu-code-path-coverage.js +83 -0
- package/dist/wu-code-path-coverage.js.map +1 -0
- package/dist/wu-create-cloud.js +30 -0
- package/dist/wu-create-cloud.js.map +1 -0
- package/dist/wu-create-content.js +264 -0
- package/dist/wu-create-content.js.map +1 -0
- package/dist/wu-create-readiness.js +59 -0
- package/dist/wu-create-readiness.js.map +1 -0
- package/dist/wu-create-validation.js +128 -0
- package/dist/wu-create-validation.js.map +1 -0
- package/dist/wu-create.js.map +1 -0
- package/dist/wu-delegate.js.map +1 -0
- package/dist/wu-delete.js.map +1 -0
- package/dist/wu-deps.js.map +1 -0
- package/dist/wu-done-auto-cleanup.js +194 -0
- package/dist/wu-done-auto-cleanup.js.map +1 -0
- package/dist/wu-done-check.js +38 -0
- package/dist/wu-done-check.js.map +1 -0
- package/dist/wu-done-cloud.js +48 -0
- package/dist/wu-done-cloud.js.map +1 -0
- package/dist/wu-done-decay.js +83 -0
- package/dist/wu-done-decay.js.map +1 -0
- package/dist/wu-done.js.map +1 -0
- package/dist/wu-edit-operations.js +399 -0
- package/dist/wu-edit-operations.js.map +1 -0
- package/dist/wu-edit-validators.js +282 -0
- package/dist/wu-edit-validators.js.map +1 -0
- package/dist/wu-edit.js.map +1 -0
- package/dist/wu-infer-lane.js.map +1 -0
- package/dist/wu-preflight.js.map +1 -0
- package/dist/wu-prep.js.map +1 -0
- package/dist/wu-proto.js.map +1 -0
- package/dist/wu-prune.js.map +1 -0
- package/dist/wu-recover.js.map +1 -0
- package/dist/wu-release.js.map +1 -0
- package/dist/wu-repair.js.map +1 -0
- package/dist/wu-sandbox.js.map +1 -0
- package/dist/wu-spawn-completion.js +58 -0
- package/dist/wu-spawn-completion.js.map +1 -0
- package/dist/wu-spawn-prompt-builders.js +1190 -0
- package/dist/wu-spawn-prompt-builders.js.map +1 -0
- package/dist/wu-spawn-strategy-resolver.js +322 -0
- package/dist/wu-spawn-strategy-resolver.js.map +1 -0
- package/dist/wu-spawn.js +59 -0
- package/dist/wu-spawn.js.map +1 -0
- package/dist/wu-state-cloud.js +41 -0
- package/dist/wu-state-cloud.js.map +1 -0
- package/dist/wu-status.js.map +1 -0
- package/dist/wu-unblock.js.map +1 -0
- package/dist/wu-unlock-lane.js.map +1 -0
- package/dist/wu-validate.js.map +1 -0
- package/package.json +8 -10
|
@@ -0,0 +1,399 @@
|
|
|
1
|
+
// Copyright (c) 2026 Hellmai Ltd
|
|
2
|
+
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
+
/**
|
|
4
|
+
* WU-1650: Apply/edit operations for wu:edit command
|
|
5
|
+
*
|
|
6
|
+
* Extracted from wu-edit.ts to dedicated module.
|
|
7
|
+
* All field-application, merge, and write operations live here.
|
|
8
|
+
*/
|
|
9
|
+
import { die } from '@lumenflow/core/error-handler';
|
|
10
|
+
import { createGitForPath } from '@lumenflow/core/git-adapter';
|
|
11
|
+
import { existsSync, readFileSync, writeFileSync } from 'node:fs';
|
|
12
|
+
import { join, resolve } from 'node:path';
|
|
13
|
+
import { parseYAML, stringifyYAML, readWU } from '@lumenflow/core/wu-yaml';
|
|
14
|
+
import { WU_PATHS, getStateStoreDirFromBacklog } from '@lumenflow/core/wu-paths';
|
|
15
|
+
import { generateBacklog } from '@lumenflow/core/backlog-generator';
|
|
16
|
+
import { WUStateStore } from '@lumenflow/core/wu-state-store';
|
|
17
|
+
import { FILE_SYSTEM, LOG_PREFIX, COMMIT_FORMATS, PKG_MANAGER, SCRIPTS, PRETTIER_FLAGS, READINESS_UI, } from '@lumenflow/core/wu-constants';
|
|
18
|
+
import { validateLaneFormat } from '@lumenflow/core/lane-checker';
|
|
19
|
+
// WU-1442: Import date normalization to fix date corruption from js-yaml
|
|
20
|
+
import { normalizeToDateString } from '@lumenflow/core/date-utils';
|
|
21
|
+
// WU-1929: Import initiative-related modules for bidirectional initiative updates
|
|
22
|
+
import { INIT_PATHS } from '@lumenflow/initiatives/paths';
|
|
23
|
+
import { readInitiative, writeInitiative } from '@lumenflow/initiatives/yaml';
|
|
24
|
+
import { validateSpecCompleteness } from '@lumenflow/core/wu-done-validators';
|
|
25
|
+
import { execSync } from 'node:child_process';
|
|
26
|
+
import { validateInitiativeFormat, validateInitiativeExists, validateExposureValue, } from './wu-edit-validators.js';
|
|
27
|
+
const PREFIX = LOG_PREFIX.EDIT;
|
|
28
|
+
/**
|
|
29
|
+
* WU-1039: Apply exposure edit to WU object
|
|
30
|
+
*
|
|
31
|
+
* Returns a new WU object with updated exposure (immutable pattern).
|
|
32
|
+
*
|
|
33
|
+
* @param wu - Original WU object
|
|
34
|
+
* @param exposure - New exposure value
|
|
35
|
+
* @returns Updated WU object (does not mutate original)
|
|
36
|
+
*/
|
|
37
|
+
export function applyExposureEdit(wu, exposure) {
|
|
38
|
+
return {
|
|
39
|
+
...wu,
|
|
40
|
+
exposure,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* WU-1929: Update initiative wus: arrays bidirectionally
|
|
45
|
+
*
|
|
46
|
+
* When a WU's initiative field changes, this function:
|
|
47
|
+
* 1. Removes the WU ID from the old initiative's wus: array (if exists)
|
|
48
|
+
* 2. Adds the WU ID to the new initiative's wus: array
|
|
49
|
+
*
|
|
50
|
+
* @param worktreePath - Path to the worktree (for file operations)
|
|
51
|
+
* @param wuId - WU ID being updated
|
|
52
|
+
* @param oldInitId - Previous initiative ID (may be undefined)
|
|
53
|
+
* @param newInitId - New initiative ID
|
|
54
|
+
* @returns Array of relative file paths that were modified
|
|
55
|
+
*/
|
|
56
|
+
export function updateInitiativeWusArrays(worktreePath, wuId, oldInitId, newInitId) {
|
|
57
|
+
const modifiedFiles = [];
|
|
58
|
+
// Remove from old initiative if it exists and is different from new
|
|
59
|
+
if (oldInitId && oldInitId !== newInitId) {
|
|
60
|
+
const oldInitPath = join(worktreePath, INIT_PATHS.INITIATIVE(oldInitId));
|
|
61
|
+
if (existsSync(oldInitPath)) {
|
|
62
|
+
try {
|
|
63
|
+
const oldInit = readInitiative(oldInitPath, oldInitId);
|
|
64
|
+
if (Array.isArray(oldInit.wus) && oldInit.wus.includes(wuId)) {
|
|
65
|
+
oldInit.wus = oldInit.wus.filter((id) => id !== wuId);
|
|
66
|
+
writeInitiative(oldInitPath, oldInit);
|
|
67
|
+
modifiedFiles.push(INIT_PATHS.INITIATIVE(oldInitId));
|
|
68
|
+
console.log(`${PREFIX} Removed ${wuId} from ${oldInitId} wus: array`);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (err) {
|
|
72
|
+
// Old initiative may not exist or be invalid - log warning but continue
|
|
73
|
+
console.warn(`${PREFIX} Could not update old initiative ${oldInitId}: ${err.message}`);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
// Add to new initiative
|
|
78
|
+
const newInitPath = join(worktreePath, INIT_PATHS.INITIATIVE(newInitId));
|
|
79
|
+
if (existsSync(newInitPath)) {
|
|
80
|
+
try {
|
|
81
|
+
const newInit = readInitiative(newInitPath, newInitId);
|
|
82
|
+
if (!Array.isArray(newInit.wus)) {
|
|
83
|
+
newInit.wus = [];
|
|
84
|
+
}
|
|
85
|
+
if (!newInit.wus.includes(wuId)) {
|
|
86
|
+
newInit.wus.push(wuId);
|
|
87
|
+
writeInitiative(newInitPath, newInit);
|
|
88
|
+
modifiedFiles.push(INIT_PATHS.INITIATIVE(newInitId));
|
|
89
|
+
console.log(`${PREFIX} Added ${wuId} to ${newInitId} wus: array`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
catch (err) {
|
|
93
|
+
die(`Failed to update new initiative ${newInitId}: ${err.message}`);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return modifiedFiles;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Normalize date fields in WU object to prevent date corruption
|
|
100
|
+
*
|
|
101
|
+
* WU-1442: js-yaml parses unquoted YYYY-MM-DD dates as Date objects.
|
|
102
|
+
* When yaml.dump() serializes them back, it outputs ISO timestamps.
|
|
103
|
+
* This function normalizes Date objects back to YYYY-MM-DD strings.
|
|
104
|
+
*/
|
|
105
|
+
export function normalizeWUDates(wu) {
|
|
106
|
+
if (wu.created !== undefined) {
|
|
107
|
+
wu.created = normalizeToDateString(wu.created);
|
|
108
|
+
}
|
|
109
|
+
return wu;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Merge array values: replace by default, append if --append flag is set (WU-1388)
|
|
113
|
+
*/
|
|
114
|
+
export function mergeArrayField(existing, newValues, shouldAppend) {
|
|
115
|
+
if (!shouldAppend) {
|
|
116
|
+
return newValues;
|
|
117
|
+
}
|
|
118
|
+
const existingArray = Array.isArray(existing) ? existing : [];
|
|
119
|
+
return [...existingArray, ...newValues];
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* WU-1144: Merge string field values with append-by-default behavior
|
|
123
|
+
*
|
|
124
|
+
* Notes and acceptance criteria should append by default (preserving original),
|
|
125
|
+
* with explicit --replace-notes and --replace-acceptance flags for overwrite.
|
|
126
|
+
*/
|
|
127
|
+
export function mergeStringField(existing, newValue, shouldReplace) {
|
|
128
|
+
// If replace mode or no existing value, just use new value
|
|
129
|
+
if (shouldReplace || !existing || existing.trim() === '') {
|
|
130
|
+
return newValue;
|
|
131
|
+
}
|
|
132
|
+
// Append with double newline separator
|
|
133
|
+
return `${existing}\n\n${newValue}`;
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* WU-1594: Ensure wu:edit commits always include regenerated backlog projection.
|
|
137
|
+
*/
|
|
138
|
+
export function getWuEditCommitFiles(id, extraFiles = []) {
|
|
139
|
+
return [...new Set([WU_PATHS.WU(id), ...extraFiles, WU_PATHS.BACKLOG()])];
|
|
140
|
+
}
|
|
141
|
+
/**
|
|
142
|
+
* WU-1594: Regenerate backlog.md from state store after wu:edit updates.
|
|
143
|
+
*/
|
|
144
|
+
export async function regenerateBacklogFromState(backlogPath) {
|
|
145
|
+
const stateDir = getStateStoreDirFromBacklog(backlogPath);
|
|
146
|
+
const store = new WUStateStore(stateDir);
|
|
147
|
+
await store.load();
|
|
148
|
+
const content = await generateBacklog(store);
|
|
149
|
+
writeFileSync(backlogPath, content, { encoding: FILE_SYSTEM.ENCODING });
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Load spec file and merge with original WU (preserving id and status)
|
|
153
|
+
*/
|
|
154
|
+
function loadSpecFile(specPath, originalWU) {
|
|
155
|
+
const resolvedPath = resolve(specPath);
|
|
156
|
+
if (!existsSync(resolvedPath)) {
|
|
157
|
+
die(`Spec file not found: ${resolvedPath}`);
|
|
158
|
+
}
|
|
159
|
+
const specContent = readFileSync(resolvedPath, {
|
|
160
|
+
encoding: FILE_SYSTEM.ENCODING,
|
|
161
|
+
});
|
|
162
|
+
const newSpec = parseYAML(specContent);
|
|
163
|
+
// Preserve id and status from original (cannot be changed via edit)
|
|
164
|
+
return {
|
|
165
|
+
...newSpec,
|
|
166
|
+
id: originalWU.id,
|
|
167
|
+
status: originalWU.status,
|
|
168
|
+
};
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Apply edits to WU YAML
|
|
172
|
+
* Returns the updated WU object
|
|
173
|
+
*/
|
|
174
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity -- Pre-existing complexity, refactor tracked separately
|
|
175
|
+
export function applyEdits(wu, opts) {
|
|
176
|
+
// Full spec replacement from file
|
|
177
|
+
if (opts.specFile) {
|
|
178
|
+
return loadSpecFile(opts.specFile, wu);
|
|
179
|
+
}
|
|
180
|
+
const updated = { ...wu };
|
|
181
|
+
// Field-level updates
|
|
182
|
+
if (opts.description) {
|
|
183
|
+
updated.description = opts.description;
|
|
184
|
+
}
|
|
185
|
+
// WU-1144: Handle --acceptance with append-by-default behavior
|
|
186
|
+
// Appends to existing acceptance criteria unless --replace-acceptance is set
|
|
187
|
+
if (opts.acceptance && opts.acceptance.length > 0) {
|
|
188
|
+
// Invert the logic: append by default, replace with --replace-acceptance
|
|
189
|
+
const shouldAppend = !opts.replaceAcceptance;
|
|
190
|
+
updated.acceptance = mergeArrayField(wu.acceptance, opts.acceptance, shouldAppend);
|
|
191
|
+
}
|
|
192
|
+
// WU-1144: Handle --notes with append-by-default behavior
|
|
193
|
+
// Appends to existing notes unless --replace-notes is set
|
|
194
|
+
if (opts.notes) {
|
|
195
|
+
updated.notes = mergeStringField(wu.notes, opts.notes, opts.replaceNotes ?? false);
|
|
196
|
+
}
|
|
197
|
+
// WU-1456: Handle lane reassignment
|
|
198
|
+
if (opts.lane) {
|
|
199
|
+
validateLaneFormat(opts.lane);
|
|
200
|
+
updated.lane = opts.lane;
|
|
201
|
+
}
|
|
202
|
+
// WU-1620: Handle type and priority updates
|
|
203
|
+
if (opts.type) {
|
|
204
|
+
updated.type = opts.type;
|
|
205
|
+
}
|
|
206
|
+
if (opts.priority) {
|
|
207
|
+
updated.priority = opts.priority;
|
|
208
|
+
}
|
|
209
|
+
// WU-1929: Handle initiative and phase updates
|
|
210
|
+
// Note: Initiative bidirectional updates (initiative wus: arrays) are handled separately
|
|
211
|
+
// in the main function after applyEdits, since they require file I/O
|
|
212
|
+
if (opts.initiative) {
|
|
213
|
+
validateInitiativeFormat(opts.initiative);
|
|
214
|
+
validateInitiativeExists(opts.initiative);
|
|
215
|
+
updated.initiative = opts.initiative;
|
|
216
|
+
}
|
|
217
|
+
if (opts.phase !== undefined && opts.phase !== null) {
|
|
218
|
+
const phaseNum = parseInt(opts.phase, 10);
|
|
219
|
+
if (isNaN(phaseNum) || phaseNum < 1) {
|
|
220
|
+
die(`Invalid phase number: "${opts.phase}"\n\nPhase must be a positive integer (e.g., 1, 2, 3)`);
|
|
221
|
+
}
|
|
222
|
+
updated.phase = phaseNum;
|
|
223
|
+
}
|
|
224
|
+
// Handle repeatable --code-paths flags (WU-1225: append by default, replace with --replace-code-paths)
|
|
225
|
+
// WU-1816: Split comma-separated string into array (same pattern as test paths)
|
|
226
|
+
// WU-1870: Fix to split comma-separated values WITHIN array elements (Commander passes ['a,b'] not 'a,b')
|
|
227
|
+
if (opts.codePaths && opts.codePaths.length > 0) {
|
|
228
|
+
const rawCodePaths = opts.codePaths;
|
|
229
|
+
const codePaths = Array.isArray(rawCodePaths)
|
|
230
|
+
? rawCodePaths
|
|
231
|
+
.flatMap((p) => p.split(','))
|
|
232
|
+
.map((p) => p.trim())
|
|
233
|
+
.filter(Boolean)
|
|
234
|
+
: rawCodePaths
|
|
235
|
+
.split(',')
|
|
236
|
+
.map((p) => p.trim())
|
|
237
|
+
.filter(Boolean);
|
|
238
|
+
// WU-1225: Invert logic - append by default, replace with --replace-code-paths
|
|
239
|
+
// Also support legacy --append flag for backwards compatibility
|
|
240
|
+
const shouldAppend = !opts.replaceCodePaths || opts.append;
|
|
241
|
+
updated.code_paths = mergeArrayField(wu.code_paths, codePaths, shouldAppend);
|
|
242
|
+
}
|
|
243
|
+
// WU-1225: Handle repeatable --risks flags (append by default, replace with --replace-risks)
|
|
244
|
+
// Split comma-separated values within each entry for consistency with other list fields
|
|
245
|
+
if (opts.risks && opts.risks.length > 0) {
|
|
246
|
+
const rawRisks = opts.risks;
|
|
247
|
+
const risks = Array.isArray(rawRisks)
|
|
248
|
+
? rawRisks
|
|
249
|
+
.flatMap((risk) => risk.split(','))
|
|
250
|
+
.map((risk) => risk.trim())
|
|
251
|
+
.filter(Boolean)
|
|
252
|
+
: rawRisks
|
|
253
|
+
.split(',')
|
|
254
|
+
.map((risk) => risk.trim())
|
|
255
|
+
.filter(Boolean);
|
|
256
|
+
// WU-1225: Invert logic - append by default
|
|
257
|
+
const shouldAppend = !opts.replaceRisks || opts.append;
|
|
258
|
+
updated.risks = mergeArrayField(wu.risks, risks, shouldAppend);
|
|
259
|
+
}
|
|
260
|
+
// WU-1390: Handle test path flags (DRY refactor)
|
|
261
|
+
// WU-1225: Test paths now append by default (consistent with --acceptance and --code-paths)
|
|
262
|
+
const testPathMappings = [
|
|
263
|
+
{ optKey: 'testPathsManual', field: 'manual' },
|
|
264
|
+
{ optKey: 'testPathsUnit', field: 'unit' },
|
|
265
|
+
{ optKey: 'testPathsE2e', field: 'e2e' },
|
|
266
|
+
];
|
|
267
|
+
for (const { optKey, field } of testPathMappings) {
|
|
268
|
+
const rawPaths = opts[optKey];
|
|
269
|
+
if (rawPaths && rawPaths.length > 0) {
|
|
270
|
+
// Split comma-separated string into array (options are comma-separated per description)
|
|
271
|
+
// WU-1870: Fix to split comma-separated values WITHIN array elements
|
|
272
|
+
const paths = Array.isArray(rawPaths)
|
|
273
|
+
? rawPaths
|
|
274
|
+
.flatMap((p) => p.split(','))
|
|
275
|
+
.map((p) => p.trim())
|
|
276
|
+
.filter(Boolean)
|
|
277
|
+
: rawPaths
|
|
278
|
+
.split(',')
|
|
279
|
+
.map((p) => p.trim())
|
|
280
|
+
.filter(Boolean);
|
|
281
|
+
updated.tests = updated.tests || {};
|
|
282
|
+
// WU-1225: Append by default (no individual replace flags for test paths yet)
|
|
283
|
+
const shouldAppend = true;
|
|
284
|
+
updated.tests[field] = mergeArrayField(wu.tests?.[field], paths, shouldAppend);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
// WU-2564: Handle --blocked-by flag
|
|
288
|
+
// WU-1225: Append by default, replace with --replace-blocked-by
|
|
289
|
+
if (opts.blockedBy) {
|
|
290
|
+
const rawBlockedBy = opts.blockedBy;
|
|
291
|
+
const blockedByIds = rawBlockedBy
|
|
292
|
+
.split(',')
|
|
293
|
+
.map((id) => id.trim())
|
|
294
|
+
.filter(Boolean);
|
|
295
|
+
const shouldAppend = !opts.replaceBlockedBy || opts.append;
|
|
296
|
+
updated.blocked_by = mergeArrayField(wu.blocked_by, blockedByIds, shouldAppend);
|
|
297
|
+
}
|
|
298
|
+
// WU-2564: Handle --add-dep flag
|
|
299
|
+
// WU-1225: Append by default, replace with --replace-dependencies
|
|
300
|
+
if (opts.addDep) {
|
|
301
|
+
const rawAddDep = opts.addDep;
|
|
302
|
+
const depIds = rawAddDep
|
|
303
|
+
.split(',')
|
|
304
|
+
.map((id) => id.trim())
|
|
305
|
+
.filter(Boolean);
|
|
306
|
+
const shouldAppend = !opts.replaceDependencies || opts.append;
|
|
307
|
+
updated.dependencies = mergeArrayField(wu.dependencies, depIds, shouldAppend);
|
|
308
|
+
}
|
|
309
|
+
// WU-1039: Handle --exposure flag with validation
|
|
310
|
+
if (opts.exposure) {
|
|
311
|
+
const exposureResult = validateExposureValue(opts.exposure);
|
|
312
|
+
if (!exposureResult.valid) {
|
|
313
|
+
die(exposureResult.error);
|
|
314
|
+
}
|
|
315
|
+
updated.exposure = opts.exposure;
|
|
316
|
+
}
|
|
317
|
+
// WU-1683: Handle --plan flag (simple scalar replacement)
|
|
318
|
+
if (opts.plan) {
|
|
319
|
+
updated.plan = opts.plan;
|
|
320
|
+
}
|
|
321
|
+
return updated;
|
|
322
|
+
}
|
|
323
|
+
export async function applyEditsInWorktree({ worktreePath, id, updatedWU }) {
|
|
324
|
+
const wuPath = join(worktreePath, WU_PATHS.WU(id));
|
|
325
|
+
// WU-1442: Normalize dates before dumping to prevent ISO timestamp corruption
|
|
326
|
+
normalizeWUDates(updatedWU);
|
|
327
|
+
// Emergency fix Session 2: Use centralized stringifyYAML helper
|
|
328
|
+
const yamlContent = stringifyYAML(updatedWU);
|
|
329
|
+
writeFileSync(wuPath, yamlContent, { encoding: FILE_SYSTEM.ENCODING });
|
|
330
|
+
console.log(`${PREFIX} Updated ${id}.yaml in worktree`);
|
|
331
|
+
// Format the file
|
|
332
|
+
try {
|
|
333
|
+
execSync(`${PKG_MANAGER} ${SCRIPTS.PRETTIER} ${PRETTIER_FLAGS.WRITE} "${wuPath}"`, {
|
|
334
|
+
cwd: worktreePath,
|
|
335
|
+
encoding: FILE_SYSTEM.ENCODING,
|
|
336
|
+
stdio: 'pipe',
|
|
337
|
+
});
|
|
338
|
+
console.log(`${PREFIX} Formatted ${id}.yaml`);
|
|
339
|
+
}
|
|
340
|
+
catch (err) {
|
|
341
|
+
console.warn(`${PREFIX} Could not format file: ${err.message}`);
|
|
342
|
+
}
|
|
343
|
+
// Stage and commit using git adapter (library-first)
|
|
344
|
+
const commitMsg = COMMIT_FORMATS.SPEC_UPDATE(id);
|
|
345
|
+
try {
|
|
346
|
+
const gitAdapter = createGitForPath(worktreePath);
|
|
347
|
+
await gitAdapter.add(wuPath);
|
|
348
|
+
await gitAdapter.commit(commitMsg);
|
|
349
|
+
console.log(`${PREFIX} Committed: ${commitMsg}`);
|
|
350
|
+
}
|
|
351
|
+
catch (err) {
|
|
352
|
+
die(`Failed to commit edit in worktree.\n\n` +
|
|
353
|
+
`Error: ${err.message}\n\n` +
|
|
354
|
+
`The WU file was updated but could not be committed.\n` +
|
|
355
|
+
`You may need to commit manually in the worktree.`);
|
|
356
|
+
}
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* WU-1620: Display readiness summary after edit
|
|
360
|
+
*
|
|
361
|
+
* Shows whether WU is ready for wu:claim based on spec completeness.
|
|
362
|
+
* Non-blocking - just informational to help agents understand what's missing.
|
|
363
|
+
*/
|
|
364
|
+
export function displayReadinessSummary(id) {
|
|
365
|
+
try {
|
|
366
|
+
const wuPath = WU_PATHS.WU(id);
|
|
367
|
+
const wuDoc = readWU(wuPath, id);
|
|
368
|
+
const { valid, errors } = validateSpecCompleteness(wuDoc, id);
|
|
369
|
+
const { BOX, BOX_WIDTH, MESSAGES, ERROR_MAX_LENGTH, ERROR_TRUNCATE_LENGTH, TRUNCATION_SUFFIX, PADDING, } = READINESS_UI;
|
|
370
|
+
console.log(`\n${BOX.TOP_LEFT}${BOX.HORIZONTAL.repeat(BOX_WIDTH)}${BOX.TOP_RIGHT}`);
|
|
371
|
+
if (valid) {
|
|
372
|
+
console.log(`${BOX.VERTICAL} ${MESSAGES.READY_YES}${''.padEnd(PADDING.READY_YES)}${BOX.VERTICAL}`);
|
|
373
|
+
console.log(`${BOX.VERTICAL}${''.padEnd(BOX_WIDTH)}${BOX.VERTICAL}`);
|
|
374
|
+
const claimCmd = `Run: pnpm wu:claim --id ${id}`;
|
|
375
|
+
console.log(`${BOX.VERTICAL} ${claimCmd}${''.padEnd(BOX_WIDTH - claimCmd.length - 1)}${BOX.VERTICAL}`);
|
|
376
|
+
}
|
|
377
|
+
else {
|
|
378
|
+
console.log(`${BOX.VERTICAL} ${MESSAGES.READY_NO}${''.padEnd(PADDING.READY_NO)}${BOX.VERTICAL}`);
|
|
379
|
+
console.log(`${BOX.VERTICAL}${''.padEnd(BOX_WIDTH)}${BOX.VERTICAL}`);
|
|
380
|
+
console.log(`${BOX.VERTICAL} ${MESSAGES.MISSING_HEADER}${''.padEnd(PADDING.MISSING_HEADER)}${BOX.VERTICAL}`);
|
|
381
|
+
for (const error of errors) {
|
|
382
|
+
// Truncate long error messages to fit box
|
|
383
|
+
const truncated = error.length > ERROR_MAX_LENGTH
|
|
384
|
+
? `${error.substring(0, ERROR_TRUNCATE_LENGTH)}${TRUNCATION_SUFFIX}`
|
|
385
|
+
: error;
|
|
386
|
+
console.log(`${BOX.VERTICAL} ${MESSAGES.BULLET} ${truncated}${''.padEnd(Math.max(0, PADDING.ERROR_BULLET - truncated.length))}${BOX.VERTICAL}`);
|
|
387
|
+
}
|
|
388
|
+
console.log(`${BOX.VERTICAL}${''.padEnd(BOX_WIDTH)}${BOX.VERTICAL}`);
|
|
389
|
+
const editCmd = `Run: pnpm wu:edit --id ${id} --help`;
|
|
390
|
+
console.log(`${BOX.VERTICAL} ${editCmd}${''.padEnd(BOX_WIDTH - editCmd.length - 1)}${BOX.VERTICAL}`);
|
|
391
|
+
}
|
|
392
|
+
console.log(`${BOX.BOTTOM_LEFT}${BOX.HORIZONTAL.repeat(BOX_WIDTH)}${BOX.BOTTOM_RIGHT}`);
|
|
393
|
+
}
|
|
394
|
+
catch (err) {
|
|
395
|
+
// Non-blocking - if validation fails, just warn
|
|
396
|
+
console.warn(`${PREFIX} Could not validate readiness: ${err.message}`);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
//# sourceMappingURL=wu-edit-operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wu-edit-operations.js","sourceRoot":"","sources":["../src/wu-edit-operations.ts"],"names":[],"mappings":"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"}
|