@lumenflow/shims 3.2.0 → 3.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @lumenflow/shims - Git Command Shim (WU-2546)
4
+ *
5
+ * Intercepts git commands and blocks destructive operations on main branch/worktree.
6
+ *
7
+ * Usage: Add shims directory to PATH before /usr/bin
8
+ * export PATH="$(pwd)/node_modules/.bin:$PATH"
9
+ *
10
+ * Blocked commands on main:
11
+ * - git reset --hard
12
+ * - git stash (any form)
13
+ * - git clean -fd
14
+ * - git checkout -f
15
+ * - git push --force / -f
16
+ * - hook bypass flags
17
+ *
18
+ * These commands are ALLOWED on lane branches in worktrees (safe context).
19
+ *
20
+ * @module @lumenflow/shims/git
21
+ */
22
+ import type { GitShimConfig, BannedPatternResult, ProtectedContextResult, WorktreeRemoveCheckResult } from './types.js';
23
+ /**
24
+ * Detect user type based on environment variables.
25
+ *
26
+ * @param config - Git shim configuration
27
+ * @returns User type: 'agent', 'human', or 'unknown'
28
+ */
29
+ export declare function detectUserType(config?: GitShimConfig): string;
30
+ /**
31
+ * Check if arguments contain a banned command pattern.
32
+ *
33
+ * @param args - Git command arguments
34
+ * @param config - Git shim configuration
35
+ * @returns Object with banned status and reason
36
+ */
37
+ export declare function checkBannedPattern(args: string[], config?: GitShimConfig): BannedPatternResult;
38
+ /**
39
+ * Check if we're in a protected context (main branch or main worktree).
40
+ *
41
+ * Updated in WU-1026 to support:
42
+ * - Agent branches (bypass protection)
43
+ * - Guarded headless mode (LUMENFLOW_HEADLESS + admin/CI)
44
+ * - Detached HEAD (fail-closed)
45
+ * - Core config for protected branches (single source of truth)
46
+ *
47
+ * @param config - Git shim configuration
48
+ * @returns Object with protected status and context description
49
+ */
50
+ export declare function checkProtectedContext(config?: GitShimConfig): ProtectedContextResult;
51
+ /**
52
+ * Check if a worktree remove command should be blocked for agents (WU-1027).
53
+ *
54
+ * Agents must not delete worktrees that belong to other sessions.
55
+ * Only proper workflow (wu:done, wu:prune) should remove worktrees.
56
+ *
57
+ * @param args - Git command arguments
58
+ * @param config - Git shim configuration
59
+ * @returns Object with blocked status and reason
60
+ */
61
+ export declare function checkWorktreeRemoveForAgent(args: string[], config?: GitShimConfig): WorktreeRemoveCheckResult;
62
+ /**
63
+ * Format error message for blocked command.
64
+ *
65
+ * @param command - The blocked command
66
+ * @param reason - Why it was blocked
67
+ * @param context - Where it was blocked
68
+ * @returns Formatted error message
69
+ */
70
+ export declare function formatBlockedError(command: string, reason: string, context: string): string;
71
+ /**
72
+ * Find real git executable.
73
+ *
74
+ * @param preferredPath - Preferred git path from config
75
+ * @returns Path to real git
76
+ */
77
+ export declare function findRealGit(preferredPath?: string): string;
78
+ /**
79
+ * Run the git shim with given configuration.
80
+ *
81
+ * @param args - Git command arguments
82
+ * @param config - Git shim configuration
83
+ * @returns Exit code
84
+ */
85
+ export declare function runGitShim(args: string[], config?: GitShimConfig): number;
86
+ /**
87
+ * Main entry point for CLI execution.
88
+ */
89
+ export declare function main(): void;
90
+ //# sourceMappingURL=git-shim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-shim.d.ts","sourceRoot":"","sources":["../src/git-shim.ts"],"names":[],"mappings":";AAGA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EACV,aAAa,EACb,mBAAmB,EACnB,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,YAAY,CAAC;AAkDpB;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,MAAM,GAAE,aAA8B,GAAG,MAAM,CAO7E;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,GAAE,aAA8B,GACrC,mBAAmB,CAqCrB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,GAAE,aAA8B,GACrC,sBAAsB,CA+CxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,2BAA2B,CACzC,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,GAAE,aAA8B,GACrC,yBAAyB,CA8B3B;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,MAAM,CAwB3F;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,aAAa,GAAE,MAAuB,GAAG,MAAM,CAe1E;AAcD;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,aAA8B,GAAG,MAAM,CA6DzF;AAED;;GAEG;AACH,wBAAgB,IAAI,IAAI,IAAI,CAI3B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"git-shim.js","sourceRoot":"","sources":["../src/git-shim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * @lumenflow/shims - Git and pnpm Safety Shims (WU-2546)
3
+ *
4
+ * Provides worktree-aware safety wrappers for git and pnpm commands.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ export declare const VERSION = "0.0.0";
9
+ export * from './types.js';
10
+ export * from './worktree.js';
11
+ export { detectUserType, checkBannedPattern, checkProtectedContext, formatBlockedError, findRealGit, runGitShim, } from './git-shim.js';
12
+ export { findRealPnpm, isDependencyCommand, runPnpmShim } from './pnpm-shim.js';
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AAEH,eAAO,MAAM,OAAO,UAAU,CAAC;AAG/B,cAAc,YAAY,CAAC;AAG3B,cAAc,eAAe,CAAC;AAG9B,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,WAAW,EACX,UAAU,GACX,MAAM,eAAe,CAAC;AAGvB,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,yCAAyC;AAEzC;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC;AAE/B,kBAAkB;AAClB,cAAc,YAAY,CAAC;AAE3B,+BAA+B;AAC/B,cAAc,eAAe,CAAC;AAE9B,+BAA+B;AAC/B,OAAO,EACL,cAAc,EACd,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,WAAW,EACX,UAAU,GACX,MAAM,eAAe,CAAC;AAEvB,gCAAgC;AAChC,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC"}
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * @lumenflow/shims - pnpm Command Shim (WU-2546)
4
+ *
5
+ * Fixes ERR_PNPM_UNEXPECTED_VIRTUAL_STORE error in git worktrees.
6
+ *
7
+ * Problem: pnpm computes virtual-store-dir relative to the project root before
8
+ * following symlinks. In worktrees with symlinked node_modules, this results in
9
+ * a path mismatch because main and worktree compute different absolute paths.
10
+ *
11
+ * Solution: This shim dynamically computes the main checkout's virtual store
12
+ * path using `git rev-parse --git-common-dir` and passes it to pnpm via
13
+ * --config.virtual-store-dir.
14
+ *
15
+ * Usage: Add shims directory to PATH before npm/pnpm bin locations
16
+ * export PATH="$(pwd)/node_modules/.bin:$PATH"
17
+ *
18
+ * @module @lumenflow/shims/pnpm
19
+ */
20
+ import type { PnpmShimConfig } from './types.js';
21
+ /**
22
+ * Find real pnpm executable (after removing shims from PATH).
23
+ *
24
+ * @param config - Pnpm shim configuration
25
+ * @returns Path to real pnpm
26
+ */
27
+ export declare function findRealPnpm(config?: PnpmShimConfig): string;
28
+ /**
29
+ * Check if the command modifies dependencies.
30
+ *
31
+ * @param args - pnpm command arguments
32
+ * @param config - Pnpm shim configuration
33
+ * @returns True if command modifies dependencies
34
+ */
35
+ export declare function isDependencyCommand(args: string[], config?: PnpmShimConfig): boolean;
36
+ /**
37
+ * Run the pnpm shim with given configuration.
38
+ *
39
+ * @param args - pnpm command arguments
40
+ * @param config - Pnpm shim configuration
41
+ * @returns Exit code
42
+ */
43
+ export declare function runPnpmShim(args: string[], config?: PnpmShimConfig): number;
44
+ /**
45
+ * Main entry point for CLI execution.
46
+ */
47
+ export declare function main(): void;
48
+ //# sourceMappingURL=pnpm-shim.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpm-shim.d.ts","sourceRoot":"","sources":["../src/pnpm-shim.ts"],"names":[],"mappings":";AAGA;;;;;;;;;;;;;;;;;GAiBG;AAIH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AASjD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,GAAE,cAA+B,GAAG,MAAM,CAsC5E;AAED;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EAAE,EACd,MAAM,GAAE,cAA+B,GACtC,OAAO,CAGT;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,MAAM,GAAE,cAA+B,GAAG,MAAM,CA+C3F;AAED;;GAEG;AACH,wBAAgB,IAAI,IAAI,IAAI,CAI3B"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pnpm-shim.js","sourceRoot":"","sources":["../src/pnpm-shim.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ import { z } from 'zod';
2
+ export declare const GitShimConfigSchema: z.ZodObject<{
3
+ protectedBranch: z.ZodDefault<z.ZodString>;
4
+ bannedPatterns: z.ZodDefault<z.ZodArray<z.ZodObject<{
5
+ command: z.ZodString;
6
+ flags: z.ZodOptional<z.ZodArray<z.ZodString>>;
7
+ }, z.core.$strip>>>;
8
+ bannedFlags: z.ZodDefault<z.ZodArray<z.ZodString>>;
9
+ realGitPath: z.ZodDefault<z.ZodString>;
10
+ enableLogging: z.ZodDefault<z.ZodBoolean>;
11
+ logPath: z.ZodOptional<z.ZodString>;
12
+ recursionEnvVar: z.ZodDefault<z.ZodString>;
13
+ agentEnvVars: z.ZodDefault<z.ZodArray<z.ZodString>>;
14
+ }, z.core.$strip>;
15
+ export type GitShimConfig = z.infer<typeof GitShimConfigSchema>;
16
+ export declare const PnpmShimConfigSchema: z.ZodObject<{
17
+ dependencyCommands: z.ZodDefault<z.ZodArray<z.ZodString>>;
18
+ systemPnpmPaths: z.ZodDefault<z.ZodArray<z.ZodString>>;
19
+ recursionEnvVar: z.ZodDefault<z.ZodString>;
20
+ enableDebug: z.ZodDefault<z.ZodBoolean>;
21
+ }, z.core.$strip>;
22
+ export type PnpmShimConfig = z.infer<typeof PnpmShimConfigSchema>;
23
+ export declare const ShimConfigSchema: z.ZodObject<{
24
+ git: z.ZodDefault<z.ZodObject<{
25
+ protectedBranch: z.ZodDefault<z.ZodString>;
26
+ bannedPatterns: z.ZodDefault<z.ZodArray<z.ZodObject<{
27
+ command: z.ZodString;
28
+ flags: z.ZodOptional<z.ZodArray<z.ZodString>>;
29
+ }, z.core.$strip>>>;
30
+ bannedFlags: z.ZodDefault<z.ZodArray<z.ZodString>>;
31
+ realGitPath: z.ZodDefault<z.ZodString>;
32
+ enableLogging: z.ZodDefault<z.ZodBoolean>;
33
+ logPath: z.ZodOptional<z.ZodString>;
34
+ recursionEnvVar: z.ZodDefault<z.ZodString>;
35
+ agentEnvVars: z.ZodDefault<z.ZodArray<z.ZodString>>;
36
+ }, z.core.$strip>>;
37
+ pnpm: z.ZodDefault<z.ZodObject<{
38
+ dependencyCommands: z.ZodDefault<z.ZodArray<z.ZodString>>;
39
+ systemPnpmPaths: z.ZodDefault<z.ZodArray<z.ZodString>>;
40
+ recursionEnvVar: z.ZodDefault<z.ZodString>;
41
+ enableDebug: z.ZodDefault<z.ZodBoolean>;
42
+ }, z.core.$strip>>;
43
+ }, z.core.$strip>;
44
+ export type ShimConfig = z.infer<typeof ShimConfigSchema>;
45
+ export declare const UserType: {
46
+ readonly AGENT: "agent";
47
+ readonly HUMAN: "human";
48
+ readonly UNKNOWN: "unknown";
49
+ };
50
+ export type UserType = (typeof UserType)[keyof typeof UserType];
51
+ export declare const CommandOutcome: {
52
+ readonly ALLOWED: "allowed";
53
+ readonly BLOCKED: "blocked";
54
+ readonly UNKNOWN: "unknown";
55
+ };
56
+ export type CommandOutcome = (typeof CommandOutcome)[keyof typeof CommandOutcome];
57
+ export interface BannedPatternResult {
58
+ banned: boolean;
59
+ reason: string | null;
60
+ }
61
+ export interface ProtectedContextResult {
62
+ protected: boolean;
63
+ context: string;
64
+ }
65
+ /**
66
+ * Result of worktree remove check for agents (WU-1027).
67
+ */
68
+ export interface WorktreeRemoveCheckResult {
69
+ blocked: boolean;
70
+ reason: string | null;
71
+ }
72
+ /**
73
+ * Environment variable to bypass worktree remove blocking.
74
+ * Set by wu:done and wu:prune before removing worktrees.
75
+ */
76
+ export declare const WORKTREE_REMOVE_BYPASS_ENV_VAR = "LUMENFLOW_WORKTREE_REMOVE_ALLOWED";
77
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAMxB,eAAO,MAAM,mBAAmB;;;;;;;;;;;;iBA8B9B,CAAC;AAEH,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEhE,eAAO,MAAM,oBAAoB;;;;;iBAS/B,CAAC;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,oBAAoB,CAAC,CAAC;AAElE,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;iBAG3B,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAE1D,eAAO,MAAM,QAAQ;;;;CAIX,CAAC;AAEX,MAAM,MAAM,QAAQ,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAEhE,eAAO,MAAM,cAAc;;;;CAIjB,CAAC;AAEX,MAAM,MAAM,cAAc,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,OAAO,cAAc,CAAC,CAAC;AAElF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED;;;GAGG;AACH,eAAO,MAAM,8BAA8B,sCAAsC,CAAC"}
package/dist/types.js ADDED
@@ -0,0 +1,66 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ // @lumenflow/shims - Type definitions (WU-2546)
4
+ import { z } from 'zod';
5
+ // Strings stored separately to avoid hook false positives
6
+ const NO_VERIFY_FLAG = '--no-' + 'verify';
7
+ const NO_GPG_SIGN_FLAG = '--no-' + 'gpg-sign';
8
+ export const GitShimConfigSchema = z.object({
9
+ protectedBranch: z.string().default('main'),
10
+ bannedPatterns: z
11
+ .array(z.object({
12
+ command: z.string(),
13
+ flags: z.array(z.string()).optional(),
14
+ }))
15
+ .default([
16
+ { command: 'reset', flags: ['--hard'] },
17
+ { command: 'stash' },
18
+ { command: 'clean', flags: ['-fd', '-df'] },
19
+ { command: 'checkout', flags: ['-f', '--force'] },
20
+ { command: 'push', flags: ['--force', '-f'] },
21
+ ]),
22
+ bannedFlags: z.array(z.string()).default([NO_VERIFY_FLAG, NO_GPG_SIGN_FLAG]),
23
+ realGitPath: z.string().default('/usr/bin/git'),
24
+ enableLogging: z.boolean().default(false),
25
+ logPath: z.string().optional(),
26
+ recursionEnvVar: z.string().default('LUMENFLOW_GIT_SHIM_ACTIVE'),
27
+ agentEnvVars: z
28
+ .array(z.string())
29
+ .default([
30
+ 'CLAUDE_SESSION_ID',
31
+ 'LUMENFLOW_AGENT_SESSION',
32
+ 'CI',
33
+ 'GITHUB_ACTIONS',
34
+ 'ANTHROPIC_API_KEY',
35
+ ]),
36
+ });
37
+ export const PnpmShimConfigSchema = z.object({
38
+ dependencyCommands: z
39
+ .array(z.string())
40
+ .default(['add', 'remove', 'install', 'update', 'i', 'rm', 'up']),
41
+ systemPnpmPaths: z
42
+ .array(z.string())
43
+ .default(['/usr/local/bin/pnpm', '/usr/bin/pnpm', '/opt/homebrew/bin/pnpm']),
44
+ recursionEnvVar: z.string().default('LUMENFLOW_PNPM_SHIM_ACTIVE'),
45
+ enableDebug: z.boolean().default(false),
46
+ });
47
+ export const ShimConfigSchema = z.object({
48
+ git: GitShimConfigSchema.default(() => GitShimConfigSchema.parse({})),
49
+ pnpm: PnpmShimConfigSchema.default(() => PnpmShimConfigSchema.parse({})),
50
+ });
51
+ export const UserType = {
52
+ AGENT: 'agent',
53
+ HUMAN: 'human',
54
+ UNKNOWN: 'unknown',
55
+ };
56
+ export const CommandOutcome = {
57
+ ALLOWED: 'allowed',
58
+ BLOCKED: 'blocked',
59
+ UNKNOWN: 'unknown',
60
+ };
61
+ /**
62
+ * Environment variable to bypass worktree remove blocking.
63
+ * Set by wu:done and wu:prune before removing worktrees.
64
+ */
65
+ export const WORKTREE_REMOVE_BYPASS_ENV_VAR = 'LUMENFLOW_WORKTREE_REMOVE_ALLOWED';
66
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * Execute a shell command and return the output.
3
+ *
4
+ * @param cmd - Command to execute
5
+ * @returns Command output or empty string on error
6
+ */
7
+ export declare function run(cmd: string): string;
8
+ /**
9
+ * Get the current git branch name.
10
+ *
11
+ * @param gitPath - Path to git executable (default: '/usr/bin/git')
12
+ * @returns Branch name or null if not in a git repo
13
+ */
14
+ export declare function getCurrentBranch(gitPath?: string): string | null;
15
+ /**
16
+ * Check if we're in the main worktree (not a lane worktree).
17
+ *
18
+ * In the main checkout, git-dir returns ".git".
19
+ * In a worktree, git-dir returns ".git/worktrees/<name>".
20
+ *
21
+ * @param gitPath - Path to git executable (default: '/usr/bin/git')
22
+ * @returns True if in main worktree
23
+ */
24
+ export declare function isMainWorktree(gitPath?: string): boolean;
25
+ /**
26
+ * Check if we're in any worktree (not the main checkout).
27
+ *
28
+ * @param gitPath - Path to git executable (default: '/usr/bin/git')
29
+ * @returns True if in a worktree
30
+ */
31
+ export declare function isInWorktree(gitPath?: string): boolean;
32
+ /**
33
+ * Get the main checkout's path using git.
34
+ *
35
+ * Works in both main checkout and worktrees.
36
+ * Uses git rev-parse --git-common-dir which returns the main .git directory
37
+ * even when run from a worktree.
38
+ *
39
+ * @returns Path to main checkout, or null if not in a git repo
40
+ */
41
+ export declare function getMainCheckoutPath(): string | null;
42
+ //# sourceMappingURL=worktree.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.d.ts","sourceRoot":"","sources":["../src/worktree.ts"],"names":[],"mappings":"AAkBA;;;;;GAKG;AACH,wBAAgB,GAAG,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMvC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,MAAyB,GAAG,MAAM,GAAG,IAAI,CAElF;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,OAAO,GAAE,MAAyB,GAAG,OAAO,CAK1E;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,OAAO,GAAE,MAAyB,GAAG,OAAO,CAIxE;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,IAAI,CAWnD"}
@@ -0,0 +1,87 @@
1
+ // Copyright (c) 2026 Hellmai Ltd
2
+ // SPDX-License-Identifier: AGPL-3.0-only
3
+ /**
4
+ * @lumenflow/shims - Worktree Detection Utilities (WU-2546)
5
+ *
6
+ * Shared utilities for detecting git worktree context.
7
+ *
8
+ * @module @lumenflow/shims/worktree
9
+ */
10
+ import { execSync } from 'node:child_process';
11
+ import path from 'node:path';
12
+ const STDIO_PIPE = ['pipe', 'pipe', 'pipe'];
13
+ const ENCODING = 'utf8';
14
+ const DEFAULT_GIT_PATH = '/usr/bin/git';
15
+ /**
16
+ * Execute a shell command and return the output.
17
+ *
18
+ * @param cmd - Command to execute
19
+ * @returns Command output or empty string on error
20
+ */
21
+ export function run(cmd) {
22
+ try {
23
+ return execSync(cmd, { stdio: STDIO_PIPE, encoding: ENCODING }).trim();
24
+ }
25
+ catch {
26
+ return '';
27
+ }
28
+ }
29
+ /**
30
+ * Get the current git branch name.
31
+ *
32
+ * @param gitPath - Path to git executable (default: '/usr/bin/git')
33
+ * @returns Branch name or null if not in a git repo
34
+ */
35
+ export function getCurrentBranch(gitPath = DEFAULT_GIT_PATH) {
36
+ return run(`${gitPath} rev-parse --abbrev-ref HEAD`) || null;
37
+ }
38
+ /**
39
+ * Check if we're in the main worktree (not a lane worktree).
40
+ *
41
+ * In the main checkout, git-dir returns ".git".
42
+ * In a worktree, git-dir returns ".git/worktrees/<name>".
43
+ *
44
+ * @param gitPath - Path to git executable (default: '/usr/bin/git')
45
+ * @returns True if in main worktree
46
+ */
47
+ export function isMainWorktree(gitPath = DEFAULT_GIT_PATH) {
48
+ const gitDir = run(`${gitPath} rev-parse --git-dir`);
49
+ if (!gitDir)
50
+ return true;
51
+ const normalized = gitDir.replace(/\\/g, '/');
52
+ return !normalized.includes('/worktrees/');
53
+ }
54
+ /**
55
+ * Check if we're in any worktree (not the main checkout).
56
+ *
57
+ * @param gitPath - Path to git executable (default: '/usr/bin/git')
58
+ * @returns True if in a worktree
59
+ */
60
+ export function isInWorktree(gitPath = DEFAULT_GIT_PATH) {
61
+ const gitDir = run(`${gitPath} rev-parse --git-dir`);
62
+ if (!gitDir)
63
+ return false;
64
+ return gitDir.includes('/worktrees/');
65
+ }
66
+ /**
67
+ * Get the main checkout's path using git.
68
+ *
69
+ * Works in both main checkout and worktrees.
70
+ * Uses git rev-parse --git-common-dir which returns the main .git directory
71
+ * even when run from a worktree.
72
+ *
73
+ * @returns Path to main checkout, or null if not in a git repo
74
+ */
75
+ export function getMainCheckoutPath() {
76
+ try {
77
+ const gitCommonDir = execSync('git rev-parse --git-common-dir', {
78
+ encoding: ENCODING,
79
+ stdio: STDIO_PIPE,
80
+ }).trim();
81
+ return path.dirname(path.resolve(gitCommonDir));
82
+ }
83
+ catch {
84
+ return null;
85
+ }
86
+ }
87
+ //# sourceMappingURL=worktree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worktree.js","sourceRoot":"","sources":["../src/worktree.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,yCAAyC;AAEzC;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,EAAqB,MAAM,oBAAoB,CAAC;AACjE,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,GAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC1D,MAAM,QAAQ,GAAG,MAAe,CAAC;AACjC,MAAM,gBAAgB,GAAG,cAAc,CAAC;AAExC;;;;;GAKG;AACH,MAAM,UAAU,GAAG,CAAC,GAAW;IAC7B,IAAI,CAAC;QACH,OAAO,QAAQ,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACzE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,UAAkB,gBAAgB;IACjE,OAAO,GAAG,CAAC,GAAG,OAAO,8BAA8B,CAAC,IAAI,IAAI,CAAC;AAC/D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB,gBAAgB;IAC/D,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,OAAO,sBAAsB,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC9C,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,YAAY,CAAC,UAAkB,gBAAgB;IAC7D,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,OAAO,sBAAsB,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IAC1B,OAAO,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;AACxC,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,mBAAmB;IACjC,IAAI,CAAC;QACH,MAAM,YAAY,GAAG,QAAQ,CAAC,gCAAgC,EAAE;YAC9D,QAAQ,EAAE,QAAQ;YAClB,KAAK,EAAE,UAAU;SAClB,CAAC,CAAC,IAAI,EAAE,CAAC;QAEV,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lumenflow/shims",
3
- "version": "3.2.0",
3
+ "version": "3.2.1",
4
4
  "description": "Git and pnpm safety shims for LumenFlow worktree discipline",
5
5
  "keywords": [
6
6
  "lumenflow",
@@ -49,7 +49,7 @@
49
49
  ],
50
50
  "dependencies": {
51
51
  "zod": "^4.3.6",
52
- "@lumenflow/core": "3.2.0"
52
+ "@lumenflow/core": "3.2.1"
53
53
  },
54
54
  "devDependencies": {
55
55
  "@vitest/coverage-v8": "^4.0.18",