@lumenflow/cli 2.11.0 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -17
- package/dist/__tests__/commands.test.js +198 -2
- package/dist/__tests__/init-docs-structure.test.js +33 -0
- package/dist/__tests__/initiative-add-wu.test.js +71 -1
- package/dist/__tests__/no-beacon-references-docs.test.js +30 -0
- package/dist/__tests__/no-beacon-references.test.js +39 -0
- package/dist/__tests__/wu-create.test.js +50 -1
- package/dist/__tests__/wu-done-docs-only-policy.test.js +20 -0
- package/dist/__tests__/wu-prep-default-exec.test.js +35 -0
- package/dist/__tests__/wu-prep.test.js +32 -0
- package/dist/__tests__/wu-validate.test.js +36 -0
- package/dist/agent-issues-query.js +1 -0
- package/dist/agent-issues-query.js.map +1 -0
- package/dist/agent-log-issue.js +1 -0
- package/dist/agent-log-issue.js.map +1 -0
- package/dist/agent-session-end.js +1 -0
- package/dist/agent-session-end.js.map +1 -0
- package/dist/agent-session.js +1 -0
- package/dist/agent-session.js.map +1 -0
- package/dist/backlog-prune.js +2 -0
- package/dist/backlog-prune.js.map +1 -0
- package/dist/cli-entry-point.js +1 -0
- package/dist/cli-entry-point.js.map +1 -0
- package/dist/commands/integrate.js +1 -0
- package/dist/commands/integrate.js.map +1 -0
- package/dist/commands.js +56 -77
- package/dist/commands.js.map +1 -0
- package/dist/deps-add.js +1 -0
- package/dist/deps-add.js.map +1 -0
- package/dist/deps-remove.js +1 -0
- package/dist/deps-remove.js.map +1 -0
- package/dist/docs-sync.js +1 -0
- package/dist/docs-sync.js.map +1 -0
- package/dist/doctor.js +1 -0
- package/dist/doctor.js.map +1 -0
- package/dist/file-delete.js +1 -0
- package/dist/file-delete.js.map +1 -0
- package/dist/file-edit.js +1 -0
- package/dist/file-edit.js.map +1 -0
- package/dist/file-read.js +1 -0
- package/dist/file-read.js.map +1 -0
- package/dist/file-write.js +1 -0
- package/dist/file-write.js.map +1 -0
- package/dist/flow-bottlenecks.js +1 -0
- package/dist/flow-bottlenecks.js.map +1 -0
- package/dist/flow-report.js +1 -0
- package/dist/flow-report.js.map +1 -0
- package/dist/gates.js +26 -12
- package/dist/gates.js.map +1 -0
- package/dist/git-branch.js +1 -0
- package/dist/git-branch.js.map +1 -0
- package/dist/git-diff.js +1 -0
- package/dist/git-diff.js.map +1 -0
- package/dist/git-log.js +1 -0
- package/dist/git-log.js.map +1 -0
- package/dist/git-status.js +1 -0
- package/dist/git-status.js.map +1 -0
- package/dist/guard-locked.js +1 -0
- package/dist/guard-locked.js.map +1 -0
- package/dist/guard-main-branch.js +1 -0
- package/dist/guard-main-branch.js.map +1 -0
- package/dist/guard-worktree-commit.js +1 -0
- package/dist/guard-worktree-commit.js.map +1 -0
- package/dist/hooks/auto-checkpoint-utils.js +52 -0
- package/dist/hooks/auto-checkpoint-utils.js.map +1 -0
- package/dist/hooks/enforcement-checks.js +1 -0
- package/dist/hooks/enforcement-checks.js.map +1 -0
- package/dist/hooks/enforcement-generator.js +185 -1
- package/dist/hooks/enforcement-generator.js.map +1 -0
- package/dist/hooks/enforcement-sync.js +91 -1
- package/dist/hooks/enforcement-sync.js.map +1 -0
- package/dist/hooks/index.js +1 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -0
- package/dist/init.js +32 -36
- package/dist/init.js.map +1 -0
- package/dist/initiative-add-wu.js +180 -59
- package/dist/initiative-add-wu.js.map +1 -0
- package/dist/initiative-bulk-assign-wus.js +3 -1
- package/dist/initiative-bulk-assign-wus.js.map +1 -0
- package/dist/initiative-create.js +1 -0
- package/dist/initiative-create.js.map +1 -0
- package/dist/initiative-edit.js +67 -32
- package/dist/initiative-edit.js.map +1 -0
- package/dist/initiative-list.js +1 -0
- package/dist/initiative-list.js.map +1 -0
- package/dist/initiative-plan.js +1 -0
- package/dist/initiative-plan.js.map +1 -0
- package/dist/initiative-remove-wu.js +1 -0
- package/dist/initiative-remove-wu.js.map +1 -0
- package/dist/initiative-status.js +1 -0
- package/dist/initiative-status.js.map +1 -0
- package/dist/lane-health.js +1 -0
- package/dist/lane-health.js.map +1 -0
- package/dist/lane-suggest.js +1 -0
- package/dist/lane-suggest.js.map +1 -0
- package/dist/lumenflow-upgrade.js +1 -0
- package/dist/lumenflow-upgrade.js.map +1 -0
- package/dist/mem-checkpoint.js +1 -0
- package/dist/mem-checkpoint.js.map +1 -0
- package/dist/mem-cleanup.js +114 -1
- package/dist/mem-cleanup.js.map +1 -0
- package/dist/mem-context.js +1 -0
- package/dist/mem-context.js.map +1 -0
- package/dist/mem-create.js +1 -0
- package/dist/mem-create.js.map +1 -0
- package/dist/mem-delete.js +1 -0
- package/dist/mem-delete.js.map +1 -0
- package/dist/mem-export.js +1 -0
- package/dist/mem-export.js.map +1 -0
- package/dist/mem-inbox.js +1 -0
- package/dist/mem-inbox.js.map +1 -0
- package/dist/mem-index.js +1 -0
- package/dist/mem-index.js.map +1 -0
- package/dist/mem-init.js +1 -0
- package/dist/mem-init.js.map +1 -0
- package/dist/mem-profile.js +1 -0
- package/dist/mem-profile.js.map +1 -0
- package/dist/mem-promote.js +1 -0
- package/dist/mem-promote.js.map +1 -0
- package/dist/mem-ready.js +1 -0
- package/dist/mem-ready.js.map +1 -0
- package/dist/mem-recover.js +1 -0
- package/dist/mem-recover.js.map +1 -0
- package/dist/mem-signal.js +12 -1
- package/dist/mem-signal.js.map +1 -0
- package/dist/mem-start.js +1 -0
- package/dist/mem-start.js.map +1 -0
- package/dist/mem-summarize.js +1 -0
- package/dist/mem-summarize.js.map +1 -0
- package/dist/mem-triage.js +2 -1
- package/dist/mem-triage.js.map +1 -0
- package/dist/merge-block.js +1 -0
- package/dist/merge-block.js.map +1 -0
- package/dist/metrics-cli.js +1 -0
- package/dist/metrics-cli.js.map +1 -0
- package/dist/metrics-snapshot.js +1 -0
- package/dist/metrics-snapshot.js.map +1 -0
- package/dist/onboarding-smoke-test.js +1 -0
- package/dist/onboarding-smoke-test.js.map +1 -0
- package/dist/orchestrate-init-status.js +1 -0
- package/dist/orchestrate-init-status.js.map +1 -0
- package/dist/orchestrate-initiative.js +1 -0
- package/dist/orchestrate-initiative.js.map +1 -0
- package/dist/orchestrate-monitor.js +1 -0
- package/dist/orchestrate-monitor.js.map +1 -0
- package/dist/plan-create.js +1 -0
- package/dist/plan-create.js.map +1 -0
- package/dist/plan-edit.js +1 -0
- package/dist/plan-edit.js.map +1 -0
- package/dist/plan-link.js +1 -0
- package/dist/plan-link.js.map +1 -0
- package/dist/plan-promote.js +1 -0
- package/dist/plan-promote.js.map +1 -0
- package/dist/public-manifest.js +773 -0
- package/dist/public-manifest.js.map +1 -0
- package/dist/release.js +3 -2
- package/dist/release.js.map +1 -0
- package/dist/rotate-progress.js +2 -1
- package/dist/rotate-progress.js.map +1 -0
- package/dist/session-coordinator.js +1 -0
- package/dist/session-coordinator.js.map +1 -0
- package/dist/shared-validators.js +78 -0
- package/dist/shared-validators.js.map +1 -0
- package/dist/signal-cleanup.js +1 -0
- package/dist/signal-cleanup.js.map +1 -0
- package/dist/spawn-list.js +1 -0
- package/dist/spawn-list.js.map +1 -0
- package/dist/state-bootstrap.js +1 -0
- package/dist/state-bootstrap.js.map +1 -0
- package/dist/state-cleanup.js +1 -0
- package/dist/state-cleanup.js.map +1 -0
- package/dist/state-doctor-fix.js +1 -0
- package/dist/state-doctor-fix.js.map +1 -0
- package/dist/state-doctor.js +1 -0
- package/dist/state-doctor.js.map +1 -0
- package/dist/sync-templates.js +1 -0
- package/dist/sync-templates.js.map +1 -0
- package/dist/trace-gen.js +1 -0
- package/dist/trace-gen.js.map +1 -0
- package/dist/validate-agent-skills.js +1 -0
- package/dist/validate-agent-skills.js.map +1 -0
- package/dist/validate-agent-sync.js +1 -0
- package/dist/validate-agent-sync.js.map +1 -0
- package/dist/validate-backlog-sync.js +1 -0
- package/dist/validate-backlog-sync.js.map +1 -0
- package/dist/validate-skills-spec.js +1 -0
- package/dist/validate-skills-spec.js.map +1 -0
- package/dist/validate.js +1 -0
- package/dist/validate.js.map +1 -0
- package/dist/wu-block.js +1 -0
- package/dist/wu-block.js.map +1 -0
- package/dist/wu-claim-repair-guidance.js +10 -0
- package/dist/wu-claim-repair-guidance.js.map +1 -0
- package/dist/wu-claim.js +40 -0
- package/dist/wu-claim.js.map +1 -0
- package/dist/wu-cleanup.js +2 -1
- package/dist/wu-cleanup.js.map +1 -0
- package/dist/wu-create.js +58 -14
- package/dist/wu-create.js.map +1 -0
- package/dist/wu-delete.js +3 -2
- package/dist/wu-delete.js.map +1 -0
- package/dist/wu-deps.js +2 -1
- package/dist/wu-deps.js.map +1 -0
- package/dist/wu-done-auto-cleanup.js +1 -0
- package/dist/wu-done-auto-cleanup.js.map +1 -0
- package/dist/wu-done-check.js +1 -0
- package/dist/wu-done-check.js.map +1 -0
- package/dist/wu-done-decay.js +88 -0
- package/dist/wu-done-decay.js.map +1 -0
- package/dist/wu-done.js +75 -18
- package/dist/wu-done.js.map +1 -0
- package/dist/wu-edit.js +2 -1
- package/dist/wu-edit.js.map +1 -0
- package/dist/wu-infer-lane.js +1 -0
- package/dist/wu-infer-lane.js.map +1 -0
- package/dist/wu-preflight.js +1 -0
- package/dist/wu-preflight.js.map +1 -0
- package/dist/wu-prep.js +105 -9
- package/dist/wu-prep.js.map +1 -0
- package/dist/wu-proto.js +12 -9
- package/dist/wu-proto.js.map +1 -0
- package/dist/wu-prune.js +1 -0
- package/dist/wu-prune.js.map +1 -0
- package/dist/wu-recover.js +1 -0
- package/dist/wu-recover.js.map +1 -0
- package/dist/wu-release.js +2 -1
- package/dist/wu-release.js.map +1 -0
- package/dist/wu-repair.js +1 -0
- package/dist/wu-repair.js.map +1 -0
- package/dist/wu-spawn-completion.js +1 -0
- package/dist/wu-spawn-completion.js.map +1 -0
- package/dist/wu-spawn.js +1 -0
- package/dist/wu-spawn.js.map +1 -0
- package/dist/wu-status.js +1 -0
- package/dist/wu-status.js.map +1 -0
- package/dist/wu-unblock.js +1 -0
- package/dist/wu-unblock.js.map +1 -0
- package/dist/wu-unlock-lane.js +1 -0
- package/dist/wu-unlock-lane.js.map +1 -0
- package/dist/wu-validate.js +58 -9
- package/dist/wu-validate.js.map +1 -0
- package/package.json +11 -21
- package/templates/core/.husky/pre-commit.template +5 -5
- package/templates/core/LUMENFLOW.md.template +2 -2
- package/templates/core/ai/onboarding/agent-safety-card.md.template +6 -6
- package/templates/core/ai/onboarding/lumenflow-force-usage.md.template +4 -4
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
* .claude/settings.json to enforce LumenFlow workflow compliance.
|
|
7
7
|
*/
|
|
8
8
|
import { CLAUDE_HOOKS, getHookCommand } from '@lumenflow/core';
|
|
9
|
+
import { loadSignals, markSignalsAsRead } from '@lumenflow/memory/dist/mem-signal-core.js';
|
|
9
10
|
// Re-export for backwards compatibility (WU-1394)
|
|
10
11
|
export const HOOK_SCRIPTS = CLAUDE_HOOKS.SCRIPTS;
|
|
11
12
|
/**
|
|
@@ -56,6 +57,27 @@ export function generateEnforcementHooks(config) {
|
|
|
56
57
|
},
|
|
57
58
|
];
|
|
58
59
|
}
|
|
60
|
+
// WU-1471: Generate PostToolUse and SubagentStop hooks for auto-checkpoint
|
|
61
|
+
if (config.auto_checkpoint?.enabled) {
|
|
62
|
+
const autoCheckpointHook = {
|
|
63
|
+
type: 'command',
|
|
64
|
+
command: getHookCommand(HOOK_SCRIPTS.AUTO_CHECKPOINT),
|
|
65
|
+
};
|
|
66
|
+
// PostToolUse: fires after every tool call, counter tracks interval
|
|
67
|
+
hooks.postToolUse = [
|
|
68
|
+
{
|
|
69
|
+
matcher: CLAUDE_HOOKS.MATCHERS.ALL,
|
|
70
|
+
hooks: [autoCheckpointHook],
|
|
71
|
+
},
|
|
72
|
+
];
|
|
73
|
+
// SubagentStop: fires when a sub-agent finishes, always checkpoint
|
|
74
|
+
hooks.subagentStop = [
|
|
75
|
+
{
|
|
76
|
+
matcher: CLAUDE_HOOKS.MATCHERS.SUBAGENT_STOP,
|
|
77
|
+
hooks: [autoCheckpointHook],
|
|
78
|
+
},
|
|
79
|
+
];
|
|
80
|
+
}
|
|
59
81
|
// Always generate PreCompact and SessionStart recovery hooks (WU-1394)
|
|
60
82
|
// These enable durable context recovery after compaction
|
|
61
83
|
hooks.preCompact = [
|
|
@@ -483,7 +505,7 @@ except:
|
|
|
483
505
|
print('')
|
|
484
506
|
" 2>/dev/null || echo "")
|
|
485
507
|
|
|
486
|
-
#
|
|
508
|
+
# Proceed with worktree-based recovery if we have a WU ID
|
|
487
509
|
if [[ -n "\$WU_ID" ]]; then
|
|
488
510
|
# Save checkpoint with pre-compact trigger
|
|
489
511
|
# Note: This may fail if CLI not built, but that's OK - recovery file is more important
|
|
@@ -518,6 +540,16 @@ EOF
|
|
|
518
540
|
echo "Recovery context: \${RECOVERY_FILE}" >&2
|
|
519
541
|
echo "Next: pnpm wu:spawn --id \${WU_ID}" >&2
|
|
520
542
|
echo "═══════════════════════════════════════════════════════" >&2
|
|
543
|
+
else
|
|
544
|
+
# WU-1473: Non-worktree orchestrator context recovery
|
|
545
|
+
# When not in a worktree (e.g., orchestrator on main), surface unread inbox
|
|
546
|
+
# so agents have coordination context after compaction
|
|
547
|
+
echo "" >&2
|
|
548
|
+
echo "═══════════════════════════════════════════════════════" >&2
|
|
549
|
+
echo "⚠️ COMPACTION: No active WU detected (non-worktree context)" >&2
|
|
550
|
+
echo "Surfacing recent coordination signals via mem:inbox..." >&2
|
|
551
|
+
pnpm mem:inbox --since 1h --quiet 2>/dev/null >&2 || true
|
|
552
|
+
echo "═══════════════════════════════════════════════════════" >&2
|
|
521
553
|
fi
|
|
522
554
|
|
|
523
555
|
# Always exit 0 - cannot block compaction
|
|
@@ -610,7 +642,159 @@ if [[ "\$FOUND_RECOVERY" == "true" ]]; then
|
|
|
610
642
|
echo "" >&2
|
|
611
643
|
fi
|
|
612
644
|
|
|
645
|
+
# WU-1473: Surface unread coordination signals for non-worktree orchestrators
|
|
646
|
+
# Even without recovery files, agents benefit from seeing recent inbox activity
|
|
647
|
+
# This supports orchestrators running from main checkout (not in a worktree)
|
|
648
|
+
pnpm mem:inbox --since 1h --unread-only --quiet 2>/dev/null >&2 || true
|
|
649
|
+
|
|
650
|
+
exit 0
|
|
651
|
+
`;
|
|
652
|
+
/* eslint-enable no-useless-escape */
|
|
653
|
+
}
|
|
654
|
+
/**
|
|
655
|
+
* WU-1473: Surface unread signals for agent consumption during claim/start.
|
|
656
|
+
*
|
|
657
|
+
* Loads all unread signals from the memory layer and returns them for display.
|
|
658
|
+
* Implements fail-open: any error returns an empty result without throwing.
|
|
659
|
+
*
|
|
660
|
+
* @param baseDir - Project base directory
|
|
661
|
+
* @returns Unread signal summary (never throws)
|
|
662
|
+
*/
|
|
663
|
+
export async function surfaceUnreadSignals(baseDir) {
|
|
664
|
+
try {
|
|
665
|
+
const signals = await loadSignals(baseDir, { unreadOnly: true });
|
|
666
|
+
return { count: signals.length, signals };
|
|
667
|
+
}
|
|
668
|
+
catch {
|
|
669
|
+
// WU-1473 AC4: Fail-open - memory errors never block lifecycle commands
|
|
670
|
+
return { count: 0, signals: [] };
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
/**
|
|
674
|
+
* WU-1473: Mark all signals for a completed WU as read using receipt-aware behavior.
|
|
675
|
+
*
|
|
676
|
+
* Loads signals scoped to the given WU ID and marks any unread ones as read
|
|
677
|
+
* by appending receipts (WU-1472 pattern). Does not rewrite signals.jsonl.
|
|
678
|
+
* Implements fail-open: any error returns zero count without throwing.
|
|
679
|
+
*
|
|
680
|
+
* @param baseDir - Project base directory
|
|
681
|
+
* @param wuId - WU ID whose signals should be marked as read
|
|
682
|
+
* @returns Result with count of signals marked (never throws)
|
|
683
|
+
*/
|
|
684
|
+
export async function markCompletedWUSignalsAsRead(baseDir, wuId) {
|
|
685
|
+
try {
|
|
686
|
+
const signals = await loadSignals(baseDir, { wuId, unreadOnly: true });
|
|
687
|
+
if (signals.length === 0) {
|
|
688
|
+
return { markedCount: 0 };
|
|
689
|
+
}
|
|
690
|
+
const signalIds = signals.map((sig) => sig.id);
|
|
691
|
+
return await markSignalsAsRead(baseDir, signalIds);
|
|
692
|
+
}
|
|
693
|
+
catch {
|
|
694
|
+
// WU-1473 AC4: Fail-open - memory errors never block lifecycle commands
|
|
695
|
+
return { markedCount: 0 };
|
|
696
|
+
}
|
|
697
|
+
}
|
|
698
|
+
export function generateAutoCheckpointScript(intervalToolCalls) {
|
|
699
|
+
// Note: Shell variable escapes (\$, \") are intentional for the generated bash script
|
|
700
|
+
/* eslint-disable no-useless-escape */
|
|
701
|
+
return `#!/bin/bash
|
|
702
|
+
#
|
|
703
|
+
# auto-checkpoint.sh (WU-1471)
|
|
704
|
+
#
|
|
705
|
+
# PostToolUse + SubagentStop hook for automatic checkpointing.
|
|
706
|
+
# Branches on hook_event_name to decide behavior:
|
|
707
|
+
# - PostToolUse: counter-based checkpoint at interval
|
|
708
|
+
# - SubagentStop: always checkpoint (sub-agent completed work)
|
|
709
|
+
#
|
|
710
|
+
# Checkpoint writes are backgrounded in a defensive subshell
|
|
711
|
+
# to avoid blocking the agent.
|
|
712
|
+
#
|
|
713
|
+
# Exit codes:
|
|
714
|
+
# 0 = Always (never blocks tool execution)
|
|
715
|
+
#
|
|
716
|
+
|
|
717
|
+
# Fail-open: any error allows the operation to continue
|
|
718
|
+
set +e
|
|
719
|
+
|
|
720
|
+
INTERVAL=${intervalToolCalls}
|
|
721
|
+
|
|
722
|
+
# Derive repo paths
|
|
723
|
+
if [[ -z "\\\${CLAUDE_PROJECT_DIR:-}" ]]; then
|
|
724
|
+
exit 0
|
|
725
|
+
fi
|
|
726
|
+
|
|
727
|
+
REPO_PATH="\\\$CLAUDE_PROJECT_DIR"
|
|
728
|
+
LUMENFLOW_DIR="\\\${REPO_PATH}/.lumenflow"
|
|
729
|
+
COUNTERS_DIR="\\\${LUMENFLOW_DIR}/state/hook-counters"
|
|
730
|
+
|
|
731
|
+
# Check if LumenFlow is configured
|
|
732
|
+
if [[ ! -d "\\\$LUMENFLOW_DIR" ]]; then
|
|
733
|
+
exit 0
|
|
734
|
+
fi
|
|
735
|
+
|
|
736
|
+
# Detect WU ID from worktree context
|
|
737
|
+
WU_ID=""
|
|
738
|
+
CWD=\\\$(pwd 2>/dev/null || echo "")
|
|
739
|
+
if [[ "\\\$CWD" == *"/worktrees/"* ]]; then
|
|
740
|
+
# Extract WU ID from worktree path (e.g., worktrees/framework-cli-wu-1471)
|
|
741
|
+
WORKTREE_NAME=\\\$(basename "\\\$CWD")
|
|
742
|
+
WU_ID=\\\$(echo "\\\$WORKTREE_NAME" | grep -oiE 'wu-[0-9]+' | head -1 | tr '[:lower:]' '[:upper:]')
|
|
743
|
+
fi
|
|
744
|
+
|
|
745
|
+
if [[ -z "\\\$WU_ID" ]]; then
|
|
746
|
+
exit 0
|
|
747
|
+
fi
|
|
748
|
+
|
|
749
|
+
# Determine hook event name (set by Claude Code runtime)
|
|
750
|
+
HOOK_EVENT="\\\${hook_event_name:-PostToolUse}"
|
|
751
|
+
|
|
752
|
+
# Branch on event type
|
|
753
|
+
case "\\\$HOOK_EVENT" in
|
|
754
|
+
SubagentStop)
|
|
755
|
+
# Always checkpoint when sub-agent stops
|
|
756
|
+
(
|
|
757
|
+
pnpm mem:checkpoint "Auto: sub-agent completed" --wu "\\\$WU_ID" --trigger "subagent-stop" --quiet 2>/dev/null || true
|
|
758
|
+
) &
|
|
759
|
+
;;
|
|
760
|
+
*)
|
|
761
|
+
# PostToolUse (default): counter-based checkpointing
|
|
762
|
+
mkdir -p "\\\$COUNTERS_DIR" 2>/dev/null || true
|
|
763
|
+
COUNTER_FILE="\\\${COUNTERS_DIR}/\\\${WU_ID}.json"
|
|
764
|
+
|
|
765
|
+
# Read current count (default 0)
|
|
766
|
+
COUNT=0
|
|
767
|
+
if [[ -f "\\\$COUNTER_FILE" ]]; then
|
|
768
|
+
COUNT=\\\$(python3 -c "
|
|
769
|
+
import json
|
|
770
|
+
try:
|
|
771
|
+
with open('\\\$COUNTER_FILE', 'r') as f:
|
|
772
|
+
data = json.load(f)
|
|
773
|
+
print(data.get('count', 0))
|
|
774
|
+
except:
|
|
775
|
+
print(0)
|
|
776
|
+
" 2>/dev/null || echo "0")
|
|
777
|
+
fi
|
|
778
|
+
|
|
779
|
+
# Increment counter
|
|
780
|
+
COUNT=\\\$((COUNT + 1))
|
|
781
|
+
|
|
782
|
+
# Check if we've reached the interval
|
|
783
|
+
if [[ \\\$COUNT -ge \\\$INTERVAL ]]; then
|
|
784
|
+
# Reset counter and checkpoint in background
|
|
785
|
+
echo '{"count": 0}' > "\\\$COUNTER_FILE" 2>/dev/null || true
|
|
786
|
+
(
|
|
787
|
+
pnpm mem:checkpoint "Auto: \\\${COUNT} tool calls" --wu "\\\$WU_ID" --trigger "auto-interval" --quiet 2>/dev/null || true
|
|
788
|
+
) &
|
|
789
|
+
else
|
|
790
|
+
# Just update the counter
|
|
791
|
+
echo "{\\\\\\"count\\\\\\": \\\$COUNT}" > "\\\$COUNTER_FILE" 2>/dev/null || true
|
|
792
|
+
fi
|
|
793
|
+
;;
|
|
794
|
+
esac
|
|
795
|
+
|
|
613
796
|
exit 0
|
|
614
797
|
`;
|
|
615
798
|
/* eslint-enable no-useless-escape */
|
|
616
799
|
}
|
|
800
|
+
//# sourceMappingURL=enforcement-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforcement-generator.js","sourceRoot":"","sources":["../../src/hooks/enforcement-generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,7 +10,8 @@
|
|
|
10
10
|
import * as fs from 'node:fs';
|
|
11
11
|
import * as path from 'node:path';
|
|
12
12
|
import * as yaml from 'yaml';
|
|
13
|
-
import { generateEnforcementHooks, generateEnforceWorktreeScript, generateRequireWuScript, generateWarnIncompleteScript, generatePreCompactCheckpointScript, generateSessionStartRecoveryScript, HOOK_SCRIPTS, } from './enforcement-generator.js';
|
|
13
|
+
import { generateEnforcementHooks, generateEnforceWorktreeScript, generateRequireWuScript, generateWarnIncompleteScript, generatePreCompactCheckpointScript, generateSessionStartRecoveryScript, generateAutoCheckpointScript, HOOK_SCRIPTS, } from './enforcement-generator.js';
|
|
14
|
+
import { checkAutoCheckpointWarning } from './auto-checkpoint-utils.js';
|
|
14
15
|
/**
|
|
15
16
|
* Read LumenFlow configuration from .lumenflow.config.yaml
|
|
16
17
|
*
|
|
@@ -41,11 +42,20 @@ function getEnforcementConfig(config) {
|
|
|
41
42
|
if (!enforcement || !enforcement.hooks) {
|
|
42
43
|
return null;
|
|
43
44
|
}
|
|
45
|
+
// WU-1471: Extract auto-checkpoint config from memory.enforcement
|
|
46
|
+
const memoryEnforcement = config?.memory?.enforcement;
|
|
47
|
+
const autoCheckpoint = memoryEnforcement?.auto_checkpoint;
|
|
44
48
|
return {
|
|
45
49
|
hooks: enforcement.hooks ?? false,
|
|
46
50
|
block_outside_worktree: enforcement.block_outside_worktree ?? false,
|
|
47
51
|
require_wu_for_edits: enforcement.require_wu_for_edits ?? false,
|
|
48
52
|
warn_on_stop_without_wu_done: enforcement.warn_on_stop_without_wu_done ?? false,
|
|
53
|
+
auto_checkpoint: autoCheckpoint?.enabled
|
|
54
|
+
? {
|
|
55
|
+
enabled: true,
|
|
56
|
+
interval_tool_calls: autoCheckpoint.interval_tool_calls ?? 30,
|
|
57
|
+
}
|
|
58
|
+
: undefined,
|
|
49
59
|
};
|
|
50
60
|
}
|
|
51
61
|
/**
|
|
@@ -203,6 +213,48 @@ function mergeHooksIntoSettings(existing, generated) {
|
|
|
203
213
|
}
|
|
204
214
|
}
|
|
205
215
|
}
|
|
216
|
+
// WU-1471: Merge PostToolUse hooks (auto-checkpoint)
|
|
217
|
+
if (generated.postToolUse) {
|
|
218
|
+
if (!result.hooks.PostToolUse) {
|
|
219
|
+
result.hooks.PostToolUse = [];
|
|
220
|
+
}
|
|
221
|
+
for (const newHook of generated.postToolUse) {
|
|
222
|
+
const existingIndex = result.hooks.PostToolUse.findIndex((h) => h.matcher === newHook.matcher);
|
|
223
|
+
if (existingIndex >= 0) {
|
|
224
|
+
const existing = result.hooks.PostToolUse[existingIndex];
|
|
225
|
+
for (const hook of newHook.hooks) {
|
|
226
|
+
const isDuplicate = existing.hooks.some((h) => h.command === hook.command);
|
|
227
|
+
if (!isDuplicate) {
|
|
228
|
+
existing.hooks.push(hook);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
result.hooks.PostToolUse.push(newHook);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// WU-1471: Merge SubagentStop hooks (auto-checkpoint on sub-agent finish)
|
|
238
|
+
if (generated.subagentStop) {
|
|
239
|
+
if (!result.hooks.SubagentStop) {
|
|
240
|
+
result.hooks.SubagentStop = [];
|
|
241
|
+
}
|
|
242
|
+
for (const newHook of generated.subagentStop) {
|
|
243
|
+
const existingIndex = result.hooks.SubagentStop.findIndex((h) => h.matcher === newHook.matcher);
|
|
244
|
+
if (existingIndex >= 0) {
|
|
245
|
+
const existing = result.hooks.SubagentStop[existingIndex];
|
|
246
|
+
for (const hook of newHook.hooks) {
|
|
247
|
+
const isDuplicate = existing.hooks.some((h) => h.command === hook.command);
|
|
248
|
+
if (!isDuplicate) {
|
|
249
|
+
existing.hooks.push(hook);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
else {
|
|
254
|
+
result.hooks.SubagentStop.push(newHook);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
206
258
|
return result;
|
|
207
259
|
}
|
|
208
260
|
/**
|
|
@@ -225,11 +277,24 @@ export async function syncEnforcementHooks(projectDir) {
|
|
|
225
277
|
if (!enforcement || !enforcement.hooks) {
|
|
226
278
|
return false;
|
|
227
279
|
}
|
|
280
|
+
// WU-1471: Check for auto-checkpoint mismatch warning (AC5)
|
|
281
|
+
// Also check memory config independently for the case where hooks=true but
|
|
282
|
+
// auto_checkpoint config comes from memory.enforcement section
|
|
283
|
+
const memoryEnforcement = config?.memory?.enforcement;
|
|
284
|
+
const autoCheckpointEnabled = memoryEnforcement?.auto_checkpoint?.enabled ?? false;
|
|
285
|
+
const warningResult = checkAutoCheckpointWarning({
|
|
286
|
+
hooksEnabled: enforcement.hooks,
|
|
287
|
+
autoCheckpointEnabled,
|
|
288
|
+
});
|
|
289
|
+
if (warningResult.warning && warningResult.message) {
|
|
290
|
+
console.warn(`[enforcement-sync] ${warningResult.message}`);
|
|
291
|
+
}
|
|
228
292
|
// Generate hooks based on config
|
|
229
293
|
const generatedHooks = generateEnforcementHooks({
|
|
230
294
|
block_outside_worktree: enforcement.block_outside_worktree,
|
|
231
295
|
require_wu_for_edits: enforcement.require_wu_for_edits,
|
|
232
296
|
warn_on_stop_without_wu_done: enforcement.warn_on_stop_without_wu_done,
|
|
297
|
+
auto_checkpoint: enforcement.auto_checkpoint,
|
|
233
298
|
});
|
|
234
299
|
// Write hook scripts
|
|
235
300
|
if (enforcement.block_outside_worktree) {
|
|
@@ -241,6 +306,10 @@ export async function syncEnforcementHooks(projectDir) {
|
|
|
241
306
|
if (enforcement.warn_on_stop_without_wu_done) {
|
|
242
307
|
writeHookScript(projectDir, HOOK_SCRIPTS.WARN_INCOMPLETE, generateWarnIncompleteScript());
|
|
243
308
|
}
|
|
309
|
+
// WU-1471: Write auto-checkpoint hook script when enabled
|
|
310
|
+
if (enforcement.auto_checkpoint?.enabled) {
|
|
311
|
+
writeHookScript(projectDir, HOOK_SCRIPTS.AUTO_CHECKPOINT, generateAutoCheckpointScript(enforcement.auto_checkpoint.interval_tool_calls));
|
|
312
|
+
}
|
|
244
313
|
// Always write recovery hook scripts when enforcement.hooks is enabled (WU-1394)
|
|
245
314
|
// These enable durable context recovery after compaction
|
|
246
315
|
writeHookScript(projectDir, HOOK_SCRIPTS.PRE_COMPACT_CHECKPOINT, generatePreCompactCheckpointScript());
|
|
@@ -281,9 +350,30 @@ export async function removeEnforcementHooks(projectDir) {
|
|
|
281
350
|
delete settings.hooks.Stop;
|
|
282
351
|
}
|
|
283
352
|
}
|
|
353
|
+
// WU-1471: Remove PostToolUse hooks
|
|
354
|
+
if (settings.hooks.PostToolUse) {
|
|
355
|
+
settings.hooks.PostToolUse = settings.hooks.PostToolUse.map((entry) => ({
|
|
356
|
+
...entry,
|
|
357
|
+
hooks: entry.hooks.filter((h) => !enforcementCommands.some((cmd) => h.command.includes(cmd))),
|
|
358
|
+
})).filter((entry) => entry.hooks.length > 0);
|
|
359
|
+
if (settings.hooks.PostToolUse.length === 0) {
|
|
360
|
+
delete settings.hooks.PostToolUse;
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
// WU-1471: Remove SubagentStop hooks
|
|
364
|
+
if (settings.hooks.SubagentStop) {
|
|
365
|
+
settings.hooks.SubagentStop = settings.hooks.SubagentStop.map((entry) => ({
|
|
366
|
+
...entry,
|
|
367
|
+
hooks: entry.hooks.filter((h) => !enforcementCommands.some((cmd) => h.command.includes(cmd))),
|
|
368
|
+
})).filter((entry) => entry.hooks.length > 0);
|
|
369
|
+
if (settings.hooks.SubagentStop.length === 0) {
|
|
370
|
+
delete settings.hooks.SubagentStop;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
284
373
|
// Clean up empty hooks object
|
|
285
374
|
if (Object.keys(settings.hooks).length === 0) {
|
|
286
375
|
delete settings.hooks;
|
|
287
376
|
}
|
|
288
377
|
writeClaudeSettings(projectDir, settings);
|
|
289
378
|
}
|
|
379
|
+
//# sourceMappingURL=enforcement-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enforcement-sync.js","sourceRoot":"","sources":["../../src/hooks/enforcement-sync.ts"],"names":[],"mappings":"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"}
|
package/dist/hooks/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,4BAA4B,CAAC;AAC3C,cAAc,yBAAyB,CAAC;AACxC,cAAc,uBAAuB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC"}
|
package/dist/init.js
CHANGED
|
@@ -21,6 +21,8 @@ import { updateMergeBlock } from './merge-block.js';
|
|
|
21
21
|
import { isMainBranch, isInWorktree } from '@lumenflow/core/dist/core/worktree-guard.js';
|
|
22
22
|
// WU-1386: Import doctor for auto-run after init
|
|
23
23
|
import { runDoctorForInit } from './doctor.js';
|
|
24
|
+
// WU-1433: Import public manifest to derive scripts (no hardcoded subset)
|
|
25
|
+
import { getPublicManifest } from './public-manifest.js';
|
|
24
26
|
/**
|
|
25
27
|
* WU-1085: CLI option definitions for init command
|
|
26
28
|
* WU-1171: Added --merge and --client options
|
|
@@ -713,8 +715,8 @@ const MCP_JSON_TEMPLATE = `{
|
|
|
713
715
|
const BACKLOG_TEMPLATE = `---\nsections:\n ready:\n heading: '## 🚀 Ready (pull from here)'\n insertion: after_heading_blank_line\n in_progress:\n heading: '## 🔧 In progress'\n insertion: after_heading_blank_line\n blocked:\n heading: '## ⛔ Blocked'\n insertion: after_heading_blank_line\n done:\n heading: '## ✅ Done'\n insertion: after_heading_blank_line\n---\n\n# Backlog (single source of truth)\n\n## 🚀 Ready (pull from here)\n\n(No items ready)\n\n## 🔧 In progress\n\n(No items in progress)\n\n## ⛔ Blocked\n\n(No items blocked)\n\n## ✅ Done\n\n(No items completed yet)\n`;
|
|
714
716
|
// Template for docs/04-operations/tasks/status.md
|
|
715
717
|
const STATUS_TEMPLATE = `# Status (active work)\n\n## In Progress\n\n(No items in progress)\n\n## Blocked\n\n(No items blocked)\n\n## Completed\n\n(No items completed yet)\n`;
|
|
716
|
-
// Template for docs
|
|
717
|
-
const WU_TEMPLATE_YAML = `# Work Unit Template (LumenFlow WU Schema)\n#\n# Copy this template when creating new WUs. Fill in all required fields and\n# remove optional fields if not needed.\n#\n# If you used "lumenflow init --full", this template lives at:\n#
|
|
718
|
+
// Template for docs tasks WU template YAML (scaffolded to {{DOCS_TASKS_PATH}}/templates/wu-template.yaml)
|
|
719
|
+
const WU_TEMPLATE_YAML = `# Work Unit Template (LumenFlow WU Schema)\n#\n# Copy this template when creating new WUs. Fill in all required fields and\n# remove optional fields if not needed.\n#\n# If you used "lumenflow init --full", this template lives at:\n# {{DOCS_TASKS_PATH}}/templates/wu-template.yaml\n\n# Required: Unique work unit identifier (format: WU-NNN)\nid: WU-XXX\n\n# Required: Short, descriptive title (max 80 chars)\ntitle: 'Your WU title here'\n\n# Required: Lane (Parent: Sublane format)\nlane: 'Framework: CLI'\n\n# Required: Type of work\ntype: 'feature' # feature | bug | documentation | process | tooling | chore | refactor\n\n# Required: Current status\nstatus: 'ready' # ready | in_progress | blocked | done | cancelled\n\n# Required: Priority\npriority: P2 # P0 | P1 | P2 | P3\n\n# Required: Creation date (YYYY-MM-DD)\ncreated: {{DATE}}\n\n# Required: Owner/assignee (email)\nassigned_to: 'unassigned@example.com'\n\n# Required: Description\ndescription: |\n Context: ...\n Problem: ...\n Solution: ...\n\n# Required: Acceptance criteria (testable, binary)\nacceptance:\n - Criterion 1 (specific, measurable, testable)\n - Criterion 2 (binary pass/fail)\n - Documentation updated\n\n# Required: References to plans/specs (required for type: feature)\n# Tip: use pnpm wu:create --plan to generate a plan stub at lumenflow://plans/WU-XXX-plan.md\nspec_refs:\n - lumenflow://plans/WU-XXX-plan.md\n\n# Required: Code files changed or created (empty only for docs/process WUs)\n# Docs-only WUs should use docs/ or *.md paths to avoid docs-only gate failures.\ncode_paths:\n - path/to/file.ts\n\n# Required: Test paths (at least one of manual/unit/e2e/integration for non-doc WUs)\ntests:\n manual:\n - Manual check: Verify behavior or docs output\n unit:\n - path/to/test.test.ts\n e2e: []\n integration: []\n\n# Required: Exposure level\nexposure: 'backend-only' # ui | api | backend-only | documentation\n\n# Optional: User journey (recommended for ui/api)\n# user_journey: |\n# User navigates to ...\n# User performs ...\n\n# Optional: UI pairing WUs (for api exposure)\n# ui_pairing_wus:\n# - WU-1234\n\n# Optional: Navigation path (required when exposure=ui and no page file)\n# navigation_path: '/settings'\n\n# Required: Deliverable artifacts (stamps, docs, etc.)\nartifacts:\n - .lumenflow/stamps/WU-XXX.done\n\n# Optional: Dependencies (other WUs that must complete first)\ndependencies: []\n\n# Optional: Risks\nrisks:\n - Risk 1\n\n# Optional: Notes (required by spec linter)\nnotes: 'Implementation notes, rollout context, or plan summary.'\n\n# Optional: Requires human review\nrequires_review: false\n\n# Optional: Claimed mode (worktree or branch-only)\n# Automatically set by wu:claim, usually don't need to specify\n# claimed_mode: worktree\n\n# Optional: Assigned to (email of current claimant)\n# Automatically set by wu:claim\n# assigned_to: engineer@example.com\n\n# Optional: Locked status (prevents concurrent edits)\n# Automatically set by wu:claim and wu:done\n# locked: false\n\n# Optional: Completion date (ISO 8601 format)\n# Automatically set by wu:done\n# completed: 2025-10-23\n\n# Optional: Completion notes (added by wu:done)\n# completion_notes: |\n# Additional notes added during wu:done.\n# Any deviations from original plan.\n# Lessons learned.\n\n# ============================================================================\n# GOVERNANCE BLOCK (WU Schema v2.0)\n# ============================================================================\n# Optional: COS governance rules that apply to this WU\n# Only include if this WU needs specific governance enforcement\n\n# governance:\n# # Rules that apply to this WU (evaluated during cos:gates)\n# rules:\n# - rule_id: UPAIN-01\n# satisfied: false # Initially false, set true when evidence provided\n# evidence:\n# - type: link\n# value: docs/product/voc/feature-user-pain.md\n# description: "Voice of Customer analysis showing user pain"\n# notes: |\n# VOC analysis shows 40% of support tickets request this feature.\n# Average time wasted: 15min/user/week.\n#\n# - rule_id: CASH-03\n# satisfied: false\n# evidence:\n# - type: link\n# value: docs/finance/spend-reviews/2025-10-cloud-infra.md\n# description: "Spend review for £1200/month cloud infrastructure"\n# - type: approval\n# value: owner@example.com\n# description: "Owner approval for spend commitment"\n# notes: |\n# New cloud infrastructure commitment: £1200/month for 12 months.\n# ROI: Reduces latency by 50%, improves user retention.\n#\n# # Gate checks (enforced by cos-gates.ts)\n# gates:\n# narrative: "pending" # Status: pending, passed, skipped, failed\n# finance: "pending"\n#\n# # Exemptions (only if rule doesn't apply)\n# exemptions:\n# - rule_id: FAIR-01\n# reason: "No user-facing pricing changes in this WU"\n# approved_by: product-owner@example.com\n# approved_at: 2025-10-23\n\n# ============================================================================\n# USAGE NOTES\n# ============================================================================\n#\n# 1. Remove this entire governance block if no COS rules apply to your WU\n# 2. Only include rules that require enforcement (not all rules apply to all WUs)\n# 3. Evidence types: link:, metric:, screenshot:, approval:\n# 4. Gates are checked during wu:done (before merge)\n# 5. Exemptions require approval from rule owner\n#\n# For more details, see:\n# - {{DOCS_OPERATIONS_PATH}}/_frameworks/cos/system-prompt-v1.3.md\n# - {{DOCS_OPERATIONS_PATH}}/_frameworks/cos/evidence-format.md\n`;
|
|
718
720
|
// Template for .lumenflow.framework.yaml
|
|
719
721
|
const FRAMEWORK_HINT_TEMPLATE = `# LumenFlow Framework Hint\n# Generated by: lumenflow init --framework {{FRAMEWORK_NAME}}\n\nframework: "{{FRAMEWORK_NAME}}"\nslug: "{{FRAMEWORK_SLUG}}"\n`;
|
|
720
722
|
// Template for docs/04-operations/_frameworks/<framework>/README.md
|
|
@@ -1172,7 +1174,7 @@ If same error happens 3 times:
|
|
|
1172
1174
|
|
|
1173
1175
|
\`\`\`bash
|
|
1174
1176
|
# Check lane availability
|
|
1175
|
-
cat
|
|
1177
|
+
cat {{DOCS_TASKS_PATH}}/status.md
|
|
1176
1178
|
|
|
1177
1179
|
# Claim a WU
|
|
1178
1180
|
pnpm wu:claim --id WU-XXX --lane <Lane>
|
|
@@ -1479,7 +1481,7 @@ LumenFlow uses Work Units (WUs) to track all changes:
|
|
|
1479
1481
|
|
|
1480
1482
|
## Step 5: When Stuck
|
|
1481
1483
|
|
|
1482
|
-
1. Read the WU spec at \`
|
|
1484
|
+
1. Read the WU spec at \`{{DOCS_TASKS_PATH}}/wu/WU-XXX.yaml\`
|
|
1483
1485
|
2. Check [troubleshooting-wu-done.md](troubleshooting-wu-done.md)
|
|
1484
1486
|
3. Review [first-wu-mistakes.md](first-wu-mistakes.md)
|
|
1485
1487
|
|
|
@@ -1601,7 +1603,7 @@ pnpm wu:create \\
|
|
|
1601
1603
|
|
|
1602
1604
|
## After Creation
|
|
1603
1605
|
|
|
1604
|
-
1. Review the created YAML: \`cat
|
|
1606
|
+
1. Review the created YAML: \`cat {{DOCS_TASKS_PATH}}/wu/WU-XXX.yaml\`
|
|
1605
1607
|
2. Claim the WU: \`pnpm wu:claim --id WU-XXX --lane "Lane"\`
|
|
1606
1608
|
3. cd to worktree: \`cd worktrees/<lane>-wu-xxx\`
|
|
1607
1609
|
`;
|
|
@@ -1638,10 +1640,10 @@ pnpm exec lumenflow doctor
|
|
|
1638
1640
|
|
|
1639
1641
|
\`\`\`bash
|
|
1640
1642
|
# Check status board
|
|
1641
|
-
cat
|
|
1643
|
+
cat {{DOCS_TASKS_PATH}}/status.md
|
|
1642
1644
|
|
|
1643
1645
|
# List ready WUs
|
|
1644
|
-
ls
|
|
1646
|
+
ls {{DOCS_TASKS_PATH}}/wu/*.yaml | head -5
|
|
1645
1647
|
\`\`\`
|
|
1646
1648
|
|
|
1647
1649
|
---
|
|
@@ -2473,36 +2475,28 @@ ${linesToAdd.join('\n')}
|
|
|
2473
2475
|
await createFile(gitignorePath, GITIGNORE_TEMPLATE, fileMode, result, targetDir);
|
|
2474
2476
|
}
|
|
2475
2477
|
/**
|
|
2476
|
-
* WU-
|
|
2477
|
-
*
|
|
2478
|
-
*
|
|
2479
|
-
* after installing @lumenflow/cli.
|
|
2478
|
+
* WU-1433: Script argument overrides for commands that need extra flags.
|
|
2479
|
+
* Most commands map simply to their binName, but some aliases need arguments.
|
|
2480
|
+
* Key = command name (colon notation), Value = full script command string.
|
|
2480
2481
|
*/
|
|
2481
|
-
const
|
|
2482
|
-
// Core WU lifecycle
|
|
2483
|
-
'wu:claim': 'wu-claim',
|
|
2484
|
-
'wu:done': 'wu-done',
|
|
2485
|
-
'wu:create': 'wu-create',
|
|
2486
|
-
'wu:proto': 'wu-proto', // WU-1359: Prototype WU with relaxed validation
|
|
2487
|
-
'wu:status': 'wu-status',
|
|
2488
|
-
'wu:block': 'wu-block',
|
|
2489
|
-
'wu:unblock': 'wu-unblock',
|
|
2490
|
-
// WU-1342: Additional critical commands
|
|
2491
|
-
'wu:prep': 'wu-prep',
|
|
2492
|
-
'wu:recover': 'wu-recover',
|
|
2493
|
-
'wu:spawn': 'wu-spawn',
|
|
2494
|
-
'wu:validate': 'wu-validate',
|
|
2495
|
-
'wu:infer-lane': 'wu-infer-lane',
|
|
2496
|
-
// Memory commands
|
|
2497
|
-
'mem:init': 'mem-init',
|
|
2498
|
-
'mem:checkpoint': 'mem-checkpoint',
|
|
2499
|
-
'mem:inbox': 'mem-inbox',
|
|
2500
|
-
// Lane commands
|
|
2501
|
-
'lane:suggest': 'lane-suggest',
|
|
2502
|
-
// Gates
|
|
2503
|
-
gates: 'gates',
|
|
2482
|
+
const SCRIPT_ARG_OVERRIDES = {
|
|
2504
2483
|
'gates:docs': 'gates --docs-only',
|
|
2505
2484
|
};
|
|
2485
|
+
/**
|
|
2486
|
+
* WU-1307: LumenFlow scripts to inject into package.json
|
|
2487
|
+
* WU-1342: Expanded to include essential commands
|
|
2488
|
+
* WU-1433: Now derived from the public CLI manifest (WU-1432) instead of
|
|
2489
|
+
* hardcoded list. Ensures all public commands are exposed and avoids drift.
|
|
2490
|
+
*/
|
|
2491
|
+
function generateLumenflowScripts() {
|
|
2492
|
+
const scripts = {};
|
|
2493
|
+
const manifest = getPublicManifest();
|
|
2494
|
+
for (const cmd of manifest) {
|
|
2495
|
+
// Use override if defined, otherwise map to the binary name
|
|
2496
|
+
scripts[cmd.name] = SCRIPT_ARG_OVERRIDES[cmd.name] ?? cmd.binName;
|
|
2497
|
+
}
|
|
2498
|
+
return scripts;
|
|
2499
|
+
}
|
|
2506
2500
|
/** WU-1408: Safety script path constants */
|
|
2507
2501
|
const SCRIPTS_DIR = 'scripts';
|
|
2508
2502
|
const SAFE_GIT_FILE = 'safe-git';
|
|
@@ -2653,8 +2647,9 @@ async function injectPackageJsonScripts(targetDir, options, result) {
|
|
|
2653
2647
|
}
|
|
2654
2648
|
const scripts = packageJson.scripts;
|
|
2655
2649
|
let modified = false;
|
|
2656
|
-
//
|
|
2657
|
-
|
|
2650
|
+
// WU-1433: Derive scripts from public manifest (not hardcoded)
|
|
2651
|
+
const lumenflowScripts = generateLumenflowScripts();
|
|
2652
|
+
for (const [scriptName, scriptCommand] of Object.entries(lumenflowScripts)) {
|
|
2658
2653
|
if (options.force || !(scriptName in scripts)) {
|
|
2659
2654
|
if (!(scriptName in scripts)) {
|
|
2660
2655
|
scripts[scriptName] = scriptCommand;
|
|
@@ -3066,3 +3061,4 @@ if (import.meta.main) {
|
|
|
3066
3061
|
process.exit(1);
|
|
3067
3062
|
});
|
|
3068
3063
|
}
|
|
3064
|
+
//# sourceMappingURL=init.js.map
|