@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,399 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2026 Hellmai Ltd
|
|
2
|
-
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
/**
|
|
4
|
-
* @file enforcement-checks.ts
|
|
5
|
-
* Runtime enforcement checks for LumenFlow workflow compliance (WU-1367)
|
|
6
|
-
* WU-1501: Fail-closed default on main - block writes when no active claim context
|
|
7
|
-
*
|
|
8
|
-
* These functions can be used by hooks to validate operations.
|
|
9
|
-
* Graceful degradation: if LumenFlow is NOT configured, operations are allowed.
|
|
10
|
-
* Fail-closed: if LumenFlow IS configured, writes on main require an active
|
|
11
|
-
* claim context (worktree or branch-pr) or an allowlisted path.
|
|
12
|
-
*/
|
|
13
|
-
// Note: fs operations use runtime-provided paths from LumenFlow configuration
|
|
14
|
-
import * as fs from 'node:fs';
|
|
15
|
-
import * as path from 'node:path';
|
|
16
|
-
/**
|
|
17
|
-
* WU-1501: Paths that are always safe to write on main checkout.
|
|
18
|
-
* These are scaffold/state paths that are written by lifecycle commands
|
|
19
|
-
* and must not require a worktree.
|
|
20
|
-
*/
|
|
21
|
-
const MAIN_WRITE_ALLOWLIST_PREFIXES = [
|
|
22
|
-
'docs/04-operations/tasks/wu/',
|
|
23
|
-
'.lumenflow/',
|
|
24
|
-
'.claude/',
|
|
25
|
-
'plan/',
|
|
26
|
-
];
|
|
27
|
-
const GIT_STATUS_PREFIX_LENGTH = 3;
|
|
28
|
-
const GIT_STATUS_RENAME_SEPARATOR = ' -> ';
|
|
29
|
-
const GIT_STATUS_QUOTE = '"';
|
|
30
|
-
const PATH_PREFIX_CURRENT_DIR = './';
|
|
31
|
-
const PATH_SEPARATOR_WINDOWS = '\\';
|
|
32
|
-
const PATH_SEPARATOR_POSIX = '/';
|
|
33
|
-
const MAX_BLOCKED_PATHS_IN_MESSAGE = 10;
|
|
34
|
-
const DIRTY_MAIN_GUARD_REASONS = {
|
|
35
|
-
BRANCH_PR_MODE: 'branch-pr-mode',
|
|
36
|
-
NO_WORKTREE_CONTEXT: 'no-worktree-context',
|
|
37
|
-
CLEAN_OR_ALLOWLISTED: 'clean-or-allowlisted',
|
|
38
|
-
BLOCKED_NON_ALLOWLISTED_DIRTY_MAIN: 'blocked-non-allowlisted-dirty-main',
|
|
39
|
-
};
|
|
40
|
-
function stripWrappingQuotes(value) {
|
|
41
|
-
if (value.startsWith(GIT_STATUS_QUOTE) && value.endsWith(GIT_STATUS_QUOTE) && value.length >= 2) {
|
|
42
|
-
return value.slice(1, -1);
|
|
43
|
-
}
|
|
44
|
-
return value;
|
|
45
|
-
}
|
|
46
|
-
function normalizeRepoRelativePath(value) {
|
|
47
|
-
const withoutQuotes = stripWrappingQuotes(value.trim());
|
|
48
|
-
const normalizedSeparators = withoutQuotes
|
|
49
|
-
.split(PATH_SEPARATOR_WINDOWS)
|
|
50
|
-
.join(PATH_SEPARATOR_POSIX);
|
|
51
|
-
if (normalizedSeparators.startsWith(PATH_PREFIX_CURRENT_DIR)) {
|
|
52
|
-
return normalizedSeparators.slice(PATH_PREFIX_CURRENT_DIR.length);
|
|
53
|
-
}
|
|
54
|
-
return normalizedSeparators;
|
|
55
|
-
}
|
|
56
|
-
function parsePathFromStatusLine(line) {
|
|
57
|
-
if (line.length < GIT_STATUS_PREFIX_LENGTH) {
|
|
58
|
-
return null;
|
|
59
|
-
}
|
|
60
|
-
const pathField = line.slice(GIT_STATUS_PREFIX_LENGTH).trim();
|
|
61
|
-
if (pathField.length === 0) {
|
|
62
|
-
return null;
|
|
63
|
-
}
|
|
64
|
-
// For renames, git status emits "old -> new". We care about the destination path.
|
|
65
|
-
const renameSegments = pathField.split(GIT_STATUS_RENAME_SEPARATOR);
|
|
66
|
-
const destinationPath = renameSegments[renameSegments.length - 1];
|
|
67
|
-
const normalizedPath = normalizeRepoRelativePath(destinationPath);
|
|
68
|
-
return normalizedPath.length > 0 ? normalizedPath : null;
|
|
69
|
-
}
|
|
70
|
-
export function parseDirtyPathsFromStatus(mainStatus) {
|
|
71
|
-
const uniquePaths = new Set();
|
|
72
|
-
for (const line of mainStatus.split('\n')) {
|
|
73
|
-
const trimmed = line.trimEnd();
|
|
74
|
-
if (trimmed.length === 0) {
|
|
75
|
-
continue;
|
|
76
|
-
}
|
|
77
|
-
const parsed = parsePathFromStatusLine(trimmed);
|
|
78
|
-
if (parsed) {
|
|
79
|
-
uniquePaths.add(parsed);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
return Array.from(uniquePaths);
|
|
83
|
-
}
|
|
84
|
-
export function getNonAllowlistedDirtyPaths(mainStatus, allowlistPrefixes = MAIN_WRITE_ALLOWLIST_PREFIXES) {
|
|
85
|
-
return parseDirtyPathsFromStatus(mainStatus).filter((relativePath) => !allowlistPrefixes.some((prefix) => relativePath.startsWith(prefix)));
|
|
86
|
-
}
|
|
87
|
-
function formatBlockedPaths(paths) {
|
|
88
|
-
const displayed = paths.slice(0, MAX_BLOCKED_PATHS_IN_MESSAGE);
|
|
89
|
-
const lines = displayed.map((dirtyPath) => ` - ${dirtyPath}`);
|
|
90
|
-
const remainder = paths.length - displayed.length;
|
|
91
|
-
if (remainder > 0) {
|
|
92
|
-
lines.push(` - ... and ${remainder} more`);
|
|
93
|
-
}
|
|
94
|
-
return lines.join('\n');
|
|
95
|
-
}
|
|
96
|
-
export function formatMainDirtyMutationGuardMessage(options) {
|
|
97
|
-
const { commandName, mainCheckout, blockedPaths } = options;
|
|
98
|
-
return (`${commandName} blocked: main checkout has non-allowlisted dirty files while a worktree WU is active.\n\n` +
|
|
99
|
-
`Dirty paths:\n${formatBlockedPaths(blockedPaths)}\n\n` +
|
|
100
|
-
`Allowed dirty prefixes on main:\n` +
|
|
101
|
-
` - docs/04-operations/tasks/wu/\n` +
|
|
102
|
-
` - .lumenflow/\n` +
|
|
103
|
-
` - .claude/\n` +
|
|
104
|
-
` - plan/\n\n` +
|
|
105
|
-
`How to resolve:\n` +
|
|
106
|
-
` 1. Move edits into the active worktree (recommended)\n` +
|
|
107
|
-
` 2. Revert or commit unintended main edits\n` +
|
|
108
|
-
` 3. If writes came from MCP/tools, rerun them in the worktree path\n` +
|
|
109
|
-
` 4. Retry ${commandName}\n\n` +
|
|
110
|
-
`Main checkout: ${mainCheckout}`);
|
|
111
|
-
}
|
|
112
|
-
export function evaluateMainDirtyMutationGuard(options) {
|
|
113
|
-
const { commandName, mainCheckout, mainStatus, hasActiveWorktreeContext, isBranchPrMode } = options;
|
|
114
|
-
if (isBranchPrMode) {
|
|
115
|
-
return {
|
|
116
|
-
blocked: false,
|
|
117
|
-
blockedPaths: [],
|
|
118
|
-
reason: DIRTY_MAIN_GUARD_REASONS.BRANCH_PR_MODE,
|
|
119
|
-
};
|
|
120
|
-
}
|
|
121
|
-
if (!hasActiveWorktreeContext) {
|
|
122
|
-
return {
|
|
123
|
-
blocked: false,
|
|
124
|
-
blockedPaths: [],
|
|
125
|
-
reason: DIRTY_MAIN_GUARD_REASONS.NO_WORKTREE_CONTEXT,
|
|
126
|
-
};
|
|
127
|
-
}
|
|
128
|
-
const blockedPaths = getNonAllowlistedDirtyPaths(mainStatus);
|
|
129
|
-
if (blockedPaths.length === 0) {
|
|
130
|
-
return {
|
|
131
|
-
blocked: false,
|
|
132
|
-
blockedPaths: [],
|
|
133
|
-
reason: DIRTY_MAIN_GUARD_REASONS.CLEAN_OR_ALLOWLISTED,
|
|
134
|
-
};
|
|
135
|
-
}
|
|
136
|
-
return {
|
|
137
|
-
blocked: true,
|
|
138
|
-
blockedPaths,
|
|
139
|
-
reason: DIRTY_MAIN_GUARD_REASONS.BLOCKED_NON_ALLOWLISTED_DIRTY_MAIN,
|
|
140
|
-
message: formatMainDirtyMutationGuardMessage({
|
|
141
|
-
commandName,
|
|
142
|
-
mainCheckout,
|
|
143
|
-
blockedPaths,
|
|
144
|
-
}),
|
|
145
|
-
};
|
|
146
|
-
}
|
|
147
|
-
/**
|
|
148
|
-
* WU-1501: Check if a resolved path matches the main-write allowlist.
|
|
149
|
-
*
|
|
150
|
-
* @param resolvedPath - Absolute resolved path to check
|
|
151
|
-
* @param mainRepoPath - Absolute path to the main repo root
|
|
152
|
-
* @returns True if the path is in the allowlist
|
|
153
|
-
*/
|
|
154
|
-
function isAllowlistedPath(resolvedPath, mainRepoPath) {
|
|
155
|
-
// Get the path relative to the repo root
|
|
156
|
-
const repoPrefix = mainRepoPath + path.sep;
|
|
157
|
-
if (!resolvedPath.startsWith(repoPrefix)) {
|
|
158
|
-
return false;
|
|
159
|
-
}
|
|
160
|
-
const relativePath = resolvedPath.slice(repoPrefix.length);
|
|
161
|
-
return MAIN_WRITE_ALLOWLIST_PREFIXES.some((prefix) => relativePath.startsWith(prefix));
|
|
162
|
-
}
|
|
163
|
-
/**
|
|
164
|
-
* WU-1501: Check if there is an active branch-pr claimed WU in the state file.
|
|
165
|
-
*
|
|
166
|
-
* Branch-PR WUs work on the lane branch from the main checkout without a worktree.
|
|
167
|
-
* When a branch-pr WU is in_progress, writes from main are allowed.
|
|
168
|
-
*
|
|
169
|
-
* @param mainRepoPath - Absolute path to the main repo root
|
|
170
|
-
* @returns True if a branch-pr WU is actively claimed
|
|
171
|
-
*/
|
|
172
|
-
function hasBranchPrClaim(mainRepoPath) {
|
|
173
|
-
const stateFile = path.join(mainRepoPath, '.lumenflow', 'state', 'wu-events.jsonl');
|
|
174
|
-
if (!fs.existsSync(stateFile)) {
|
|
175
|
-
return false;
|
|
176
|
-
}
|
|
177
|
-
try {
|
|
178
|
-
const content = fs.readFileSync(stateFile, 'utf-8');
|
|
179
|
-
return (content.includes('"claimed_mode":"branch-pr"') && content.includes('"status":"in_progress"'));
|
|
180
|
-
}
|
|
181
|
-
catch {
|
|
182
|
-
return false;
|
|
183
|
-
}
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Check if a Write/Edit operation should be allowed based on worktree enforcement.
|
|
187
|
-
*
|
|
188
|
-
* WU-1501: Fail-closed on main. When LumenFlow is configured, writes on main
|
|
189
|
-
* are blocked unless:
|
|
190
|
-
* - The path is in the allowlist (WU specs, .lumenflow/, .claude/, plan/)
|
|
191
|
-
* - A branch-pr WU is actively claimed
|
|
192
|
-
* - An active worktree exists (original behavior)
|
|
193
|
-
*
|
|
194
|
-
* Graceful degradation still applies when LumenFlow is NOT configured.
|
|
195
|
-
*
|
|
196
|
-
* @param input - Tool input with file_path and tool_name
|
|
197
|
-
* @param projectDir - Project directory (defaults to CLAUDE_PROJECT_DIR)
|
|
198
|
-
* @returns Check result with allowed status and reason
|
|
199
|
-
*/
|
|
200
|
-
export async function checkWorktreeEnforcement(input, projectDir) {
|
|
201
|
-
const mainRepoPath = projectDir ?? process.env.CLAUDE_PROJECT_DIR;
|
|
202
|
-
// Graceful degradation: no project dir
|
|
203
|
-
if (!mainRepoPath) {
|
|
204
|
-
return {
|
|
205
|
-
allowed: true,
|
|
206
|
-
reason: 'graceful: CLAUDE_PROJECT_DIR not set',
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
const lumenflowDir = path.join(mainRepoPath, '.lumenflow');
|
|
210
|
-
const worktreesDir = path.join(mainRepoPath, 'worktrees');
|
|
211
|
-
// Graceful degradation: LumenFlow not configured
|
|
212
|
-
if (!fs.existsSync(lumenflowDir)) {
|
|
213
|
-
return {
|
|
214
|
-
allowed: true,
|
|
215
|
-
reason: 'graceful: LumenFlow not configured',
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
// Resolve the file path
|
|
219
|
-
let resolvedPath;
|
|
220
|
-
try {
|
|
221
|
-
resolvedPath = path.resolve(input.file_path);
|
|
222
|
-
}
|
|
223
|
-
catch {
|
|
224
|
-
return {
|
|
225
|
-
allowed: true,
|
|
226
|
-
reason: 'graceful: cannot resolve file path',
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
// Path is outside repo entirely - allow
|
|
230
|
-
if (!resolvedPath.startsWith(mainRepoPath + path.sep) && resolvedPath !== mainRepoPath) {
|
|
231
|
-
return {
|
|
232
|
-
allowed: true,
|
|
233
|
-
reason: 'path is outside repository',
|
|
234
|
-
};
|
|
235
|
-
}
|
|
236
|
-
// Allow if path is inside a worktree
|
|
237
|
-
if (resolvedPath.startsWith(worktreesDir + path.sep)) {
|
|
238
|
-
return {
|
|
239
|
-
allowed: true,
|
|
240
|
-
reason: 'path is inside worktree',
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
// Check for active worktrees - if they exist, original block logic applies
|
|
244
|
-
let hasActiveWorktrees = false;
|
|
245
|
-
if (fs.existsSync(worktreesDir)) {
|
|
246
|
-
try {
|
|
247
|
-
const entries = fs.readdirSync(worktreesDir);
|
|
248
|
-
const worktreeCount = entries.filter((e) => {
|
|
249
|
-
const stat = fs.statSync(path.join(worktreesDir, e));
|
|
250
|
-
return stat.isDirectory();
|
|
251
|
-
}).length;
|
|
252
|
-
hasActiveWorktrees = worktreeCount > 0;
|
|
253
|
-
}
|
|
254
|
-
catch {
|
|
255
|
-
// Cannot read worktrees - continue to fail-closed checks
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
// If active worktrees exist, block writes to main repo (original behavior)
|
|
259
|
-
if (hasActiveWorktrees) {
|
|
260
|
-
const activeWorktrees = fs
|
|
261
|
-
.readdirSync(worktreesDir)
|
|
262
|
-
.filter((e) => fs.statSync(path.join(worktreesDir, e)).isDirectory())
|
|
263
|
-
.slice(0, 5)
|
|
264
|
-
.join(', ');
|
|
265
|
-
return {
|
|
266
|
-
allowed: false,
|
|
267
|
-
reason: `cannot write to main repo while worktrees exist (${activeWorktrees})`,
|
|
268
|
-
suggestion: 'cd to your worktree: cd worktrees/<lane>-wu-<id>/',
|
|
269
|
-
};
|
|
270
|
-
}
|
|
271
|
-
// WU-1501: No active worktrees - fail-closed on main
|
|
272
|
-
// Check allowlist first (always permitted regardless of claim state)
|
|
273
|
-
if (isAllowlistedPath(resolvedPath, mainRepoPath)) {
|
|
274
|
-
return {
|
|
275
|
-
allowed: true,
|
|
276
|
-
reason: 'allowlist: path is in safe scaffold/state area',
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
// Check for branch-pr claimed_mode (allows main writes)
|
|
280
|
-
if (hasBranchPrClaim(mainRepoPath)) {
|
|
281
|
-
return {
|
|
282
|
-
allowed: true,
|
|
283
|
-
reason: 'branch-pr: active branch-pr WU permits main writes',
|
|
284
|
-
};
|
|
285
|
-
}
|
|
286
|
-
// WU-1501: Fail-closed - no active claim context, block the write
|
|
287
|
-
return {
|
|
288
|
-
allowed: false,
|
|
289
|
-
reason: 'no active claim context on main (fail-closed)',
|
|
290
|
-
suggestion: 'Claim a WU first: pnpm wu:claim --id WU-XXXX --lane <Lane>\n' +
|
|
291
|
-
'Or use --cloud for branch-pr mode: pnpm wu:claim --id WU-XXXX --lane <Lane> --cloud',
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Check if a Write/Edit operation should be allowed based on WU requirement.
|
|
296
|
-
*
|
|
297
|
-
* @param input - Tool input with file_path and tool_name
|
|
298
|
-
* @param projectDir - Project directory
|
|
299
|
-
* @returns Check result with allowed status and reason
|
|
300
|
-
*/
|
|
301
|
-
export async function checkWuRequirement(input, projectDir) {
|
|
302
|
-
const mainRepoPath = projectDir ?? process.env.CLAUDE_PROJECT_DIR;
|
|
303
|
-
if (!mainRepoPath) {
|
|
304
|
-
return {
|
|
305
|
-
allowed: true,
|
|
306
|
-
reason: 'graceful: CLAUDE_PROJECT_DIR not set',
|
|
307
|
-
};
|
|
308
|
-
}
|
|
309
|
-
const lumenflowDir = path.join(mainRepoPath, '.lumenflow');
|
|
310
|
-
const worktreesDir = path.join(mainRepoPath, 'worktrees');
|
|
311
|
-
const stateFile = path.join(lumenflowDir, 'state', 'wu-events.jsonl');
|
|
312
|
-
// Graceful degradation: LumenFlow not configured
|
|
313
|
-
if (!fs.existsSync(lumenflowDir)) {
|
|
314
|
-
return {
|
|
315
|
-
allowed: true,
|
|
316
|
-
reason: 'graceful: LumenFlow not configured',
|
|
317
|
-
};
|
|
318
|
-
}
|
|
319
|
-
// Check for active worktrees (indicates claimed WU)
|
|
320
|
-
if (fs.existsSync(worktreesDir)) {
|
|
321
|
-
try {
|
|
322
|
-
const entries = fs.readdirSync(worktreesDir);
|
|
323
|
-
const worktreeCount = entries.filter((e) => {
|
|
324
|
-
const stat = fs.statSync(path.join(worktreesDir, e));
|
|
325
|
-
return stat.isDirectory();
|
|
326
|
-
}).length;
|
|
327
|
-
if (worktreeCount > 0) {
|
|
328
|
-
return {
|
|
329
|
-
allowed: true,
|
|
330
|
-
reason: 'has active worktree (claimed WU)',
|
|
331
|
-
};
|
|
332
|
-
}
|
|
333
|
-
}
|
|
334
|
-
catch {
|
|
335
|
-
// Continue to state file check
|
|
336
|
-
}
|
|
337
|
-
}
|
|
338
|
-
// Check state file for in_progress WUs
|
|
339
|
-
if (fs.existsSync(stateFile)) {
|
|
340
|
-
try {
|
|
341
|
-
const content = fs.readFileSync(stateFile, 'utf-8');
|
|
342
|
-
if (content.includes('"status":"in_progress"')) {
|
|
343
|
-
return {
|
|
344
|
-
allowed: true,
|
|
345
|
-
reason: 'has in_progress WU in state',
|
|
346
|
-
};
|
|
347
|
-
}
|
|
348
|
-
}
|
|
349
|
-
catch {
|
|
350
|
-
return {
|
|
351
|
-
allowed: true,
|
|
352
|
-
reason: 'graceful: cannot read state file',
|
|
353
|
-
};
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
// No claimed WU found
|
|
357
|
-
return {
|
|
358
|
-
allowed: false,
|
|
359
|
-
reason: 'no WU claimed',
|
|
360
|
-
suggestion: 'pnpm wu:claim --id WU-XXXX --lane <Lane>',
|
|
361
|
-
};
|
|
362
|
-
}
|
|
363
|
-
/**
|
|
364
|
-
* Check if the current working directory is inside a worktree.
|
|
365
|
-
*
|
|
366
|
-
* @param cwd - Current working directory
|
|
367
|
-
* @param projectDir - Project directory
|
|
368
|
-
* @returns True if cwd is inside a worktree
|
|
369
|
-
*/
|
|
370
|
-
export function isInsideWorktree(cwd, projectDir) {
|
|
371
|
-
const worktreesDir = path.join(projectDir, 'worktrees');
|
|
372
|
-
if (!fs.existsSync(worktreesDir)) {
|
|
373
|
-
return false;
|
|
374
|
-
}
|
|
375
|
-
const resolvedCwd = path.resolve(cwd);
|
|
376
|
-
return resolvedCwd.startsWith(worktreesDir + path.sep);
|
|
377
|
-
}
|
|
378
|
-
/**
|
|
379
|
-
* Get list of active worktrees.
|
|
380
|
-
*
|
|
381
|
-
* @param projectDir - Project directory
|
|
382
|
-
* @returns Array of worktree names
|
|
383
|
-
*/
|
|
384
|
-
export function getActiveWorktrees(projectDir) {
|
|
385
|
-
const worktreesDir = path.join(projectDir, 'worktrees');
|
|
386
|
-
if (!fs.existsSync(worktreesDir)) {
|
|
387
|
-
return [];
|
|
388
|
-
}
|
|
389
|
-
try {
|
|
390
|
-
return fs.readdirSync(worktreesDir).filter((e) => {
|
|
391
|
-
const stat = fs.statSync(path.join(worktreesDir, e));
|
|
392
|
-
return stat.isDirectory();
|
|
393
|
-
});
|
|
394
|
-
}
|
|
395
|
-
catch {
|
|
396
|
-
return [];
|
|
397
|
-
}
|
|
398
|
-
}
|
|
399
|
-
//# sourceMappingURL=enforcement-checks.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enforcement-checks.js","sourceRoot":"","sources":["../../src/hooks/enforcement-checks.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,139 +0,0 @@
|
|
|
1
|
-
// Copyright (c) 2026 Hellmai Ltd
|
|
2
|
-
// SPDX-License-Identifier: AGPL-3.0-only
|
|
3
|
-
/**
|
|
4
|
-
* @file enforcement-generator.ts
|
|
5
|
-
* Generates Claude Code enforcement hooks based on configuration (WU-1367)
|
|
6
|
-
*
|
|
7
|
-
* This module is the dispatcher/orchestrator entrypoint for hook generation.
|
|
8
|
-
* Individual hook script builders live under ./generators/ (WU-1645).
|
|
9
|
-
*
|
|
10
|
-
* All public exports are preserved for backward compatibility.
|
|
11
|
-
*/
|
|
12
|
-
import { CLAUDE_HOOKS, getHookCommand } from '@lumenflow/core';
|
|
13
|
-
// Re-export for backwards compatibility (WU-1394)
|
|
14
|
-
export const HOOK_SCRIPTS = CLAUDE_HOOKS.SCRIPTS;
|
|
15
|
-
/**
|
|
16
|
-
* Generate enforcement hooks based on configuration.
|
|
17
|
-
*
|
|
18
|
-
* @param config - Enforcement configuration
|
|
19
|
-
* @returns Generated hooks structure for settings.json
|
|
20
|
-
*/
|
|
21
|
-
export function generateEnforcementHooks(config) {
|
|
22
|
-
const hooks = {};
|
|
23
|
-
const preToolUseHooks = [];
|
|
24
|
-
// Generate PreToolUse hooks for Write/Edit operations
|
|
25
|
-
if (config.block_outside_worktree || config.require_wu_for_edits) {
|
|
26
|
-
const writeEditHooks = [];
|
|
27
|
-
if (config.block_outside_worktree) {
|
|
28
|
-
writeEditHooks.push({
|
|
29
|
-
type: 'command',
|
|
30
|
-
command: getHookCommand(HOOK_SCRIPTS.ENFORCE_WORKTREE),
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
if (config.require_wu_for_edits) {
|
|
34
|
-
writeEditHooks.push({
|
|
35
|
-
type: 'command',
|
|
36
|
-
command: getHookCommand(HOOK_SCRIPTS.REQUIRE_WU),
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
if (writeEditHooks.length > 0) {
|
|
40
|
-
preToolUseHooks.push({
|
|
41
|
-
matcher: CLAUDE_HOOKS.MATCHERS.WRITE_EDIT,
|
|
42
|
-
hooks: writeEditHooks,
|
|
43
|
-
});
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
if (preToolUseHooks.length > 0) {
|
|
47
|
-
hooks.preToolUse = preToolUseHooks;
|
|
48
|
-
}
|
|
49
|
-
// Generate Stop hook for session completion warning
|
|
50
|
-
if (config.warn_on_stop_without_wu_done) {
|
|
51
|
-
hooks.stop = [
|
|
52
|
-
{
|
|
53
|
-
matcher: CLAUDE_HOOKS.MATCHERS.ALL,
|
|
54
|
-
hooks: [
|
|
55
|
-
{
|
|
56
|
-
type: 'command',
|
|
57
|
-
command: getHookCommand(HOOK_SCRIPTS.WARN_INCOMPLETE),
|
|
58
|
-
},
|
|
59
|
-
],
|
|
60
|
-
},
|
|
61
|
-
];
|
|
62
|
-
}
|
|
63
|
-
// WU-1471: Generate PostToolUse and SubagentStop hooks for auto-checkpoint
|
|
64
|
-
const postToolUseHooks = [];
|
|
65
|
-
if (config.auto_checkpoint?.enabled) {
|
|
66
|
-
const autoCheckpointHook = {
|
|
67
|
-
type: 'command',
|
|
68
|
-
command: getHookCommand(HOOK_SCRIPTS.AUTO_CHECKPOINT),
|
|
69
|
-
};
|
|
70
|
-
// PostToolUse: fires after every tool call, counter tracks interval
|
|
71
|
-
postToolUseHooks.push({
|
|
72
|
-
matcher: CLAUDE_HOOKS.MATCHERS.ALL,
|
|
73
|
-
hooks: [autoCheckpointHook],
|
|
74
|
-
});
|
|
75
|
-
// SubagentStop: fires when a sub-agent finishes, always checkpoint
|
|
76
|
-
hooks.subagentStop = [
|
|
77
|
-
{
|
|
78
|
-
matcher: CLAUDE_HOOKS.MATCHERS.SUBAGENT_STOP,
|
|
79
|
-
hooks: [autoCheckpointHook],
|
|
80
|
-
},
|
|
81
|
-
];
|
|
82
|
-
}
|
|
83
|
-
if (postToolUseHooks.length > 0) {
|
|
84
|
-
hooks.postToolUse = postToolUseHooks;
|
|
85
|
-
}
|
|
86
|
-
// Always generate PreCompact and SessionStart recovery hooks (WU-1394)
|
|
87
|
-
// These enable durable context recovery after compaction
|
|
88
|
-
hooks.preCompact = [
|
|
89
|
-
{
|
|
90
|
-
matcher: CLAUDE_HOOKS.MATCHERS.ALL,
|
|
91
|
-
hooks: [
|
|
92
|
-
{
|
|
93
|
-
type: 'command',
|
|
94
|
-
command: getHookCommand(HOOK_SCRIPTS.PRE_COMPACT_CHECKPOINT),
|
|
95
|
-
},
|
|
96
|
-
],
|
|
97
|
-
},
|
|
98
|
-
];
|
|
99
|
-
hooks.sessionStart = [
|
|
100
|
-
{
|
|
101
|
-
matcher: CLAUDE_HOOKS.MATCHERS.COMPACT,
|
|
102
|
-
hooks: [
|
|
103
|
-
{
|
|
104
|
-
type: 'command',
|
|
105
|
-
command: getHookCommand(HOOK_SCRIPTS.SESSION_START_RECOVERY),
|
|
106
|
-
},
|
|
107
|
-
],
|
|
108
|
-
},
|
|
109
|
-
{
|
|
110
|
-
matcher: CLAUDE_HOOKS.MATCHERS.RESUME,
|
|
111
|
-
hooks: [
|
|
112
|
-
{
|
|
113
|
-
type: 'command',
|
|
114
|
-
command: getHookCommand(HOOK_SCRIPTS.SESSION_START_RECOVERY),
|
|
115
|
-
},
|
|
116
|
-
],
|
|
117
|
-
},
|
|
118
|
-
{
|
|
119
|
-
matcher: CLAUDE_HOOKS.MATCHERS.CLEAR,
|
|
120
|
-
hooks: [
|
|
121
|
-
{
|
|
122
|
-
type: 'command',
|
|
123
|
-
command: getHookCommand(HOOK_SCRIPTS.SESSION_START_RECOVERY),
|
|
124
|
-
},
|
|
125
|
-
],
|
|
126
|
-
},
|
|
127
|
-
];
|
|
128
|
-
return hooks;
|
|
129
|
-
}
|
|
130
|
-
// ── Re-exports from per-hook generator modules (WU-1645) ──
|
|
131
|
-
// These preserve the public contract so all existing import paths continue to work.
|
|
132
|
-
export { generateEnforceWorktreeScript } from './generators/enforce-worktree.js';
|
|
133
|
-
export { generateRequireWuScript } from './generators/require-wu.js';
|
|
134
|
-
export { generateWarnIncompleteScript } from './generators/warn-incomplete.js';
|
|
135
|
-
export { generatePreCompactCheckpointScript } from './generators/pre-compact-checkpoint.js';
|
|
136
|
-
export { generateSessionStartRecoveryScript } from './generators/session-start-recovery.js';
|
|
137
|
-
export { generateAutoCheckpointScript } from './generators/auto-checkpoint.js';
|
|
138
|
-
export { surfaceUnreadSignals, markCompletedWUSignalsAsRead, } from './generators/signal-utils.js';
|
|
139
|
-
//# sourceMappingURL=enforcement-generator.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"enforcement-generator.js","sourceRoot":"","sources":["../../src/hooks/enforcement-generator.ts"],"names":[],"mappings":"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"}
|