specweave 1.0.464 → 1.0.466

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.
Files changed (109) hide show
  1. package/dist/plugins/specweave/lib/vendor/core/ac-test-validator-cli.d.ts +16 -0
  2. package/dist/plugins/specweave/lib/vendor/core/ac-test-validator-cli.js +139 -0
  3. package/dist/plugins/specweave/lib/vendor/core/ac-test-validator-cli.js.map +1 -0
  4. package/dist/plugins/specweave/lib/vendor/core/ac-test-validator.d.ts +111 -0
  5. package/dist/plugins/specweave/lib/vendor/core/ac-test-validator.js +304 -0
  6. package/dist/plugins/specweave/lib/vendor/core/ac-test-validator.js.map +1 -0
  7. package/dist/plugins/specweave/lib/vendor/core/increment/ac-status-manager.d.ts +115 -0
  8. package/dist/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js +359 -0
  9. package/dist/plugins/specweave/lib/vendor/core/increment/ac-status-manager.js.map +1 -0
  10. package/dist/plugins/specweave/lib/vendor/core/increment/active-increment-manager.d.ts +121 -0
  11. package/dist/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js +273 -0
  12. package/dist/plugins/specweave/lib/vendor/core/increment/active-increment-manager.js.map +1 -0
  13. package/dist/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.d.ts +72 -0
  14. package/dist/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js +237 -0
  15. package/dist/plugins/specweave/lib/vendor/core/increment/auto-transition-manager.js.map +1 -0
  16. package/dist/plugins/specweave/lib/vendor/core/increment/duplicate-detector.d.ts +52 -0
  17. package/dist/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js +281 -0
  18. package/dist/plugins/specweave/lib/vendor/core/increment/duplicate-detector.js.map +1 -0
  19. package/dist/plugins/specweave/lib/vendor/core/increment/metadata-manager.d.ts +278 -0
  20. package/dist/plugins/specweave/lib/vendor/core/increment/metadata-manager.js +925 -0
  21. package/dist/plugins/specweave/lib/vendor/core/increment/metadata-manager.js.map +1 -0
  22. package/dist/plugins/specweave/lib/vendor/core/increment/status-auto-transition.d.ts +113 -0
  23. package/dist/plugins/specweave/lib/vendor/core/increment/status-auto-transition.js +317 -0
  24. package/dist/plugins/specweave/lib/vendor/core/increment/status-auto-transition.js.map +1 -0
  25. package/dist/plugins/specweave/lib/vendor/core/types/increment-metadata.d.ts +442 -0
  26. package/dist/plugins/specweave/lib/vendor/core/types/increment-metadata.js +246 -0
  27. package/dist/plugins/specweave/lib/vendor/core/types/increment-metadata.js.map +1 -0
  28. package/dist/plugins/specweave/lib/vendor/core/universal-auto-create.d.ts +64 -0
  29. package/dist/plugins/specweave/lib/vendor/core/universal-auto-create.js +228 -0
  30. package/dist/plugins/specweave/lib/vendor/core/universal-auto-create.js.map +1 -0
  31. package/dist/plugins/specweave/lib/vendor/generators/spec/task-parser.d.ts +95 -0
  32. package/dist/plugins/specweave/lib/vendor/generators/spec/task-parser.js +300 -0
  33. package/dist/plugins/specweave/lib/vendor/generators/spec/task-parser.js.map +1 -0
  34. package/dist/plugins/specweave/lib/vendor/sync/config.d.ts +73 -0
  35. package/dist/plugins/specweave/lib/vendor/sync/config.js +132 -0
  36. package/dist/plugins/specweave/lib/vendor/sync/config.js.map +1 -0
  37. package/dist/plugins/specweave/lib/vendor/sync/github-reconciler.d.ts +163 -0
  38. package/dist/plugins/specweave/lib/vendor/sync/github-reconciler.js +898 -0
  39. package/dist/plugins/specweave/lib/vendor/sync/github-reconciler.js.map +1 -0
  40. package/dist/plugins/specweave/lib/vendor/sync/provider-router.d.ts +86 -0
  41. package/dist/plugins/specweave/lib/vendor/sync/provider-router.js +147 -0
  42. package/dist/plugins/specweave/lib/vendor/sync/provider-router.js.map +1 -0
  43. package/dist/plugins/specweave/lib/vendor/sync/status-mapper.d.ts +120 -0
  44. package/dist/plugins/specweave/lib/vendor/sync/status-mapper.js +164 -0
  45. package/dist/plugins/specweave/lib/vendor/sync/status-mapper.js.map +1 -0
  46. package/dist/plugins/specweave/lib/vendor/utils/auth-helpers.d.ts +151 -0
  47. package/dist/plugins/specweave/lib/vendor/utils/auth-helpers.js +359 -0
  48. package/dist/plugins/specweave/lib/vendor/utils/auth-helpers.js.map +1 -0
  49. package/dist/plugins/specweave/lib/vendor/utils/chalk-fallback.d.ts +38 -0
  50. package/dist/plugins/specweave/lib/vendor/utils/chalk-fallback.js +118 -0
  51. package/dist/plugins/specweave/lib/vendor/utils/chalk-fallback.js.map +1 -0
  52. package/dist/plugins/specweave/lib/vendor/utils/clean-env.d.ts +47 -0
  53. package/dist/plugins/specweave/lib/vendor/utils/clean-env.js +63 -0
  54. package/dist/plugins/specweave/lib/vendor/utils/clean-env.js.map +1 -0
  55. package/dist/plugins/specweave/lib/vendor/utils/credential-masker.d.ts +118 -0
  56. package/dist/plugins/specweave/lib/vendor/utils/credential-masker.js +275 -0
  57. package/dist/plugins/specweave/lib/vendor/utils/credential-masker.js.map +1 -0
  58. package/dist/plugins/specweave/lib/vendor/utils/execFileNoThrow.d.ts +99 -0
  59. package/dist/plugins/specweave/lib/vendor/utils/execFileNoThrow.js +149 -0
  60. package/dist/plugins/specweave/lib/vendor/utils/execFileNoThrow.js.map +1 -0
  61. package/dist/plugins/specweave/lib/vendor/utils/feature-id-derivation.d.ts +63 -0
  62. package/dist/plugins/specweave/lib/vendor/utils/feature-id-derivation.js +85 -0
  63. package/dist/plugins/specweave/lib/vendor/utils/feature-id-derivation.js.map +1 -0
  64. package/dist/plugins/specweave/lib/vendor/utils/fs-native.d.ts +219 -0
  65. package/dist/plugins/specweave/lib/vendor/utils/fs-native.js +397 -0
  66. package/dist/plugins/specweave/lib/vendor/utils/fs-native.js.map +1 -0
  67. package/dist/plugins/specweave/lib/vendor/utils/logger.d.ts +56 -0
  68. package/dist/plugins/specweave/lib/vendor/utils/logger.js +123 -0
  69. package/dist/plugins/specweave/lib/vendor/utils/logger.js.map +1 -0
  70. package/dist/plugins/specweave/lib/vendor/utils/translation.d.ts +187 -0
  71. package/dist/plugins/specweave/lib/vendor/utils/translation.js +414 -0
  72. package/dist/plugins/specweave/lib/vendor/utils/translation.js.map +1 -0
  73. package/dist/plugins/specweave-ado/lib/ado-ac-checkbox-sync.js +1 -1
  74. package/dist/plugins/specweave-ado/lib/ado-ac-checkbox-sync.js.map +1 -1
  75. package/dist/plugins/specweave-ado/lib/ado-spec-sync.js +1 -1
  76. package/dist/plugins/specweave-ado/lib/ado-spec-sync.js.map +1 -1
  77. package/dist/plugins/specweave-github/lib/github-ac-checkbox-sync.js +2 -2
  78. package/dist/plugins/specweave-github/lib/github-ac-checkbox-sync.js.map +1 -1
  79. package/dist/plugins/specweave-github/lib/github-feature-sync.d.ts.map +1 -1
  80. package/dist/plugins/specweave-github/lib/github-feature-sync.js +13 -4
  81. package/dist/plugins/specweave-github/lib/github-feature-sync.js.map +1 -1
  82. package/dist/plugins/specweave-jira/lib/jira-ac-checkbox-sync.js +1 -1
  83. package/dist/plugins/specweave-jira/lib/jira-ac-checkbox-sync.js.map +1 -1
  84. package/dist/plugins/specweave-jira/lib/jira-spec-sync.js +1 -1
  85. package/dist/plugins/specweave-jira/lib/jira-spec-sync.js.map +1 -1
  86. package/dist/src/sync/spec-to-living-docs-sync.js +1 -1
  87. package/dist/src/sync/spec-to-living-docs-sync.js.map +1 -1
  88. package/package.json +1 -1
  89. package/plugins/specweave/lib/vendor/utils/auth-helpers.d.ts +151 -0
  90. package/plugins/specweave/lib/vendor/utils/auth-helpers.js +359 -0
  91. package/plugins/specweave/lib/vendor/utils/auth-helpers.js.map +1 -0
  92. package/plugins/specweave/skills/team-lead/SKILL.md +150 -56
  93. package/plugins/specweave/skills/team-lead/agents/backend.md +13 -9
  94. package/plugins/specweave/skills/team-lead/agents/database.md +13 -9
  95. package/plugins/specweave/skills/team-lead/agents/frontend.md +12 -8
  96. package/plugins/specweave/skills/team-lead/agents/security.md +13 -9
  97. package/plugins/specweave/skills/team-lead/agents/testing.md +12 -8
  98. package/plugins/specweave-ado/lib/ado-ac-checkbox-sync.js +1 -1
  99. package/plugins/specweave-ado/lib/ado-ac-checkbox-sync.ts +1 -1
  100. package/plugins/specweave-ado/lib/ado-spec-sync.js +1 -1
  101. package/plugins/specweave-ado/lib/ado-spec-sync.ts +1 -1
  102. package/plugins/specweave-github/lib/github-ac-checkbox-sync.js +1 -1
  103. package/plugins/specweave-github/lib/github-ac-checkbox-sync.ts +2 -2
  104. package/plugins/specweave-github/lib/github-feature-sync.js +11 -3
  105. package/plugins/specweave-github/lib/github-feature-sync.ts +13 -4
  106. package/plugins/specweave-jira/lib/jira-ac-checkbox-sync.js +1 -1
  107. package/plugins/specweave-jira/lib/jira-ac-checkbox-sync.ts +1 -1
  108. package/plugins/specweave-jira/lib/jira-spec-sync.js +1 -1
  109. package/plugins/specweave-jira/lib/jira-spec-sync.ts +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chalk-fallback.js","sourceRoot":"","sources":["../../../src/utils/chalk-fallback.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Clean Environment Utility
