Previously, the interactive overwrite prompt confirmed but did not
remove the old directory, leaving stale files (e.g. renamed
tech-stack.md) behind. Now the directory is removed before
regeneration, consistent with --force behavior.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Defer PicoSpinner instantiation to avoid unnecessary object allocation
when the spinner will never be displayed (quiet, verbose, or stdout mode).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace log-update dependency with picospinner (from tinylibs) to reduce
transitive dependencies. picospinner provides built-in spinner functionality
(frames, symbols, succeed/fail states) that was previously manually
implemented on top of log-update, simplifying cliSpinner.ts.
This removes 12 transitive packages (ansi-escapes, cli-cursor, slice-ansi,
wrap-ansi, string-width, etc.) from the dependency tree.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Extract duplicated DefaultActionRunnerResult mock into
createMockDefaultActionResult() helper function
- Add missing REPOMIX_REMOTE_TRUST_CONFIG env var mention in ko, pt-br,
ru library usage docs for consistency with other languages
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Remove the intermediate isRemote flag that inverted remoteTrustConfig
only to be re-inverted back to skipLocalConfig in defaultAction. Now
remoteAction computes skipLocalConfig directly, reducing the internal
flag chain from 3 concepts to 2 (remoteTrustConfig → skipLocalConfig).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Move absolute path validation for --config to before repository
download/clone, avoiding wasted I/O on invalid input
- Consolidate duplicate findConfigFile calls in skipLocalConfig branch
into a single search with conditional handling
- Add test for relative --config rejection even with --remote-trust-config
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Relative --config paths in remote mode would resolve against the cloned
temp directory, potentially loading and executing malicious config files
(e.g., repomix.config.ts) from untrusted repositories.
Now rejects relative paths with a clear error message guiding users to
use absolute paths instead.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
When using `repomix --remote <url>` or the MCP `pack_remote_repository` tool,
config files (repomix.config.ts/js) from the cloned repository were executed
via jiti, allowing a malicious repository to achieve arbitrary code execution
on the user's machine.
This commit skips all local config file loading when processing remote
repositories. The `isRemote` flag is propagated from remoteAction through
defaultAction to loadFileConfig, which skips local config auto-detection
and --config flag resolution. Global config and CLI options continue to
work normally.
Users who need to trust remote configs can do so in a future release via
an explicit opt-in flag (e.g., --trust-remote-config).
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Allow users to run `repomix https://github.com/user/repo` or
`repomix git@github.com:user/repo.git` without the `--remote` flag.
Only explicit URL formats (https:// and git@) are auto-detected.
Shorthand format (owner/repo) is not auto-detected to avoid
ambiguity with local directory paths.
Closes#1120
Remove pc.white() calls from cliReport.ts to use terminal's default
foreground color instead. This fixes visibility issues on light-themed
terminals like Solarized Light where white text is unreadable.
Closes#1057
Vitest v4 changed how vi.fn() and vi.mock() work with class constructors.
Arrow functions in mockImplementation no longer work as constructors
when called with 'new' keyword.
Changes:
- Use regular function syntax instead of arrow functions for constructor mocks
- Use vi.hoisted() to define class mocks that can be used in vi.mock() factories
- Replace vi.fn().mockReturnValue() with vi.fn().mockImplementation() for class mocks
- Update mock instance retrieval to use vi.mocked().mock.results[0].value
Add a unified worker entry point that enables full bundling support by
allowing bundled files to spawn workers using themselves. This is a
prerequisite for bundling the website server to improve Cloud Run cold
start times.
Changes:
- Add src/shared/unifiedWorker.ts as single entry point for all workers
- Support both worker_threads and child_process runtimes
- Add REPOMIX_WORKER_TYPE env var for child_process worker type detection
- Add REPOMIX_WORKER_PATH env var for bundled environment worker path
- Add REPOMIX_WASM_DIR env var for WASM file location override
- Update processConcurrency.ts to use unified worker path
- Add debug logging (REPOMIX_DEBUG_WORKER=1) for worker troubleshooting
- Export unified worker handler from main index.ts
Note: This is work in progress. There's a known issue with child_process
runtime where nested worker pools (created inside a worker) may receive
incorrect REPOMIX_WORKER_TYPE environment variable, causing task routing
issues. Investigation ongoing.
Address review feedback:
- Add empty string validation for --skill-output option
- Add file vs directory check in prepareSkillDir to prevent silent file deletion
- Add tests for resolveAndPrepareSkillDir function
The copySkillOutputToCurrentDirectory function was never actually used
because skills are written directly to their final destination via the
skillDir absolute path, not to the temp directory.
- Remove copySkillOutputToCurrentDirectory function
- Remove related tests
- Simplify the copy logic in runRemoteAction
- Remove unused skillLocation variable and imports
- Fix skillLocation detection using getSkillBaseDir for accurate path matching
- Improve error handling in prepareSkillDir to re-throw non-ENOENT errors
- Extract resolveAndPrepareSkillDir helper to reduce code duplication
- Add getSkillLocation helper for consistent location type detection
- Add tests for new error handling and getSkillLocation function
Add two new CLI options to enable non-interactive skill generation for CI/CD
pipelines and automation scripts:
- `--skill-output <path>`: Specify skill output directory path directly,
skipping the interactive location prompt
- `-f, --force`: Force overwrite existing skill directory without confirmation
This addresses #1012 where users needed to generate skills in automated
environments without interactive prompts.
Example usage:
```bash
repomix --skill-generate --skill-output .codebuddy --force
```
Adds a size-based output splitter via --split-output (kb/mb) and writes numbered parts without splitting within a top-level folder.
Also updates metrics aggregation for multi-part output and adds unit tests.
Add unit tests for the copySkillOutputToCurrentDirectory function:
- Copy .claude/skills directory when it exists
- Skip copy when directory does not exist
- Handle EPERM and EACCES permission errors
- Handle generic errors
- Replace process.exit() with OperationCancelledError in skillPrompts.ts
- Centralize Handlebars helper registration in outputStyleUtils.ts
- Add path normalization validation in generateSkillTool.ts
- Set idempotentHint to true for generate_skill MCP tool
- Add skillGenerate config merge tests in configLoad.test.ts
- Add path normalization test in generateSkillTool.test.ts
Instead of creating separate variables and passing them through the task,
directly update cliOptions.skillName and cliOptions.skillDir. This simplifies
the code flow and removes redundant fields from DefaultActionTask interface.
When the skill directory is under the current working directory,
show a relative path (e.g., .claude/skills/my-skill) instead of
an absolute path for better readability.
When Personal Skills location is selected, the summary was showing
a relative path (.claude/skills/) instead of the actual path
(~/.claude/skills/). Now passes the computed skillDir to reportResults.
Add @clack/prompts-based selection for skill output location:
- Personal Skills (~/.claude/skills/) - default, available across all projects
- Project Skills (.claude/skills/) - shared with team via git
Features:
- Interactive prompt to choose skill location
- Overwrite confirmation when skill directory already exists
- Works with both local and remote repositories
Refactor and improve the skill generation feature based on code review:
- Split generateSkillOutput into generateSkillReferences and
generateSkillMdFromReferences to avoid double generation
- Add try-catch error handling to writeSkillOutput with proper
permission error messages
- Add unit tests for skillSectionGenerators (12 tests)
- Add validation tests for --skill-generate flag combinations
- Update createMockConfig to support skillGenerate and remoteUrl
Added unit tests for buildCliConfig function to cover --no-gitignore,
--no-dot-ignore, and --no-default-patterns flags. These tests ensure
proper handling of ignore configuration options and improve test coverage
to meet the 80% threshold.
This addresses the Codecov coverage gap where src/cli/actions/defaultAction.ts
lines 131-132 were not covered by tests.
Updated documentation for all supported languages to include:
- ignore.useDotIgnore configuration option
- --no-dot-ignore CLI flag
- .ignore file explanation and priority order
- Benefits of using .ignore file with ripgrep and ag tools
Also updated test files to include useDotIgnore in mock configs
to satisfy TypeScript type checking after adding the new
configuration option.
Languages updated:
- zh-cn (Simplified Chinese)
- zh-tw (Traditional Chinese)
- ko (Korean)
- vi (Vietnamese)
- id (Indonesian)
- hi (Hindi)
- fr (French)
- de (German)
- es (Spanish)
- pt-br (Brazilian Portuguese)
Implemented mandatory and recommended fixes from code review:
1. Fix timer cleanup in cliSpinner.test.ts
- Added vi.useRealTimers() to afterEach hook
- Prevents fake timers from bleeding into other test files
2. Fix isCancel mock in initAction.test.ts (3 locations)
- Changed from mockReturnValue(true) to mockImplementation
- Now properly tests only the actual cancel symbol
- More accurate test behavior for cancellation scenarios
3. Add DI pattern explanation comment in configLoad.ts
- Clarifies why dependency injection is used for jitiImport
- Documents the double instrumentation issue
- Helps future maintainers understand the design decision
When copying output files fails due to permission errors (EPERM/EACCES),
provide clear and actionable error messages that explain the issue and
offer specific solutions.
This commonly occurs when users run repomix from protected directories
like C:\Windows\System32 on Windows.
Fixes#868
When using the remote repository feature with an absolute path specified
for the output file, the previous implementation attempted to copy the file
even though source and target resolved to the same path. This resulted in
an error when trying to copy a file to itself.
This commit fixes the issue by:
- Checking if source and target paths are identical before copying
- Skipping the copy operation when they are the same
- This handles absolute paths and any other edge cases where paths resolve to the same location
The fix is implemented in copyOutputToCurrentDirectory function itself,
making it more robust and self-contained.
Fixes#873
Added override configuration to disable Biome's organizeImports feature
specifically for src/index.ts to allow manual import order management
while keeping automatic import organization enabled for other files.
- Remove unnecessary config parameter from PingTask interface for better performance
- Improve error serialization using util.inspect with safety limits
- Update function signatures to match simplified ping interface
- Add comprehensive error details formatting with depth and length limits
These changes address PR review comments and improve worker efficiency.
- Fix stdin processing tests to expect raw cwd path instead of resolved path
- Aligns test expectations with actual implementation where stdin uses [cwd] directly
- Resolves Windows CI failures where path.resolve() was incorrectly applied to stdin cases
- Maintains correct expectations for directory processing vs stdin processing paths
This fixes the remaining Windows CI test failures while preserving test accuracy.
- Import path module and use path.resolve() for all path assertions
- Fix failing tests on Windows CI by handling platform-specific path separators
- Ensure tests work correctly on both Unix and Windows systems
- Maintain test functionality while improving cross-platform compatibility
This resolves CI failures on Windows builds while preserving test coverage.
- Add tests for defaultActionWorker.ts covering ping, directory processing, stdin handling, error cases, and path resolution
- Add tests for calculateGitDiffMetrics.ts covering config validation, diff processing, error handling, and encoding
- Add tests for calculateGitLogMetrics.ts covering log processing, error scenarios, and edge cases
- All test files follow project conventions with proper mocking and type safety
- Total of 46 new tests ensuring robust coverage of worker functionality
These tests improve code coverage and provide safety net for future changes
to the metrics calculation and worker system components.
- Use class names for RepomixError type checking instead of hardcoded strings
- Remove unused RepomixError import from fileProcess.ts
- Simplify comments in errorHandle.ts and fileProcess.ts
- Clean up constructor-based error checking logic
Implemented a comprehensive worker process architecture that balances performance and isolation:
- Created defaultActionWorker.ts that runs entire CLI processing pipeline in child_process for better resource isolation
- Migrated all other worker implementations (fileProcess, security, metrics, etc.) from child_process to worker_threads for improved performance
- Enhanced logger.ts to support both worker_threads (via workerData) and child_process (via environment variables)
- Added color support for child_process workers by passing FORCE_COLOR and TERM environment variables
- Moved Spinner from main process to defaultActionWorker for direct stdout control
This hybrid approach provides the best of both worlds: the main CLI operation runs in isolated child_process for stability, while intensive parallel tasks use faster worker_threads for optimal performance.
- Replace empty return in fileCollectWorker with descriptive error
- Simplify array flattening using flatMap instead of reduce
- Make test assertions OS-agnostic using path.join
- Improve encoding error detection with confidence checks and BOM handling
Remove redundant explanatory message from binary file listing to simplify output.
The main header already explains the detection method, making individual file
annotations unnecessary.
Changes:
- Remove "Detected as binary despite text extension" message from each file
- Improve type safety by using FileSkipReason type instead of string
- Update corresponding test expectations
- Clean up unused import in fileCollectWorker
The simplified output is cleaner while maintaining clarity about why files were excluded.