@lumenflow/cli 3.1.2 → 3.1.3
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 +36 -35
- package/dist/agent-issues-query.js +13 -8
- package/dist/agent-log-issue.js +15 -4
- package/dist/agent-session-end.js +15 -4
- package/dist/agent-session.js +18 -6
- package/dist/backlog-prune.js +1 -1
- package/dist/commands/integrate.js +32 -18
- package/dist/config-get.js +27 -15
- package/dist/config-set.js +104 -37
- package/dist/delegation-list.js +1 -1
- package/dist/doctor.js +19 -13
- package/dist/file-delete.js +1 -1
- package/dist/file-edit.js +1 -1
- package/dist/file-read.js +1 -1
- package/dist/file-write.js +1 -1
- package/dist/flow-bottlenecks.js +1 -1
- package/dist/flow-report.js +10 -9
- package/dist/gates.js +3 -2
- package/dist/git-branch.js +1 -1
- package/dist/git-diff.js +1 -1
- package/dist/git-log.js +1 -1
- package/dist/init.js +238 -42
- package/dist/initiative-add-wu.js +1 -1
- package/dist/initiative-bulk-assign-wus.js +1 -1
- package/dist/initiative-create.js +2 -2
- package/dist/initiative-edit.js +1 -1
- package/dist/initiative-list.js +1 -1
- package/dist/initiative-plan.js +1 -3
- package/dist/initiative-status.js +47 -6
- package/dist/lane-edit.js +19 -10
- package/dist/lane-health.js +13 -24
- package/dist/lane-lock.js +4 -5
- package/dist/lane-setup.js +5 -5
- package/dist/lane-status.js +4 -5
- package/dist/lane-suggest.js +9 -7
- package/dist/lane-validate.js +4 -5
- package/dist/lumenflow-upgrade.js +17 -11
- package/dist/mem-checkpoint.js +1 -1
- package/dist/mem-cleanup.js +6 -23
- package/dist/mem-context.js +1 -1
- package/dist/mem-create.js +1 -1
- package/dist/mem-delete.js +1 -1
- package/dist/mem-export.js +1 -1
- package/dist/mem-inbox.js +1 -1
- package/dist/mem-init.js +1 -1
- package/dist/mem-ready.js +1 -1
- package/dist/mem-recover.js +1 -1
- package/dist/mem-signal.js +1 -1
- package/dist/mem-start.js +1 -1
- package/dist/mem-summarize.js +8 -7
- package/dist/mem-triage.js +7 -5
- package/dist/metrics-cli.js +1 -1
- package/dist/metrics-snapshot.js +1 -1
- package/dist/onboard.js +295 -120
- package/dist/orchestrate-init-status.js +12 -7
- package/dist/orchestrate-initiative.js +23 -12
- package/dist/orchestrate-monitor.js +20 -8
- package/dist/pack-scaffold.js +1 -1
- package/dist/plan-create.js +1 -3
- package/dist/plan-edit.js +1 -3
- package/dist/plan-link.js +1 -3
- package/dist/plan-promote.js +1 -3
- package/dist/release.js +1 -3
- package/dist/signal-cleanup.js +4 -18
- package/dist/state-bootstrap.js +11 -8
- package/dist/state-cleanup.js +5 -19
- package/dist/state-doctor.js +213 -9
- package/dist/task-claim.js +1 -1
- package/dist/validate.js +1 -1
- package/dist/workspace-init.js +61 -61
- package/dist/wu-block.js +1 -1
- package/dist/wu-brief.js +1 -1
- package/dist/wu-claim.js +1 -1
- package/dist/wu-cleanup.js +1 -1
- package/dist/wu-create.js +3 -3
- package/dist/wu-delegate.js +1 -1
- package/dist/wu-deps.js +1 -1
- package/dist/wu-done.js +66 -34
- package/dist/wu-edit.js +1 -1
- package/dist/wu-infer-lane.js +1 -1
- package/dist/wu-preflight.js +1 -1
- package/dist/wu-prep.js +1 -1
- package/dist/wu-proto.js +1 -1
- package/dist/wu-prune.js +1 -1
- package/dist/wu-recover.js +1 -1
- package/dist/wu-release.js +1 -1
- package/dist/wu-repair.js +1 -1
- package/dist/wu-sandbox.js +40 -27
- package/dist/wu-status.js +1 -1
- package/dist/wu-unblock.js +1 -1
- package/dist/wu-unlock-lane.js +1 -1
- package/dist/wu-validate.js +1 -1
- package/package.json +12 -8
- package/packs/software-delivery/constants.ts +10 -0
- package/packs/software-delivery/extensions.ts +140 -0
- package/packs/software-delivery/gate-policies.ts +134 -0
- package/packs/software-delivery/index.ts +8 -0
- package/packs/software-delivery/manifest-schema.ts +236 -0
- package/packs/software-delivery/manifest.ts +417 -0
- package/packs/software-delivery/manifest.yaml +711 -0
- package/packs/software-delivery/pack-registration.ts +113 -0
- package/packs/software-delivery/tool-impl/agent-tools.ts +263 -0
- package/packs/software-delivery/tool-impl/delegation-tools.ts +66 -0
- package/packs/software-delivery/tool-impl/flow-metrics-tools.ts +219 -0
- package/packs/software-delivery/tool-impl/git-runner.ts +113 -0
- package/packs/software-delivery/tool-impl/git-tools.ts +316 -0
- package/packs/software-delivery/tool-impl/index.ts +15 -0
- package/packs/software-delivery/tool-impl/initiative-orchestration-tools.ts +720 -0
- package/packs/software-delivery/tool-impl/lane-lock.ts +246 -0
- package/packs/software-delivery/tool-impl/memory-tools.ts +415 -0
- package/packs/software-delivery/tool-impl/pending-runtime-tools.ts +21 -0
- package/packs/software-delivery/tool-impl/runtime-cli-adapter.ts +328 -0
- package/packs/software-delivery/tool-impl/runtime-native-tools.ts +687 -0
- package/packs/software-delivery/tool-impl/worker-loader.ts +52 -0
- package/packs/software-delivery/tool-impl/worktree-tools.ts +46 -0
- package/packs/software-delivery/tool-impl/wu-lifecycle-tools.ts +759 -0
- package/packs/software-delivery/tools/delegation-tools.ts +23 -0
- package/packs/software-delivery/tools/git-tools.ts +55 -0
- package/packs/software-delivery/tools/index.ts +8 -0
- package/packs/software-delivery/tools/lane-lock-tool.ts +37 -0
- package/packs/software-delivery/tools/types.ts +71 -0
- package/packs/software-delivery/tools/worktree-tools.ts +49 -0
- package/templates/core/LUMENFLOW.md.template +3 -3
- package/templates/core/ai/onboarding/agent-invocation-guide.md.template +1 -1
- package/templates/core/ai/onboarding/lumenflow-force-usage.md.template +1 -1
- package/templates/core/ai/onboarding/quick-ref-commands.md.template +5 -5
- package/templates/core/ai/onboarding/starting-prompt.md.template +3 -3
- package/templates/core/ai/onboarding/vendor-support.md.template +1 -1
- package/templates/core/ai/onboarding/wu-create-checklist.md.template +1 -1
- package/dist/agent-issues-query.js.map +0 -1
- package/dist/agent-log-issue.js.map +0 -1
- package/dist/agent-session-end.js.map +0 -1
- package/dist/agent-session.js.map +0 -1
- package/dist/backlog-prune.js.map +0 -1
- package/dist/cli-entry-point.js +0 -149
- package/dist/cli-entry-point.js.map +0 -1
- package/dist/commands/integrate.js.map +0 -1
- package/dist/commands.js.map +0 -1
- package/dist/config-get.js.map +0 -1
- package/dist/config-set.js.map +0 -1
- package/dist/delegation-list.js.map +0 -1
- package/dist/deps-add.js +0 -259
- package/dist/deps-add.js.map +0 -1
- package/dist/deps-remove.js +0 -105
- package/dist/deps-remove.js.map +0 -1
- package/dist/docs-sync.js.map +0 -1
- package/dist/doctor.js.map +0 -1
- package/dist/file-delete.js.map +0 -1
- package/dist/file-edit.js.map +0 -1
- package/dist/file-read.js.map +0 -1
- package/dist/file-write.js.map +0 -1
- package/dist/flow-bottlenecks.js.map +0 -1
- package/dist/flow-report.js.map +0 -1
- package/dist/formatters.js +0 -151
- package/dist/formatters.js.map +0 -1
- package/dist/gate-defaults.js +0 -131
- package/dist/gate-defaults.js.map +0 -1
- package/dist/gate-registry.js +0 -73
- package/dist/gate-registry.js.map +0 -1
- package/dist/gates-graceful-degradation.js +0 -153
- package/dist/gates-graceful-degradation.js.map +0 -1
- package/dist/gates-plan-resolvers.js +0 -152
- package/dist/gates-plan-resolvers.js.map +0 -1
- package/dist/gates-runners.js +0 -509
- package/dist/gates-runners.js.map +0 -1
- package/dist/gates-types.js +0 -4
- package/dist/gates-types.js.map +0 -1
- package/dist/gates-utils.js +0 -323
- package/dist/gates-utils.js.map +0 -1
- package/dist/gates.js.map +0 -1
- package/dist/git-branch.js.map +0 -1
- package/dist/git-diff.js.map +0 -1
- package/dist/git-log.js.map +0 -1
- package/dist/git-status.js.map +0 -1
- package/dist/guard-locked.js +0 -172
- package/dist/guard-locked.js.map +0 -1
- package/dist/guard-main-branch.js +0 -217
- package/dist/guard-main-branch.js.map +0 -1
- package/dist/guard-worktree-commit.js +0 -163
- package/dist/guard-worktree-commit.js.map +0 -1
- package/dist/hooks/auto-checkpoint-utils.js +0 -54
- package/dist/hooks/auto-checkpoint-utils.js.map +0 -1
- package/dist/hooks/enforcement-checks.js +0 -399
- package/dist/hooks/enforcement-checks.js.map +0 -1
- package/dist/hooks/enforcement-generator.js +0 -139
- package/dist/hooks/enforcement-generator.js.map +0 -1
- package/dist/hooks/enforcement-sync.js +0 -385
- package/dist/hooks/enforcement-sync.js.map +0 -1
- package/dist/hooks/generators/auto-checkpoint.js +0 -125
- package/dist/hooks/generators/auto-checkpoint.js.map +0 -1
- package/dist/hooks/generators/enforce-worktree.js +0 -190
- package/dist/hooks/generators/enforce-worktree.js.map +0 -1
- package/dist/hooks/generators/index.js +0 -18
- package/dist/hooks/generators/index.js.map +0 -1
- package/dist/hooks/generators/pre-compact-checkpoint.js +0 -136
- package/dist/hooks/generators/pre-compact-checkpoint.js.map +0 -1
- package/dist/hooks/generators/require-wu.js +0 -117
- package/dist/hooks/generators/require-wu.js.map +0 -1
- package/dist/hooks/generators/session-start-recovery.js +0 -103
- package/dist/hooks/generators/session-start-recovery.js.map +0 -1
- package/dist/hooks/generators/signal-utils.js +0 -54
- package/dist/hooks/generators/signal-utils.js.map +0 -1
- package/dist/hooks/generators/warn-incomplete.js +0 -67
- package/dist/hooks/generators/warn-incomplete.js.map +0 -1
- package/dist/hooks/index.js +0 -10
- package/dist/hooks/index.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/init-detection.js +0 -232
- package/dist/init-detection.js.map +0 -1
- package/dist/init-lane-validation.js +0 -143
- package/dist/init-lane-validation.js.map +0 -1
- package/dist/init-scaffolding.js +0 -158
- package/dist/init-scaffolding.js.map +0 -1
- package/dist/init-templates.js +0 -1982
- package/dist/init-templates.js.map +0 -1
- package/dist/init.js.map +0 -1
- package/dist/initiative-add-wu.js.map +0 -1
- package/dist/initiative-bulk-assign-wus.js.map +0 -1
- package/dist/initiative-create.js.map +0 -1
- package/dist/initiative-edit.js.map +0 -1
- package/dist/initiative-list.js.map +0 -1
- package/dist/initiative-plan.js.map +0 -1
- package/dist/initiative-remove-wu.js.map +0 -1
- package/dist/initiative-status.js.map +0 -1
- package/dist/lane-edit.js.map +0 -1
- package/dist/lane-health.js.map +0 -1
- package/dist/lane-lifecycle-process.js +0 -366
- package/dist/lane-lifecycle-process.js.map +0 -1
- package/dist/lane-lock.js.map +0 -1
- package/dist/lane-setup.js.map +0 -1
- package/dist/lane-status.js.map +0 -1
- package/dist/lane-suggest.js.map +0 -1
- package/dist/lane-validate.js.map +0 -1
- package/dist/lifecycle-regression-harness.js +0 -181
- package/dist/lifecycle-regression-harness.js.map +0 -1
- package/dist/lumenflow-upgrade.js.map +0 -1
- package/dist/mem-checkpoint.js.map +0 -1
- package/dist/mem-cleanup.js.map +0 -1
- package/dist/mem-context.js.map +0 -1
- package/dist/mem-create.js.map +0 -1
- package/dist/mem-delete.js.map +0 -1
- package/dist/mem-export.js.map +0 -1
- package/dist/mem-inbox.js.map +0 -1
- package/dist/mem-index.js +0 -214
- package/dist/mem-index.js.map +0 -1
- package/dist/mem-init.js.map +0 -1
- package/dist/mem-profile.js +0 -210
- package/dist/mem-profile.js.map +0 -1
- package/dist/mem-promote.js +0 -257
- package/dist/mem-promote.js.map +0 -1
- package/dist/mem-ready.js.map +0 -1
- package/dist/mem-recover.js.map +0 -1
- package/dist/mem-signal.js.map +0 -1
- package/dist/mem-start.js.map +0 -1
- package/dist/mem-summarize.js.map +0 -1
- package/dist/mem-triage.js.map +0 -1
- package/dist/merge-block.js +0 -225
- package/dist/merge-block.js.map +0 -1
- package/dist/metrics-cli.js.map +0 -1
- package/dist/metrics-snapshot.js.map +0 -1
- package/dist/onboard.js.map +0 -1
- package/dist/onboarding-smoke-test.js +0 -418
- package/dist/onboarding-smoke-test.js.map +0 -1
- package/dist/orchestrate-init-status.js.map +0 -1
- package/dist/orchestrate-initiative.js.map +0 -1
- package/dist/orchestrate-monitor.js.map +0 -1
- package/dist/pack-author.js.map +0 -1
- package/dist/pack-hash.js.map +0 -1
- package/dist/pack-install.js.map +0 -1
- package/dist/pack-publish.js.map +0 -1
- package/dist/pack-scaffold.js.map +0 -1
- package/dist/pack-search.js.map +0 -1
- package/dist/pack-validate.js.map +0 -1
- package/dist/plan-create.js.map +0 -1
- package/dist/plan-edit.js.map +0 -1
- package/dist/plan-link.js.map +0 -1
- package/dist/plan-promote.js.map +0 -1
- package/dist/public-manifest.js +0 -920
- package/dist/public-manifest.js.map +0 -1
- package/dist/release.js.map +0 -1
- package/dist/rotate-progress.js +0 -253
- package/dist/rotate-progress.js.map +0 -1
- package/dist/session-coordinator.js +0 -303
- package/dist/session-coordinator.js.map +0 -1
- package/dist/shared-validators.js +0 -81
- package/dist/shared-validators.js.map +0 -1
- package/dist/signal-cleanup.js.map +0 -1
- package/dist/state-bootstrap.js.map +0 -1
- package/dist/state-cleanup.js.map +0 -1
- package/dist/state-doctor-fix.js +0 -226
- package/dist/state-doctor-fix.js.map +0 -1
- package/dist/state-doctor-stamps.js +0 -23
- package/dist/state-doctor-stamps.js.map +0 -1
- package/dist/state-doctor.js.map +0 -1
- package/dist/strict-progress.js +0 -255
- package/dist/strict-progress.js.map +0 -1
- package/dist/sync-templates.js.map +0 -1
- package/dist/task-claim.js.map +0 -1
- package/dist/trace-gen.js +0 -401
- package/dist/trace-gen.js.map +0 -1
- package/dist/validate-agent-skills.js +0 -223
- package/dist/validate-agent-skills.js.map +0 -1
- package/dist/validate-agent-sync.js +0 -151
- package/dist/validate-agent-sync.js.map +0 -1
- package/dist/validate-backlog-sync.js +0 -77
- package/dist/validate-backlog-sync.js.map +0 -1
- package/dist/validate-skills-spec.js +0 -211
- package/dist/validate-skills-spec.js.map +0 -1
- package/dist/validate.js.map +0 -1
- package/dist/validator-defaults.js +0 -107
- package/dist/validator-defaults.js.map +0 -1
- package/dist/validator-registry.js +0 -71
- package/dist/validator-registry.js.map +0 -1
- package/dist/workspace-init.js.map +0 -1
- package/dist/wu-block.js.map +0 -1
- package/dist/wu-brief.js.map +0 -1
- package/dist/wu-claim-branch.js +0 -123
- package/dist/wu-claim-branch.js.map +0 -1
- package/dist/wu-claim-cloud.js +0 -79
- package/dist/wu-claim-cloud.js.map +0 -1
- package/dist/wu-claim-mode.js +0 -82
- package/dist/wu-claim-mode.js.map +0 -1
- package/dist/wu-claim-output.js +0 -85
- package/dist/wu-claim-output.js.map +0 -1
- package/dist/wu-claim-repair-guidance.js +0 -12
- package/dist/wu-claim-repair-guidance.js.map +0 -1
- package/dist/wu-claim-resume-handler.js +0 -87
- package/dist/wu-claim-resume-handler.js.map +0 -1
- package/dist/wu-claim-state.js +0 -581
- package/dist/wu-claim-state.js.map +0 -1
- package/dist/wu-claim-validation.js +0 -457
- package/dist/wu-claim-validation.js.map +0 -1
- package/dist/wu-claim-worktree.js +0 -223
- package/dist/wu-claim-worktree.js.map +0 -1
- package/dist/wu-claim.js.map +0 -1
- package/dist/wu-cleanup-cloud.js +0 -78
- package/dist/wu-cleanup-cloud.js.map +0 -1
- package/dist/wu-cleanup.js.map +0 -1
- package/dist/wu-code-path-coverage.js +0 -83
- package/dist/wu-code-path-coverage.js.map +0 -1
- package/dist/wu-create-cloud.js +0 -30
- package/dist/wu-create-cloud.js.map +0 -1
- package/dist/wu-create-content.js +0 -264
- package/dist/wu-create-content.js.map +0 -1
- package/dist/wu-create-readiness.js +0 -59
- package/dist/wu-create-readiness.js.map +0 -1
- package/dist/wu-create-validation.js +0 -128
- package/dist/wu-create-validation.js.map +0 -1
- package/dist/wu-create.js.map +0 -1
- package/dist/wu-delegate.js.map +0 -1
- package/dist/wu-delete.js.map +0 -1
- package/dist/wu-deps.js.map +0 -1
- package/dist/wu-done-auto-cleanup.js +0 -203
- package/dist/wu-done-auto-cleanup.js.map +0 -1
- package/dist/wu-done-check.js +0 -38
- package/dist/wu-done-check.js.map +0 -1
- package/dist/wu-done-cloud.js +0 -48
- package/dist/wu-done-cloud.js.map +0 -1
- package/dist/wu-done-decay.js +0 -86
- package/dist/wu-done-decay.js.map +0 -1
- package/dist/wu-done.js.map +0 -1
- package/dist/wu-edit-operations.js +0 -399
- package/dist/wu-edit-operations.js.map +0 -1
- package/dist/wu-edit-validators.js +0 -282
- package/dist/wu-edit-validators.js.map +0 -1
- package/dist/wu-edit.js.map +0 -1
- package/dist/wu-infer-lane.js.map +0 -1
- package/dist/wu-preflight.js.map +0 -1
- package/dist/wu-prep.js.map +0 -1
- package/dist/wu-proto.js.map +0 -1
- package/dist/wu-prune.js.map +0 -1
- package/dist/wu-recover.js.map +0 -1
- package/dist/wu-release.js.map +0 -1
- package/dist/wu-repair.js.map +0 -1
- package/dist/wu-sandbox.js.map +0 -1
- package/dist/wu-spawn-completion.js +0 -33
- package/dist/wu-spawn-completion.js.map +0 -1
- package/dist/wu-spawn-prompt-builders.js +0 -1197
- package/dist/wu-spawn-prompt-builders.js.map +0 -1
- package/dist/wu-spawn-strategy-resolver.js +0 -322
- package/dist/wu-spawn-strategy-resolver.js.map +0 -1
- package/dist/wu-spawn.js +0 -59
- package/dist/wu-spawn.js.map +0 -1
- package/dist/wu-state-cloud.js +0 -41
- package/dist/wu-state-cloud.js.map +0 -1
- package/dist/wu-status.js.map +0 -1
- package/dist/wu-unblock.js.map +0 -1
- package/dist/wu-unlock-lane.js.map +0 -1
- package/dist/wu-validate.js.map +0 -1
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2026 Hellmai Ltd
|
|
2
|
-
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
/**
|
|
4
|
-
* @file generators/enforce-worktree.ts
|
|
5
|
-
* Generate the enforce-worktree.sh hook script content (WU-1367, WU-1501).
|
|
6
|
-
*
|
|
7
|
-
* Extracted from enforcement-generator.ts by WU-1645.
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Generate the enforce-worktree.sh hook script content.
|
|
11
|
-
*
|
|
12
|
-
* WU-1501: Fail-closed on main. Blocks Write/Edit when no active claim context.
|
|
13
|
-
* Graceful degradation only when LumenFlow is NOT configured.
|
|
14
|
-
* Allowlist: docs/04-operations/tasks/wu/, .lumenflow/, .claude/, plan/
|
|
15
|
-
* Branch-PR claimed_mode remains writable from main checkout.
|
|
16
|
-
*/
|
|
17
|
-
export function generateEnforceWorktreeScript() {
|
|
18
|
-
// Note: Shell variable escapes (\$, \") are intentional for the generated bash script
|
|
19
|
-
/* eslint-disable no-useless-escape */
|
|
20
|
-
return `#!/bin/bash
|
|
21
|
-
#
|
|
22
|
-
# enforce-worktree.sh (WU-1367, WU-1501)
|
|
23
|
-
#
|
|
24
|
-
# PreToolUse hook that blocks Write/Edit on main checkout.
|
|
25
|
-
# WU-1501: Fail-closed - blocks even when no worktrees exist.
|
|
26
|
-
# Graceful degradation only when LumenFlow is NOT configured.
|
|
27
|
-
#
|
|
28
|
-
# Allowlist: docs/04-operations/tasks/wu/, .lumenflow/, .claude/, plan/
|
|
29
|
-
# Branch-PR claimed_mode permits writes from main checkout.
|
|
30
|
-
#
|
|
31
|
-
# Exit codes:
|
|
32
|
-
# 0 = Allow operation
|
|
33
|
-
# 2 = Block operation (stderr shown to Claude as guidance)
|
|
34
|
-
#
|
|
35
|
-
|
|
36
|
-
set -euo pipefail
|
|
37
|
-
|
|
38
|
-
SCRIPT_DIR="$(cd "$(dirname "\${BASH_SOURCE[0]}")" && pwd)"
|
|
39
|
-
|
|
40
|
-
# Graceful degradation: if we can't determine state, allow the operation
|
|
41
|
-
graceful_allow() {
|
|
42
|
-
local reason="\$1"
|
|
43
|
-
exit 0
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
# Derive repo paths from CLAUDE_PROJECT_DIR
|
|
47
|
-
if [[ -z "\${CLAUDE_PROJECT_DIR:-}" ]]; then
|
|
48
|
-
graceful_allow "CLAUDE_PROJECT_DIR not set"
|
|
49
|
-
fi
|
|
50
|
-
|
|
51
|
-
MAIN_REPO_PATH="\$CLAUDE_PROJECT_DIR"
|
|
52
|
-
WORKTREES_DIR="\${MAIN_REPO_PATH}/worktrees"
|
|
53
|
-
LUMENFLOW_DIR="\${MAIN_REPO_PATH}/.lumenflow"
|
|
54
|
-
|
|
55
|
-
# Check if .lumenflow exists (LumenFlow is configured)
|
|
56
|
-
if [[ ! -d "\$LUMENFLOW_DIR" ]]; then
|
|
57
|
-
graceful_allow "No .lumenflow directory (LumenFlow not configured)"
|
|
58
|
-
fi
|
|
59
|
-
|
|
60
|
-
# Read JSON input from stdin
|
|
61
|
-
INPUT=\$(cat)
|
|
62
|
-
|
|
63
|
-
if [[ -z "\$INPUT" ]]; then
|
|
64
|
-
graceful_allow "No input provided"
|
|
65
|
-
fi
|
|
66
|
-
|
|
67
|
-
# Parse JSON with Python
|
|
68
|
-
TMPFILE=\$(mktemp)
|
|
69
|
-
echo "\$INPUT" > "\$TMPFILE"
|
|
70
|
-
|
|
71
|
-
PARSE_RESULT=\$(python3 -c "
|
|
72
|
-
import json
|
|
73
|
-
import sys
|
|
74
|
-
try:
|
|
75
|
-
with open('\$TMPFILE', 'r') as f:
|
|
76
|
-
data = json.load(f)
|
|
77
|
-
tool_name = data.get('tool_name', '')
|
|
78
|
-
tool_input = data.get('tool_input', {})
|
|
79
|
-
if not isinstance(tool_input, dict):
|
|
80
|
-
tool_input = {}
|
|
81
|
-
file_path = tool_input.get('file_path', '')
|
|
82
|
-
print('OK')
|
|
83
|
-
print(tool_name if tool_name else '')
|
|
84
|
-
print(file_path if file_path else '')
|
|
85
|
-
except Exception as e:
|
|
86
|
-
print('ERROR')
|
|
87
|
-
print(str(e))
|
|
88
|
-
print('')
|
|
89
|
-
" 2>&1)
|
|
90
|
-
|
|
91
|
-
rm -f "\$TMPFILE"
|
|
92
|
-
|
|
93
|
-
# Parse the result
|
|
94
|
-
PARSE_STATUS=\$(echo "\$PARSE_RESULT" | head -1)
|
|
95
|
-
TOOL_NAME=\$(echo "\$PARSE_RESULT" | sed -n '2p')
|
|
96
|
-
FILE_PATH=\$(echo "\$PARSE_RESULT" | sed -n '3p')
|
|
97
|
-
|
|
98
|
-
if [[ "\$PARSE_STATUS" != "OK" ]]; then
|
|
99
|
-
graceful_allow "JSON parse failed"
|
|
100
|
-
fi
|
|
101
|
-
|
|
102
|
-
# Only process Write and Edit tools
|
|
103
|
-
if [[ "\$TOOL_NAME" != "Write" && "\$TOOL_NAME" != "Edit" ]]; then
|
|
104
|
-
exit 0
|
|
105
|
-
fi
|
|
106
|
-
|
|
107
|
-
if [[ -z "\$FILE_PATH" ]]; then
|
|
108
|
-
graceful_allow "No file_path in input"
|
|
109
|
-
fi
|
|
110
|
-
|
|
111
|
-
# Resolve the file path
|
|
112
|
-
RESOLVED_PATH=\$(realpath -m "\$FILE_PATH" 2>/dev/null || echo "\$FILE_PATH")
|
|
113
|
-
|
|
114
|
-
# Allow if path is outside repo entirely
|
|
115
|
-
if [[ "\$RESOLVED_PATH" != "\${MAIN_REPO_PATH}/"* && "\$RESOLVED_PATH" != "\${MAIN_REPO_PATH}" ]]; then
|
|
116
|
-
exit 0
|
|
117
|
-
fi
|
|
118
|
-
|
|
119
|
-
# Allow if path is inside a worktree
|
|
120
|
-
if [[ "\$RESOLVED_PATH" == "\${WORKTREES_DIR}/"* ]]; then
|
|
121
|
-
exit 0
|
|
122
|
-
fi
|
|
123
|
-
|
|
124
|
-
# Check if UnsafeAny active worktrees exist
|
|
125
|
-
WORKTREE_COUNT=0
|
|
126
|
-
if [[ -d "\$WORKTREES_DIR" ]]; then
|
|
127
|
-
WORKTREE_COUNT=\$(find "\$WORKTREES_DIR" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)
|
|
128
|
-
fi
|
|
129
|
-
|
|
130
|
-
# If worktrees exist, block writes to main repo (original behavior)
|
|
131
|
-
if [[ "\$WORKTREE_COUNT" -gt 0 ]]; then
|
|
132
|
-
ACTIVE_WORKTREES=\$(find "\$WORKTREES_DIR" -mindepth 1 -maxdepth 1 -type d -printf '%f\\n' 2>/dev/null | head -5 | tr '\\n' ', ' | sed 's/,\$//')
|
|
133
|
-
|
|
134
|
-
echo "" >&2
|
|
135
|
-
echo "=== Worktree Enforcement ===" >&2
|
|
136
|
-
echo "" >&2
|
|
137
|
-
echo "BLOCKED: \$TOOL_NAME to main repo" >&2
|
|
138
|
-
echo "" >&2
|
|
139
|
-
echo "Active worktrees: \${ACTIVE_WORKTREES:-none detected}" >&2
|
|
140
|
-
echo "" >&2
|
|
141
|
-
echo "USE INSTEAD:" >&2
|
|
142
|
-
echo " 1. cd to your worktree: cd worktrees/<lane>-wu-<id>/" >&2
|
|
143
|
-
echo " 2. Make your edits in the worktree" >&2
|
|
144
|
-
echo "" >&2
|
|
145
|
-
echo "See: LUMENFLOW.md for worktree discipline" >&2
|
|
146
|
-
echo "==============================" >&2
|
|
147
|
-
exit 2
|
|
148
|
-
fi
|
|
149
|
-
|
|
150
|
-
# WU-1501: Fail-closed on main when no active worktrees exist
|
|
151
|
-
# Check allowlist: paths that are always safe to write on main
|
|
152
|
-
RELATIVE_PATH="\${RESOLVED_PATH#\${MAIN_REPO_PATH}/}"
|
|
153
|
-
|
|
154
|
-
case "\$RELATIVE_PATH" in
|
|
155
|
-
docs/04-operations/tasks/wu/*) exit 0 ;; # WU YAML specs
|
|
156
|
-
.lumenflow/*) exit 0 ;; # LumenFlow state/config
|
|
157
|
-
.claude/*) exit 0 ;; # Claude Code config
|
|
158
|
-
plan/*) exit 0 ;; # Plan/spec scaffolds
|
|
159
|
-
esac
|
|
160
|
-
|
|
161
|
-
# Check for branch-pr claimed_mode (allows main writes without worktree)
|
|
162
|
-
STATE_FILE="\${LUMENFLOW_DIR}/state/wu-events.jsonl"
|
|
163
|
-
if [[ -f "\$STATE_FILE" ]]; then
|
|
164
|
-
if grep -q '"claimed_mode":"branch-pr"' "\$STATE_FILE" 2>/dev/null; then
|
|
165
|
-
if grep -q '"status":"in_progress"' "\$STATE_FILE" 2>/dev/null; then
|
|
166
|
-
exit 0 # Branch-PR WU active - allow main writes
|
|
167
|
-
fi
|
|
168
|
-
fi
|
|
169
|
-
fi
|
|
170
|
-
|
|
171
|
-
# WU-1501: Fail-closed - no active claim context, block the write
|
|
172
|
-
echo "" >&2
|
|
173
|
-
echo "=== Worktree Enforcement ===" >&2
|
|
174
|
-
echo "" >&2
|
|
175
|
-
echo "BLOCKED: \$TOOL_NAME on main (no active WU claim)" >&2
|
|
176
|
-
echo "" >&2
|
|
177
|
-
echo "No worktrees exist and no branch-pr WU is in progress." >&2
|
|
178
|
-
echo "" >&2
|
|
179
|
-
echo "WHAT TO DO:" >&2
|
|
180
|
-
echo " 1. Claim a WU: pnpm wu:claim --id WU-XXXX --lane \\"<Lane>\\"" >&2
|
|
181
|
-
echo " 2. cd worktrees/<lane>-wu-xxxx" >&2
|
|
182
|
-
echo " 3. Make your edits in the worktree" >&2
|
|
183
|
-
echo "" >&2
|
|
184
|
-
echo "See: LUMENFLOW.md for worktree discipline" >&2
|
|
185
|
-
echo "==============================" >&2
|
|
186
|
-
exit 2
|
|
187
|
-
`;
|
|
188
|
-
/* eslint-enable no-useless-escape */
|
|
189
|
-
}
|
|
190
|
-
//# sourceMappingURL=enforce-worktree.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enforce-worktree.js","sourceRoot":"","sources":["../../../src/hooks/generators/enforce-worktree.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,yCAAyC;AAEzC;;;;;GAKG;AAEH;;;;;;;GAOG;AACH,MAAM,UAAU,6BAA6B;IAC3C,sFAAsF;IACtF,sCAAsC;IACtC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuKR,CAAC;IACA,qCAAqC;AACvC,CAAC"}
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2026 Hellmai Ltd
|
|
2
|
-
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
/**
|
|
4
|
-
* @file generators/index.ts
|
|
5
|
-
* Barrel export for per-hook generator modules (WU-1645).
|
|
6
|
-
*
|
|
7
|
-
* Each hook script builder lives in its own file for focused maintainability.
|
|
8
|
-
* This barrel re-exports all generators so that enforcement-generator.ts
|
|
9
|
-
* (and other consumers) can import from a single location.
|
|
10
|
-
*/
|
|
11
|
-
export { generateEnforceWorktreeScript } from './enforce-worktree.js';
|
|
12
|
-
export { generateRequireWuScript } from './require-wu.js';
|
|
13
|
-
export { generateWarnIncompleteScript } from './warn-incomplete.js';
|
|
14
|
-
export { generatePreCompactCheckpointScript } from './pre-compact-checkpoint.js';
|
|
15
|
-
export { generateSessionStartRecoveryScript } from './session-start-recovery.js';
|
|
16
|
-
export { generateAutoCheckpointScript } from './auto-checkpoint.js';
|
|
17
|
-
export { surfaceUnreadSignals, markCompletedWUSignalsAsRead, } from './signal-utils.js';
|
|
18
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/hooks/generators/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,yCAAyC;AAEzC;;;;;;;GAOG;AAEH,OAAO,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,kCAAkC,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,kCAAkC,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EACL,oBAAoB,EACpB,4BAA4B,GAG7B,MAAM,mBAAmB,CAAC"}
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2026 Hellmai Ltd
|
|
2
|
-
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
/**
|
|
4
|
-
* @file generators/pre-compact-checkpoint.ts
|
|
5
|
-
* Generate the pre-compact-checkpoint.sh hook script content (WU-1394).
|
|
6
|
-
*
|
|
7
|
-
* Extracted from enforcement-generator.ts by WU-1645.
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Generate the pre-compact-checkpoint.sh hook script content.
|
|
11
|
-
*
|
|
12
|
-
* This PreCompact hook saves a checkpoint and writes a durable recovery file
|
|
13
|
-
* before context compaction. The recovery file survives compaction and is
|
|
14
|
-
* read by session-start-recovery.sh on the next session start.
|
|
15
|
-
*
|
|
16
|
-
* Part of WU-1394: Durable recovery pattern for context preservation.
|
|
17
|
-
*/
|
|
18
|
-
export function generatePreCompactCheckpointScript() {
|
|
19
|
-
// Note: Shell variable escapes (\$, \") are intentional for the generated bash script
|
|
20
|
-
/* eslint-disable no-useless-escape */
|
|
21
|
-
return `#!/bin/bash
|
|
22
|
-
#
|
|
23
|
-
# pre-compact-checkpoint.sh
|
|
24
|
-
#
|
|
25
|
-
# PreCompact hook - auto-checkpoint + durable recovery marker (WU-1390)
|
|
26
|
-
#
|
|
27
|
-
# Fires before context compaction to:
|
|
28
|
-
# 1. Save a checkpoint with the current WU progress
|
|
29
|
-
# 2. Write a durable recovery file that survives compaction
|
|
30
|
-
#
|
|
31
|
-
# The recovery file is read by session-start-recovery.sh on the next
|
|
32
|
-
# session start (after compact, resume, or clear) to restore context.
|
|
33
|
-
#
|
|
34
|
-
# Exit codes:
|
|
35
|
-
# 0 = Always allow (cannot block compaction)
|
|
36
|
-
#
|
|
37
|
-
# Uses python3 for JSON parsing (consistent with other hooks)
|
|
38
|
-
#
|
|
39
|
-
|
|
40
|
-
set -euo pipefail
|
|
41
|
-
|
|
42
|
-
SCRIPT_DIR="$(cd "$(dirname "\${BASH_SOURCE[0]}")" && pwd)"
|
|
43
|
-
|
|
44
|
-
# Derive repo paths from CLAUDE_PROJECT_DIR
|
|
45
|
-
if [[ -n "\${CLAUDE_PROJECT_DIR:-}" ]]; then
|
|
46
|
-
REPO_PATH="\$CLAUDE_PROJECT_DIR"
|
|
47
|
-
else
|
|
48
|
-
REPO_PATH=\$(git rev-parse --show-toplevel 2>/dev/null || echo "")
|
|
49
|
-
if [[ -z "\$REPO_PATH" ]]; then
|
|
50
|
-
exit 0
|
|
51
|
-
fi
|
|
52
|
-
fi
|
|
53
|
-
|
|
54
|
-
# Read JSON input from stdin
|
|
55
|
-
INPUT=\$(cat)
|
|
56
|
-
|
|
57
|
-
# Parse trigger from hook input (defensive - default to "auto")
|
|
58
|
-
# PreCompact provides: { "trigger": "manual" | "auto" }
|
|
59
|
-
TRIGGER=\$(python3 -c "
|
|
60
|
-
import json
|
|
61
|
-
import sys
|
|
62
|
-
try:
|
|
63
|
-
data = json.loads('''\$INPUT''')
|
|
64
|
-
trigger = data.get('trigger', 'auto')
|
|
65
|
-
print(trigger if trigger else 'auto')
|
|
66
|
-
except:
|
|
67
|
-
print('auto')
|
|
68
|
-
" 2>/dev/null || echo "auto")
|
|
69
|
-
|
|
70
|
-
# Get WU ID from worktree context (wu:status --json)
|
|
71
|
-
# Location.worktreeWuId is set when in a worktree
|
|
72
|
-
WU_ID=\$(pnpm wu:status --json 2>/dev/null | python3 -c "
|
|
73
|
-
import json
|
|
74
|
-
import sys
|
|
75
|
-
try:
|
|
76
|
-
data = json.load(sys.stdin)
|
|
77
|
-
location = data.get('location', {})
|
|
78
|
-
wu_id = location.get('worktreeWuId') or ''
|
|
79
|
-
print(wu_id)
|
|
80
|
-
except:
|
|
81
|
-
print('')
|
|
82
|
-
" 2>/dev/null || echo "")
|
|
83
|
-
|
|
84
|
-
# Proceed with worktree-based recovery if we have a WU ID
|
|
85
|
-
if [[ -n "\$WU_ID" ]]; then
|
|
86
|
-
# Save checkpoint with pre-compact trigger
|
|
87
|
-
# Note: This may fail if CLI not built, but that's OK - recovery file is more important
|
|
88
|
-
pnpm mem:checkpoint "Auto: pre-\${TRIGGER}-compaction" --wu "\$WU_ID" --trigger "pre-compact" --quiet 2>/dev/null || true
|
|
89
|
-
|
|
90
|
-
# Write durable recovery marker (survives compaction)
|
|
91
|
-
# This is the key mechanism - file persists and is read by session-start-recovery.sh
|
|
92
|
-
RECOVERY_DIR="\${REPO_PATH}/.lumenflow/state"
|
|
93
|
-
RECOVERY_FILE="\${RECOVERY_DIR}/recovery-pending-\${WU_ID}.md"
|
|
94
|
-
|
|
95
|
-
mkdir -p "\$RECOVERY_DIR"
|
|
96
|
-
|
|
97
|
-
# Generate recovery context using mem:recover
|
|
98
|
-
# The --quiet flag outputs only the recovery context without headers
|
|
99
|
-
pnpm mem:recover --wu "\$WU_ID" --quiet > "\$RECOVERY_FILE" 2>/dev/null || {
|
|
100
|
-
# Fallback minimal recovery if mem:recover fails
|
|
101
|
-
cat > "\$RECOVERY_FILE" << EOF
|
|
102
|
-
# POST-COMPACTION RECOVERY
|
|
103
|
-
|
|
104
|
-
You are resuming work after context compaction. Your previous context was lost.
|
|
105
|
-
**WU:** \${WU_ID}
|
|
106
|
-
|
|
107
|
-
## Next Action
|
|
108
|
-
Run \\\`pnpm wu:brief --id \${WU_ID} --client \${LUMENFLOW_CLIENT:-claude-code}\\\` to generate a fresh handoff prompt.
|
|
109
|
-
EOF
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
# Output brief warning to stderr (may be compacted away, but recovery file persists)
|
|
113
|
-
echo "" >&2
|
|
114
|
-
echo "═══════════════════════════════════════════════════════" >&2
|
|
115
|
-
echo "⚠️ COMPACTION: Checkpoint saved for \${WU_ID}" >&2
|
|
116
|
-
echo "Recovery context: \${RECOVERY_FILE}" >&2
|
|
117
|
-
echo "Next: pnpm wu:brief --id \${WU_ID} --client \${LUMENFLOW_CLIENT:-claude-code}" >&2
|
|
118
|
-
echo "═══════════════════════════════════════════════════════" >&2
|
|
119
|
-
else
|
|
120
|
-
# WU-1473: Non-worktree orchestrator context recovery
|
|
121
|
-
# When not in a worktree (e.g., orchestrator on main), surface unread inbox
|
|
122
|
-
# so agents have coordination context after compaction
|
|
123
|
-
echo "" >&2
|
|
124
|
-
echo "═══════════════════════════════════════════════════════" >&2
|
|
125
|
-
echo "⚠️ COMPACTION: No active WU detected (non-worktree context)" >&2
|
|
126
|
-
echo "Surfacing recent coordination signals via mem:inbox..." >&2
|
|
127
|
-
pnpm mem:inbox --since 1h --quiet 2>/dev/null >&2 || true
|
|
128
|
-
echo "═══════════════════════════════════════════════════════" >&2
|
|
129
|
-
fi
|
|
130
|
-
|
|
131
|
-
# Always exit 0 - cannot block compaction
|
|
132
|
-
exit 0
|
|
133
|
-
`;
|
|
134
|
-
/* eslint-enable no-useless-escape */
|
|
135
|
-
}
|
|
136
|
-
//# sourceMappingURL=pre-compact-checkpoint.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pre-compact-checkpoint.js","sourceRoot":"","sources":["../../../src/hooks/generators/pre-compact-checkpoint.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,yCAAyC;AAEzC;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,kCAAkC;IAChD,sFAAsF;IACtF,sCAAsC;IACtC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgHR,CAAC;IACA,qCAAqC;AACvC,CAAC"}
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2026 Hellmai Ltd
|
|
2
|
-
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
/**
|
|
4
|
-
* @file generators/require-wu.ts
|
|
5
|
-
* Generate the require-wu.sh hook script content (WU-1367).
|
|
6
|
-
*
|
|
7
|
-
* Extracted from enforcement-generator.ts by WU-1645.
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Generate the require-wu.sh hook script content.
|
|
11
|
-
*
|
|
12
|
-
* This hook blocks Write/Edit operations when no WU is claimed.
|
|
13
|
-
* Implements graceful degradation: allows operations if LumenFlow
|
|
14
|
-
* state cannot be determined.
|
|
15
|
-
*/
|
|
16
|
-
export function generateRequireWuScript() {
|
|
17
|
-
// Note: Shell variable escapes (\$, \") are intentional for the generated bash script
|
|
18
|
-
/* eslint-disable no-useless-escape */
|
|
19
|
-
return `#!/bin/bash
|
|
20
|
-
#
|
|
21
|
-
# require-wu.sh (WU-1367)
|
|
22
|
-
#
|
|
23
|
-
# PreToolUse hook that blocks Write/Edit when no WU is claimed.
|
|
24
|
-
# Graceful degradation: allows operations if state cannot be determined.
|
|
25
|
-
#
|
|
26
|
-
# Exit codes:
|
|
27
|
-
# 0 = Allow operation
|
|
28
|
-
# 2 = Block operation (stderr shown to Claude as guidance)
|
|
29
|
-
#
|
|
30
|
-
|
|
31
|
-
set -euo pipefail
|
|
32
|
-
|
|
33
|
-
SCRIPT_DIR="$(cd "$(dirname "\${BASH_SOURCE[0]}")" && pwd)"
|
|
34
|
-
|
|
35
|
-
# Graceful degradation
|
|
36
|
-
graceful_allow() {
|
|
37
|
-
local reason="\$1"
|
|
38
|
-
exit 0
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
if [[ -z "\${CLAUDE_PROJECT_DIR:-}" ]]; then
|
|
42
|
-
graceful_allow "CLAUDE_PROJECT_DIR not set"
|
|
43
|
-
fi
|
|
44
|
-
|
|
45
|
-
MAIN_REPO_PATH="\$CLAUDE_PROJECT_DIR"
|
|
46
|
-
WORKTREES_DIR="\${MAIN_REPO_PATH}/worktrees"
|
|
47
|
-
LUMENFLOW_DIR="\${MAIN_REPO_PATH}/.lumenflow"
|
|
48
|
-
STATE_FILE="\${LUMENFLOW_DIR}/state/wu-events.jsonl"
|
|
49
|
-
|
|
50
|
-
# Check if LumenFlow is configured
|
|
51
|
-
if [[ ! -d "\$LUMENFLOW_DIR" ]]; then
|
|
52
|
-
graceful_allow "No .lumenflow directory"
|
|
53
|
-
fi
|
|
54
|
-
|
|
55
|
-
# Read JSON input
|
|
56
|
-
INPUT=\$(cat)
|
|
57
|
-
if [[ -z "\$INPUT" ]]; then
|
|
58
|
-
graceful_allow "No input"
|
|
59
|
-
fi
|
|
60
|
-
|
|
61
|
-
# Parse JSON
|
|
62
|
-
TMPFILE=\$(mktemp)
|
|
63
|
-
echo "\$INPUT" > "\$TMPFILE"
|
|
64
|
-
|
|
65
|
-
TOOL_NAME=\$(python3 -c "
|
|
66
|
-
import json
|
|
67
|
-
try:
|
|
68
|
-
with open('\$TMPFILE', 'r') as f:
|
|
69
|
-
data = json.load(f)
|
|
70
|
-
print(data.get('tool_name', ''))
|
|
71
|
-
except:
|
|
72
|
-
print('')
|
|
73
|
-
" 2>/dev/null || echo "")
|
|
74
|
-
|
|
75
|
-
rm -f "\$TMPFILE"
|
|
76
|
-
|
|
77
|
-
# Only check Write and Edit
|
|
78
|
-
if [[ "\$TOOL_NAME" != "Write" && "\$TOOL_NAME" != "Edit" ]]; then
|
|
79
|
-
exit 0
|
|
80
|
-
fi
|
|
81
|
-
|
|
82
|
-
# Check for active worktrees (indicates claimed WU)
|
|
83
|
-
if [[ -d "\$WORKTREES_DIR" ]]; then
|
|
84
|
-
WORKTREE_COUNT=\$(find "\$WORKTREES_DIR" -mindepth 1 -maxdepth 1 -type d 2>/dev/null | wc -l)
|
|
85
|
-
if [[ "\$WORKTREE_COUNT" -gt 0 ]]; then
|
|
86
|
-
exit 0 # Has worktrees = has claimed WU
|
|
87
|
-
fi
|
|
88
|
-
fi
|
|
89
|
-
|
|
90
|
-
# Check state file for in_progress WUs
|
|
91
|
-
if [[ -f "\$STATE_FILE" ]]; then
|
|
92
|
-
# Look for UnsafeAny WU with in_progress status
|
|
93
|
-
if grep -q '"status":"in_progress"' "\$STATE_FILE" 2>/dev/null; then
|
|
94
|
-
exit 0 # Has in_progress WU
|
|
95
|
-
fi
|
|
96
|
-
fi
|
|
97
|
-
|
|
98
|
-
# No claimed WU found
|
|
99
|
-
echo "" >&2
|
|
100
|
-
echo "=== WU Enforcement ===" >&2
|
|
101
|
-
echo "" >&2
|
|
102
|
-
echo "BLOCKED: \$TOOL_NAME without claimed WU" >&2
|
|
103
|
-
echo "" >&2
|
|
104
|
-
echo "You must claim a WU before making edits:" >&2
|
|
105
|
-
echo " pnpm wu:claim --id WU-XXXX --lane <Lane>" >&2
|
|
106
|
-
echo " cd worktrees/<lane>-wu-xxxx" >&2
|
|
107
|
-
echo "" >&2
|
|
108
|
-
echo "Or create a new WU:" >&2
|
|
109
|
-
echo " pnpm wu:create --lane <Lane> --title \"Description\"" >&2
|
|
110
|
-
echo "" >&2
|
|
111
|
-
echo "See: LUMENFLOW.md for workflow details" >&2
|
|
112
|
-
echo "======================" >&2
|
|
113
|
-
exit 2
|
|
114
|
-
`;
|
|
115
|
-
/* eslint-enable no-useless-escape */
|
|
116
|
-
}
|
|
117
|
-
//# sourceMappingURL=require-wu.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"require-wu.js","sourceRoot":"","sources":["../../../src/hooks/generators/require-wu.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,yCAAyC;AAEzC;;;;;GAKG;AAEH;;;;;;GAMG;AACH,MAAM,UAAU,uBAAuB;IACrC,sFAAsF;IACtF,sCAAsC;IACtC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+FR,CAAC;IACA,qCAAqC;AACvC,CAAC"}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2026 Hellmai Ltd
|
|
2
|
-
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
/**
|
|
4
|
-
* @file generators/session-start-recovery.ts
|
|
5
|
-
* Generate the session-start-recovery.sh hook script content (WU-1394).
|
|
6
|
-
*
|
|
7
|
-
* Extracted from enforcement-generator.ts by WU-1645.
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* Generate the session-start-recovery.sh hook script content.
|
|
11
|
-
*
|
|
12
|
-
* This SessionStart hook checks for pending recovery files written by
|
|
13
|
-
* pre-compact-checkpoint.sh and displays the recovery context to the agent.
|
|
14
|
-
* After displaying, the recovery file is deleted (one-time recovery).
|
|
15
|
-
*
|
|
16
|
-
* Part of WU-1394: Durable recovery pattern for context preservation.
|
|
17
|
-
*/
|
|
18
|
-
export function generateSessionStartRecoveryScript() {
|
|
19
|
-
// Note: Shell variable escapes (\$, \") are intentional for the generated bash script
|
|
20
|
-
/* eslint-disable no-useless-escape */
|
|
21
|
-
return `#!/bin/bash
|
|
22
|
-
#
|
|
23
|
-
# session-start-recovery.sh
|
|
24
|
-
#
|
|
25
|
-
# SessionStart hook - check for pending recovery and inject context (WU-1390)
|
|
26
|
-
#
|
|
27
|
-
# Fires after session start (on compact, resume, or clear) to:
|
|
28
|
-
# 1. Check for recovery-pending-*.md files written by pre-compact-checkpoint.sh
|
|
29
|
-
# 2. Display the recovery context to the agent
|
|
30
|
-
# 3. Remove the recovery file (one-time recovery)
|
|
31
|
-
#
|
|
32
|
-
# This completes the durable recovery pattern:
|
|
33
|
-
# PreCompact writes file → SessionStart reads and deletes it
|
|
34
|
-
#
|
|
35
|
-
# Exit codes:
|
|
36
|
-
# 0 = Always allow (informational hook)
|
|
37
|
-
#
|
|
38
|
-
|
|
39
|
-
set -euo pipefail
|
|
40
|
-
|
|
41
|
-
# Derive repo paths from CLAUDE_PROJECT_DIR
|
|
42
|
-
if [[ -n "\${CLAUDE_PROJECT_DIR:-}" ]]; then
|
|
43
|
-
REPO_PATH="\$CLAUDE_PROJECT_DIR"
|
|
44
|
-
else
|
|
45
|
-
REPO_PATH=\$(git rev-parse --show-toplevel 2>/dev/null || echo "")
|
|
46
|
-
if [[ -z "\$REPO_PATH" ]]; then
|
|
47
|
-
exit 0
|
|
48
|
-
fi
|
|
49
|
-
fi
|
|
50
|
-
|
|
51
|
-
RECOVERY_DIR="\${REPO_PATH}/.lumenflow/state"
|
|
52
|
-
|
|
53
|
-
# Check if recovery directory exists
|
|
54
|
-
if [[ ! -d "\$RECOVERY_DIR" ]]; then
|
|
55
|
-
exit 0
|
|
56
|
-
fi
|
|
57
|
-
|
|
58
|
-
# Find UnsafeAny pending recovery files
|
|
59
|
-
FOUND_RECOVERY=false
|
|
60
|
-
|
|
61
|
-
for recovery_file in "\$RECOVERY_DIR"/recovery-pending-*.md; do
|
|
62
|
-
# Check if glob matched UnsafeAny files (bash glob returns literal pattern if no match)
|
|
63
|
-
[[ -f "\$recovery_file" ]] || continue
|
|
64
|
-
|
|
65
|
-
FOUND_RECOVERY=true
|
|
66
|
-
|
|
67
|
-
# Extract WU ID from filename for display
|
|
68
|
-
WU_ID=\$(basename "\$recovery_file" | sed 's/recovery-pending-\\(.*\\)\\.md/\\1/')
|
|
69
|
-
|
|
70
|
-
echo "" >&2
|
|
71
|
-
echo "═══════════════════════════════════════════════════════" >&2
|
|
72
|
-
echo "⚠️ POST-COMPACTION RECOVERY DETECTED" >&2
|
|
73
|
-
echo "═══════════════════════════════════════════════════════" >&2
|
|
74
|
-
echo "" >&2
|
|
75
|
-
|
|
76
|
-
# Display the recovery context
|
|
77
|
-
cat "\$recovery_file" >&2
|
|
78
|
-
|
|
79
|
-
echo "" >&2
|
|
80
|
-
echo "═══════════════════════════════════════════════════════" >&2
|
|
81
|
-
echo "" >&2
|
|
82
|
-
|
|
83
|
-
# Remove after displaying (one-time recovery)
|
|
84
|
-
rm -f "\$recovery_file"
|
|
85
|
-
done
|
|
86
|
-
|
|
87
|
-
# Additional context if recovery was displayed
|
|
88
|
-
if [[ "\$FOUND_RECOVERY" == "true" ]]; then
|
|
89
|
-
echo "IMPORTANT: Your context was compacted. Review the recovery info above." >&2
|
|
90
|
-
echo "Recommended: Run 'pnpm wu:brief --id \$WU_ID --client \${LUMENFLOW_CLIENT:-claude-code}' for fresh full context." >&2
|
|
91
|
-
echo "" >&2
|
|
92
|
-
fi
|
|
93
|
-
|
|
94
|
-
# WU-1473: Surface unread coordination signals for non-worktree orchestrators
|
|
95
|
-
# Even without recovery files, agents benefit from seeing recent inbox activity
|
|
96
|
-
# This supports orchestrators running from main checkout (not in a worktree)
|
|
97
|
-
pnpm mem:inbox --since 1h --unread-only --quiet 2>/dev/null >&2 || true
|
|
98
|
-
|
|
99
|
-
exit 0
|
|
100
|
-
`;
|
|
101
|
-
/* eslint-enable no-useless-escape */
|
|
102
|
-
}
|
|
103
|
-
//# sourceMappingURL=session-start-recovery.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"session-start-recovery.js","sourceRoot":"","sources":["../../../src/hooks/generators/session-start-recovery.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,yCAAyC;AAEzC;;;;;GAKG;AAEH;;;;;;;;GAQG;AACH,MAAM,UAAU,kCAAkC;IAChD,sFAAsF;IACtF,sCAAsC;IACtC,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+ER,CAAC;IACA,qCAAqC;AACvC,CAAC"}
|
|
@@ -1,54 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2026 Hellmai Ltd
|
|
2
|
-
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
/**
|
|
4
|
-
* @file generators/signal-utils.ts
|
|
5
|
-
* Signal surfacing and marking utilities for enforcement hooks (WU-1473).
|
|
6
|
-
*
|
|
7
|
-
* Extracted from enforcement-generator.ts by WU-1645.
|
|
8
|
-
*/
|
|
9
|
-
import { loadSignals, markSignalsAsRead } from '@lumenflow/memory/signal';
|
|
10
|
-
/**
|
|
11
|
-
* WU-1473: Surface unread signals for agent consumption during claim/start.
|
|
12
|
-
*
|
|
13
|
-
* Loads all unread signals from the memory layer and returns them for display.
|
|
14
|
-
* Implements fail-open: UnsafeAny error returns an empty result without throwing.
|
|
15
|
-
*
|
|
16
|
-
* @param baseDir - Project base directory
|
|
17
|
-
* @returns Unread signal summary (never throws)
|
|
18
|
-
*/
|
|
19
|
-
export async function surfaceUnreadSignals(baseDir) {
|
|
20
|
-
try {
|
|
21
|
-
const signals = await loadSignals(baseDir, { unreadOnly: true });
|
|
22
|
-
return { count: signals.length, signals };
|
|
23
|
-
}
|
|
24
|
-
catch {
|
|
25
|
-
// WU-1473 AC4: Fail-open - memory errors never block lifecycle commands
|
|
26
|
-
return { count: 0, signals: [] };
|
|
27
|
-
}
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* WU-1473: Mark all signals for a completed WU as read using receipt-aware behavior.
|
|
31
|
-
*
|
|
32
|
-
* Loads signals scoped to the given WU ID and marks UnsafeAny unread ones as read
|
|
33
|
-
* by appending receipts (WU-1472 pattern). Does not rewrite signals.jsonl.
|
|
34
|
-
* Implements fail-open: UnsafeAny error returns zero count without throwing.
|
|
35
|
-
*
|
|
36
|
-
* @param baseDir - Project base directory
|
|
37
|
-
* @param wuId - WU ID whose signals should be marked as read
|
|
38
|
-
* @returns Result with count of signals marked (never throws)
|
|
39
|
-
*/
|
|
40
|
-
export async function markCompletedWUSignalsAsRead(baseDir, wuId) {
|
|
41
|
-
try {
|
|
42
|
-
const signals = await loadSignals(baseDir, { wuId, unreadOnly: true });
|
|
43
|
-
if (signals.length === 0) {
|
|
44
|
-
return { markedCount: 0 };
|
|
45
|
-
}
|
|
46
|
-
const signalIds = signals.map((sig) => sig.id);
|
|
47
|
-
return await markSignalsAsRead(baseDir, signalIds);
|
|
48
|
-
}
|
|
49
|
-
catch {
|
|
50
|
-
// WU-1473 AC4: Fail-open - memory errors never block lifecycle commands
|
|
51
|
-
return { markedCount: 0 };
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
//# sourceMappingURL=signal-utils.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"signal-utils.js","sourceRoot":"","sources":["../../../src/hooks/generators/signal-utils.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,yCAAyC;AAEzC;;;;;GAKG;AAEH,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAyB1E;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,OAAe;IACxD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QACjE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAC5C,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,OAAO,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;IACnC,CAAC;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAChD,OAAe,EACf,IAAY;IAEZ,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;QACvE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;QAC5B,CAAC;QACD,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC/C,OAAO,MAAM,iBAAiB,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,OAAO,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;IAC5B,CAAC;AACH,CAAC"}
|