3
+ *
4
+ * CRITICAL: This module MUST have NO imports from modules that spawn child processes
5
+ * to avoid circular dependencies. This is a foundational utility.
6
+ *
7
+ * This utility is used by:
8
+ * - execFileNoThrow.ts (core exec utility)
9
+ * - claude-cli-detector.ts (CLI detection)
10
+ * - Test files (via tests/test-utils/clean-env.ts)
11
+ *
12
+ * @module clean-env
13
+ */
14
+ /**
15
+ * Create a clean environment for spawning child processes.
16
+ *
17
+ * CRITICAL: Removes env vars that can cause child processes to fail:
18
+ *
19
+ * - CLAUDECODE: Nested session guard (Claude Code v2.1.39+) blocks `claude -p`
20
+ * when running inside a Claude Code session. Unsetting is the official bypass.
21
+ * See: https://github.com/anthropics/claude-code/issues/25434
22
+ * Same fix applied in Python Agent SDK PR #594.
23
+ * - VSCode Debug: NODE_OPTIONS contains --inspect-brk flags
24
+ * - WebStorm/IntelliJ: NODE_OPTIONS or IDEA-specific vars
25
+ * - CI/CD (GitHub Actions, etc.): May set NODE_OPTIONS for coverage
26
+ * - Jest/Vitest: May set NODE_OPTIONS for debugging
27
+ *
28
+ * This function is safe to use in ALL environments:
29
+ * - Windows, macOS, Linux
30
+ * - Local development, CI/CD pipelines
31
+ * - Debug mode, run mode, production
32
+ *
33
+ * If a variable is not set, delete is a no-op (safe).
34
+ *
35
+ * @returns A copy of process.env with problematic vars removed
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * import { getCleanEnv } from './clean-env.js';
40
+ *
41
+ * // Spawn a child process without debugger interference
42
+ * execSync('node script.js', { env: getCleanEnv() });
43
+ * spawnSync('claude', ['--version'], { env: getCleanEnv() });
44
+ * ```
45
+ */
46
+ export declare function getCleanEnv(): NodeJS.ProcessEnv;
47
+ //# sourceMappingURL=clean-env.d.ts.map
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Clean Environment Utility
3
+ *
4
+ * CRITICAL: This module MUST have NO imports from modules that spawn child processes
5
+ * to avoid circular dependencies. This is a foundational utility.
6
+ *
7
+ * This utility is used by:
8
+ * - execFileNoThrow.ts (core exec utility)
9
+ * - claude-cli-detector.ts (CLI detection)
10
+ * - Test files (via tests/test-utils/clean-env.ts)
11
+ *
12
+ * @module clean-env
13
+ */
14
+ /**
15
+ * Create a clean environment for spawning child processes.
16
+ *
17
+ * CRITICAL: Removes env vars that can cause child processes to fail:
18
+ *
19
+ * - CLAUDECODE: Nested session guard (Claude Code v2.1.39+) blocks `claude -p`
20
+ * when running inside a Claude Code session. Unsetting is the official bypass.
21
+ * See: https://github.com/anthropics/claude-code/issues/25434
22
+ * Same fix applied in Python Agent SDK PR #594.
23
+ * - VSCode Debug: NODE_OPTIONS contains --inspect-brk flags
24
+ * - WebStorm/IntelliJ: NODE_OPTIONS or IDEA-specific vars
25
+ * - CI/CD (GitHub Actions, etc.): May set NODE_OPTIONS for coverage
26
+ * - Jest/Vitest: May set NODE_OPTIONS for debugging
27
+ *
28
+ * This function is safe to use in ALL environments:
29
+ * - Windows, macOS, Linux
30
+ * - Local development, CI/CD pipelines
31
+ * - Debug mode, run mode, production
32
+ *
33
+ * If a variable is not set, delete is a no-op (safe).
34
+ *
35
+ * @returns A copy of process.env with problematic vars removed
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * import { getCleanEnv } from './clean-env.js';
40
+ *
41
+ * // Spawn a child process without debugger interference
42
+ * execSync('node script.js', { env: getCleanEnv() });
43
+ * spawnSync('claude', ['--version'], { env: getCleanEnv() });
44
+ * ```
45
+ */
46
+ export function getCleanEnv() {
47
+ const cleanEnv = { ...process.env };
48
+ // Remove Claude Code nested session guard (v2.1.39+)
49
+ // When CLAUDECODE=1, `claude -p` refuses to start with:
50
+ // "Claude Code cannot be launched inside another Claude Code session"
51
+ // This is safe: we're spawning a one-shot pipe-mode call, not a competing session.
52
+ delete cleanEnv.CLAUDECODE;
53
+ // Remove Node.js debugger/inspector flags (VSCode, WebStorm, etc.)
54
+ delete cleanEnv.NODE_OPTIONS;
55
+ delete cleanEnv.NODE_INSPECT;
56
+ delete cleanEnv.NODE_INSPECT_RESUME_ON_START;
57
+ // Remove coverage instrumentation that can interfere with spawned processes
58
+ delete cleanEnv.NODE_V8_COVERAGE;
59
+ // Remove test runner debug vars
60
+ delete cleanEnv.VSCODE_INSPECTOR_OPTIONS;
61
+ return cleanEnv;
62
+ }
63
+ //# sourceMappingURL=clean-env.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clean-env.js","sourceRoot":"","sources":["../../../src/utils/clean-env.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,UAAU,WAAW;IACzB,MAAM,QAAQ,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAEpC,qDAAqD;IACrD,wDAAwD;IACxD,wEAAwE;IACxE,mFAAmF;IACnF,OAAO,QAAQ,CAAC,UAAU,CAAC;IAE3B,mEAAmE;IACnE,OAAO,QAAQ,CAAC,YAAY,CAAC;IAC7B,OAAO,QAAQ,CAAC,YAAY,CAAC;IAC7B,OAAO,QAAQ,CAAC,4BAA4B,CAAC;IAE7C,4EAA4E;IAC5E,OAAO,QAAQ,CAAC,gBAAgB,CAAC;IAEjC,gCAAgC;IAChC,OAAO,QAAQ,CAAC,wBAAwB,CAAC;IAEzC,OAAO,QAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Credential Masker - Security Utility
3
+ *
4
+ * Automatically masks sensitive credentials in logs, console output, and file writes.
5
+ * Prevents accidental exposure of secrets in debugging output and log files.
6
+ *
7
+ * Features:
8
+ * - Pattern-based detection of common credential formats
9
+ * - Context-aware masking (preserves first/last characters for debugging)
10
+ * - Zero-config (works out of the box)
11
+ * - Handles JSON, environment variables, URLs, and more
12
+ */
13
+ /**
14
+ * Masking options
15
+ */
16
+ export interface MaskOptions {
17
+ /**
18
+ * Show first N characters (default: 4)
19
+ */
20
+ showFirst?: number;
21
+ /**
22
+ * Show last N characters (default: 4)
23
+ */
24
+ showLast?: number;
25
+ /**
26
+ * Mask character (default: '*')
27
+ */
28
+ maskChar?: string;
29
+ /**
30
+ * Minimum length to mask (default: 8)
31
+ * Shorter values are completely masked
32
+ */
33
+ minLength?: number;
34
+ /**
35
+ * Enable aggressive mode (masks more patterns)
36
+ */
37
+ aggressive?: boolean;
38
+ }
39
+ /**
40
+ * Mask a credential value
41
+ *
42
+ * @param value - Credential to mask
43
+ * @param options - Masking options
44
+ * @returns Masked credential
45
+ *
46
+ * @example
47
+ * maskValue('ghp_1234567890abcdef') // 'ghp_****def'
48
+ * maskValue('short') // '********'
49
+ */
50
+ export declare function maskValue(value: string, options?: MaskOptions): string;
51
+ /**
52
+ * Mask all credentials in a string
53
+ *
54
+ * @param text - Text potentially containing credentials
55
+ * @param options - Masking options
56
+ * @returns Text with credentials masked
57
+ *
58
+ * @example
59
+ * maskCredentials('GITHUB_TOKEN=ghp_123456') // 'GITHUB_TOKEN=ghp_****'
60
+ * maskCredentials('Bearer eyJhbGc...') // 'Bearer eyJh****...'
61
+ */
62
+ export declare function maskCredentials(text: string, options?: MaskOptions): string;
63
+ /**
64
+ * Mask credentials in structured data (objects, arrays)
65
+ *
66
+ * @param data - Data structure
67
+ * @param options - Masking options
68
+ * @returns Data with credentials masked
69
+ */
70
+ export declare function maskCredentialsInData(data: any, options?: MaskOptions): any;
71
+ /**
72
+ * Sanitize bash command output
73
+ *
74
+ * Masks credentials in bash command outputs (especially grep results)
75
+ *
76
+ * @param output - Command output
77
+ * @param options - Masking options
78
+ * @returns Sanitized output
79
+ *
80
+ * @example
81
+ * sanitizeBashOutput('GITHUB_TOKEN=ghp_123456\nAPI_KEY=sk_test_123')
82
+ * // 'GITHUB_TOKEN=ghp_****\nAPI_KEY=sk_t****123'
83
+ */
84
+ export declare function sanitizeBashOutput(output: string, options?: MaskOptions): string;
85
+ /**
86
+ * Check if text contains potential credentials
87
+ *
88
+ * @param text - Text to check
89
+ * @returns True if credentials detected
90
+ */
91
+ export declare function containsCredentials(text: string): boolean;
92
+ /**
93
+ * Create a credential-safe logger wrapper
94
+ *
95
+ * Wraps a logger to automatically mask credentials
96
+ *
97
+ * @param logger - Original logger
98
+ * @param options - Masking options
99
+ * @returns Wrapped logger with automatic masking
100
+ */
101
+ export declare function createSecureLogger(logger: any, options?: MaskOptions): {
102
+ log: (message: string, ...args: any[]) => void;
103
+ info: (message: string, ...args: any[]) => void;
104
+ error: (message: string, error?: any) => void;
105
+ warn: (message: string) => void;
106
+ debug: (message: string) => void;
107
+ };
108
+ /**
109
+ * Environment variable masking helper
110
+ *
111
+ * Masks sensitive environment variables before logging
112
+ *
113
+ * @param env - Environment object
114
+ * @param options - Masking options
115
+ * @returns Masked environment object
116
+ */
117
+ export declare function maskEnvironment(env?: NodeJS.ProcessEnv, options?: MaskOptions): Record<string, string>;
118
+ //# sourceMappingURL=credential-masker.d.ts.map
@@ -0,0 +1,275 @@
1
+ /**
2
+ * Credential Masker - Security Utility
3
+ *
4
+ * Automatically masks sensitive credentials in logs, console output, and file writes.
5
+ * Prevents accidental exposure of secrets in debugging output and log files.
6
+ *
7
+ * Features:
8
+ * - Pattern-based detection of common credential formats
9
+ * - Context-aware masking (preserves first/last characters for debugging)
10
+ * - Zero-config (works out of the box)
11
+ * - Handles JSON, environment variables, URLs, and more
12
+ */
13
+ /**
14
+ * Sensitive patterns to mask
15
+ */
16
+ const SENSITIVE_PATTERNS = [
17
+ // Environment variable assignments
18
+ { pattern: /\b(GITHUB_TOKEN|GH_TOKEN)=([^\s]+)/gi, name: 'GitHub Token' },
19
+ { pattern: /\b(JIRA_API_TOKEN|JIRA_TOKEN)=([^\s]+)/gi, name: 'JIRA Token' },
20
+ { pattern: /\b(JIRA_EMAIL)=([^\s@]+@[^\s]+)/gi, name: 'JIRA Email' },
21
+ { pattern: /\b(AZURE_DEVOPS_PAT|AZURE_DEVOPS_TOKEN|ADO_PAT)=([^\s]+)/gi, name: 'Azure DevOps PAT' },
22
+ { pattern: /\b(AWS_SECRET_ACCESS_KEY)=([^\s]+)/gi, name: 'AWS Secret Key' },
23
+ { pattern: /\b(AWS_ACCESS_KEY_ID)=([^\s]+)/gi, name: 'AWS Access Key' },
24
+ { pattern: /\b(OPENAI_API_KEY|ANTHROPIC_API_KEY)=([^\s]+)/gi, name: 'API Key' },
25
+ { pattern: /\b(DATABASE_URL|DB_URL|POSTGRES_URL|MYSQL_URL)=([^\s]+)/gi, name: 'Database URL' },
26
+ { pattern: /\b(SUPABASE_KEY|SUPABASE_ANON_KEY|SUPABASE_SERVICE_KEY)=([^\s]+)/gi, name: 'Supabase Key' },
27
+ { pattern: /\b(CF_API_TOKEN|CLOUDFLARE_API_TOKEN)=([^\s]+)/gi, name: 'Cloudflare Token' },
28
+ { pattern: /\b(VERCEL_TOKEN)=([^\s]+)/gi, name: 'Vercel Token' },
29
+ // JSON-style credentials
30
+ { pattern: /"(token|apiToken|api_token|accessToken|access_token|password|secret|apiKey|api_key)"\s*:\s*"([^"]{8,})"/gi, name: 'JSON Token' },
31
+ // URLs with credentials (http/https)
32
+ { pattern: /https?:\/\/[^:]+:([^@]{8,})@[^\s]+/gi, name: 'HTTP URL with credentials' },
33
+ // URLs with credentials (redis, postgresql, mysql, mongodb)
34
+ { pattern: /(redis|postgresql|postgres|mysql|mongodb):\/\/[^:]*:([^@]{6,})@[^\s]+/gi, name: 'Database URL with credentials' },
35
+ // Bearer tokens
36
+ { pattern: /Bearer\s+([A-Za-z0-9\-_=]+\.[A-Za-z0-9\-_=]+\.[A-Za-z0-9\-_.+/=]+)/gi, name: 'Bearer JWT' },
37
+ { pattern: /Bearer\s+([A-Za-z0-9_\-]{20,})/gi, name: 'Bearer Token' },
38
+ // Generic tokens (alphanumeric strings 32+ chars)
39
+ { pattern: /\b([a-zA-Z0-9_\-]{40,})\b/g, name: 'Generic Token' },
40
+ ];
41
+ /**
42
+ * Default masking options
43
+ */
44
+ const DEFAULT_OPTIONS = {
45
+ showFirst: 4,
46
+ showLast: 4,
47
+ maskChar: '*',
48
+ minLength: 8,
49
+ aggressive: false,
50
+ };
51
+ /**
52
+ * Mask a credential value
53
+ *
54
+ * @param value - Credential to mask
55
+ * @param options - Masking options
56
+ * @returns Masked credential
57
+ *
58
+ * @example
59
+ * maskValue('ghp_1234567890abcdef') // 'ghp_****def'
60
+ * maskValue('short') // '********'
61
+ */
62
+ export function maskValue(value, options = {}) {
63
+ const opts = { ...DEFAULT_OPTIONS, ...options };
64
+ if (!value || value.length < opts.minLength) {
65
+ // Short values - completely mask
66
+ return opts.maskChar.repeat(8);
67
+ }
68
+ const showCount = opts.showFirst + opts.showLast;
69
+ if (value.length <= showCount) {
70
+ // Value too short to show partial
71
+ return opts.maskChar.repeat(8);
72
+ }
73
+ const first = value.slice(0, opts.showFirst);
74
+ const last = value.slice(-opts.showLast);
75
+ const maskLength = Math.max(8, value.length - showCount);
76
+ const mask = opts.maskChar.repeat(maskLength);
77
+ return `${first}${mask}${last}`;
78
+ }
79
+ /**
80
+ * Mask all credentials in a string
81
+ *
82
+ * @param text - Text potentially containing credentials
83
+ * @param options - Masking options
84
+ * @returns Text with credentials masked
85
+ *
86
+ * @example
87
+ * maskCredentials('GITHUB_TOKEN=ghp_123456') // 'GITHUB_TOKEN=ghp_****'
88
+ * maskCredentials('Bearer eyJhbGc...') // 'Bearer eyJh****...'
89
+ */
90
+ export function maskCredentials(text, options = {}) {
91
+ if (!text)
92
+ return text;
93
+ let maskedText = text;
94
+ for (const { pattern, name } of SENSITIVE_PATTERNS) {
95
+ maskedText = maskedText.replace(pattern, (match, key, value) => {
96
+ // For environment variables: KEY=value
97
+ if (key && value && typeof value === 'string') {
98
+ return `${key}=${maskValue(value, options)}`;
99
+ }
100
+ // For JSON: "key": "value"
101
+ if (match.includes(':') && value && typeof value === 'string') {
102
+ return match.replace(value, maskValue(value, options));
103
+ }
104
+ // For URLs: http://user:pass@host
105
+ if (match.includes('://') && value && typeof value === 'string') {
106
+ return match.replace(value, maskValue(value, options));
107
+ }
108
+ // For Bearer tokens: Bearer <token>
109
+ if (match.toLowerCase().includes('bearer') && key && typeof key === 'string') {
110
+ return `Bearer ${maskValue(key, options)}`;
111
+ }
112
+ // Generic token (single capture group)
113
+ if (key && !value && typeof key === 'string') {
114
+ return maskValue(key, options);
115
+ }
116
+ // Fallback: mask the whole match
117
+ return maskValue(match, options);
118
+ });
119
+ }
120
+ return maskedText;
121
+ }
122
+ /**
123
+ * Mask credentials in structured data (objects, arrays)
124
+ *
125
+ * @param data - Data structure
126
+ * @param options - Masking options
127
+ * @returns Data with credentials masked
128
+ */
129
+ export function maskCredentialsInData(data, options = {}) {
130
+ if (typeof data === 'string') {
131
+ return maskCredentials(data, options);
132
+ }
133
+ if (Array.isArray(data)) {
134
+ return data.map(item => maskCredentialsInData(item, options));
135
+ }
136
+ if (data && typeof data === 'object') {
137
+ const masked = {};
138
+ for (const [key, value] of Object.entries(data)) {
139
+ const lowerKey = key.toLowerCase();
140
+ // Check if key suggests sensitive data
141
+ const isSensitiveKey = [
142
+ 'token', 'password', 'secret', 'key', 'credential',
143
+ 'apitoken', 'api_token', 'accesstoken', 'access_token',
144
+ 'pat', 'apikey', 'api_key'
145
+ ].some(sensitive => lowerKey.includes(sensitive));
146
+ if (isSensitiveKey && typeof value === 'string') {
147
+ masked[key] = maskValue(value, options);
148
+ }
149
+ else if (typeof value === 'object') {
150
+ masked[key] = maskCredentialsInData(value, options);
151
+ }
152
+ else {
153
+ masked[key] = value;
154
+ }
155
+ }
156
+ return masked;
157
+ }
158
+ return data;
159
+ }
160
+ /**
161
+ * Sanitize bash command output
162
+ *
163
+ * Masks credentials in bash command outputs (especially grep results)
164
+ *
165
+ * @param output - Command output
166
+ * @param options - Masking options
167
+ * @returns Sanitized output
168
+ *
169
+ * @example
170
+ * sanitizeBashOutput('GITHUB_TOKEN=ghp_123456\nAPI_KEY=sk_test_123')
171
+ * // 'GITHUB_TOKEN=ghp_****\nAPI_KEY=sk_t****123'
172
+ */
173
+ export function sanitizeBashOutput(output, options = {}) {
174
+ if (!output)
175
+ return output;
176
+ // Mask line-by-line to preserve structure
177
+ return output
178
+ .split('\n')
179
+ .map(line => maskCredentials(line, options))
180
+ .join('\n');
181
+ }
182
+ /**
183
+ * Check if text contains potential credentials
184
+ *
185
+ * @param text - Text to check
186
+ * @returns True if credentials detected
187
+ */
188
+ export function containsCredentials(text) {
189
+ if (!text)
190
+ return false;
191
+ return SENSITIVE_PATTERNS.some(({ pattern }) => {
192
+ // Reset regex state
193
+ pattern.lastIndex = 0;
194
+ return pattern.test(text);
195
+ });
196
+ }
197
+ /**
198
+ * Create a credential-safe logger wrapper
199
+ *
200
+ * Wraps a logger to automatically mask credentials
201
+ *
202
+ * @param logger - Original logger
203
+ * @param options - Masking options
204
+ * @returns Wrapped logger with automatic masking
205
+ */
206
+ export function createSecureLogger(logger, options = {}) {
207
+ return {
208
+ log: (message, ...args) => {
209
+ const maskedMsg = maskCredentials(message, options);
210
+ const maskedArgs = args.map(arg => typeof arg === 'string' ? maskCredentials(arg, options) : arg);
211
+ logger.log(maskedMsg, ...maskedArgs);
212
+ },
213
+ info: (message, ...args) => {
214
+ const maskedMsg = maskCredentials(message, options);
215
+ const maskedArgs = args.map(arg => typeof arg === 'string' ? maskCredentials(arg, options) : arg);
216
+ logger.info(maskedMsg, ...maskedArgs);
217
+ },
218
+ error: (message, error) => {
219
+ const maskedMsg = maskCredentials(message, options);
220
+ let maskedError = error;
221
+ if (error && typeof error === 'object') {
222
+ maskedError = maskCredentialsInData(error, options);
223
+ }
224
+ else if (typeof error === 'string') {
225
+ maskedError = maskCredentials(error, options);
226
+ }
227
+ logger.error(maskedMsg, maskedError);
228
+ },
229
+ warn: (message) => {
230
+ const maskedMsg = maskCredentials(message, options);
231
+ logger.warn(maskedMsg);
232
+ },
233
+ debug: (message) => {
234
+ const maskedMsg = maskCredentials(message, options);
235
+ logger.debug(maskedMsg);
236
+ }
237
+ };
238
+ }
239
+ /**
240
+ * Environment variable masking helper
241
+ *
242
+ * Masks sensitive environment variables before logging
243
+ *
244
+ * @param env - Environment object
245
+ * @param options - Masking options
246
+ * @returns Masked environment object
247
+ */
248
+ export function maskEnvironment(env = process.env, options = {}) {
249
+ const masked = {};
250
+ // Never mask these common environment variables
251
+ const neverMask = new Set([
252
+ 'PATH', 'HOME', 'USER', 'SHELL', 'LANG', 'PWD', 'OLDPWD',
253
+ 'NODE_ENV', 'NODE_VERSION', 'NPM_VERSION', 'TERM', 'EDITOR',
254
+ 'TMPDIR', 'TMP', 'TEMP', 'HOSTNAME', 'OSTYPE'
255
+ ]);
256
+ for (const [key, value] of Object.entries(env)) {
257
+ if (!value) {
258
+ masked[key] = '';
259
+ continue;
260
+ }
261
+ // Never mask whitelisted vars
262
+ if (neverMask.has(key.toUpperCase())) {
263
+ masked[key] = value;
264
+ continue;
265
+ }
266
+ const lowerKey = key.toLowerCase();
267
+ const isSensitive = [
268
+ 'token', 'password', 'secret', 'key', 'credential',
269
+ 'pat', 'api', 'auth'
270
+ ].some(word => lowerKey.includes(word));
271
+ masked[key] = isSensitive ? maskValue(value, options) : value;
272
+ }
273
+ return masked;
274
+ }
275
+ //# sourceMappingURL=credential-masker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-masker.js","sourceRoot":"","sources":["../../../src/utils/credential-masker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,99 @@
1
+ import { ExecFileException } from 'child_process';
2
+ /**
3
+ * Result from command execution
4
+ */
5
+ export interface ExecResult {
6
+ /** Standard output from command */
7
+ stdout: string;
8
+ /** Standard error from command */
9
+ stderr: string;
10
+ /** Exit code (0 = success) */
11
+ exitCode: number;
12
+ /** Whether command succeeded (exitCode === 0) */
13
+ success: boolean;
14
+ /** Error object if command failed */
15
+ error?: ExecFileException;
16
+ }
17
+ /**
18
+ * Safely execute a command without throwing errors
19
+ *
20
+ * This utility uses child_process.execFile instead of exec/execSync:
21
+ * - ✅ Prevents command injection vulnerabilities (no shell interpolation)
22
+ * - ✅ Cross-platform compatible (Windows, Mac, Linux)
23
+ * - ✅ Proper error handling (returns result instead of throwing)
24
+ * - ✅ Structured output (stdout, stderr, exitCode)
25
+ *
26
+ * @param command - Command to execute (must be in PATH or absolute path)
27
+ * @param args - Array of arguments (safely escaped automatically)
28
+ * @param options - Additional execution options
29
+ * @returns Promise resolving to execution result
30
+ *
31
+ * @example
32
+ * ```typescript
33
+ * // ✅ Safe: Arguments automatically escaped
34
+ * const result = await execFileNoThrow('git', ['add', userProvidedFilename]);
35
+ * if (result.success) {
36
+ * console.log('Git add succeeded:', result.stdout);
37
+ * } else {
38
+ * console.error('Git add failed:', result.stderr);
39
+ * }
40
+ *
41
+ * // ✅ Check if command exists
42
+ * const which = process.platform === 'win32' ? 'where' : 'which';
43
+ * const checkResult = await execFileNoThrow(which, ['claude']);
44
+ * if (checkResult.success) {
45
+ * console.log('Claude CLI found at:', checkResult.stdout.trim());
46
+ * }
47
+ * ```
48
+ */
49
+ export declare function execFileNoThrow(command: string, args?: string[], options?: {
50
+ cwd?: string;
51
+ env?: NodeJS.ProcessEnv;
52
+ timeout?: number;
53
+ maxBuffer?: number;
54
+ shell?: boolean;
55
+ }): Promise<ExecResult>;
56
+ /**
57
+ * Synchronous version of execFileNoThrow
58
+ *
59
+ * Use sparingly - prefer async version when possible.
60
+ * Useful for initialization code that needs to be synchronous.
61
+ *
62
+ * @example
63
+ * ```typescript
64
+ * const result = execFileNoThrowSync('claude', ['--version']);
65
+ * if (result.success) {
66
+ * console.log('Claude version:', result.stdout.trim());
67
+ * }
68
+ * ```
69
+ */
70
+ export declare function execFileNoThrowSync(command: string, args?: string[], options?: {
71
+ cwd?: string;
72
+ env?: NodeJS.ProcessEnv;
73
+ timeout?: number;
74
+ maxBuffer?: number;
75
+ shell?: boolean;
76
+ }): ExecResult;
77
+ /**
78
+ * Check if a command is available in PATH
79
+ *
80
+ * Cross-platform helper that uses 'which' (Unix) or 'where' (Windows)
81
+ *
82
+ * @param command - Command name to check (e.g., 'claude', 'git', 'node')
83
+ * @returns Promise resolving to true if command exists, false otherwise
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * if (await isCommandAvailable('claude')) {
88
+ * console.log('Claude CLI is installed');
89
+ * } else {
90
+ * console.log('Claude CLI not found - install from https://claude.com/code');
91
+ * }
92
+ * ```
93
+ */
94
+ export declare function isCommandAvailable(command: string): Promise<boolean>;
95
+ /**
96
+ * Synchronous version of isCommandAvailable
97
+ */
98
+ export declare function isCommandAvailableSync(command: string): boolean;
99
+ //# sourceMappingURL=execFileNoThrow.d.ts.map