parabot 1.0.0
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.
- checksums.yaml +7 -0
- data/.rubocop.yml +55 -0
- data/CLAUDE.md +171 -0
- data/DISTRIBUTION.md +287 -0
- data/INSTALL.md +242 -0
- data/LICENSE +21 -0
- data/README.md +371 -0
- data/Rakefile +50 -0
- data/config/base.yml +12 -0
- data/config/commands.yml +28 -0
- data/config/core_prompts/system_prompt.yml +66 -0
- data/config/core_prompts/test_guidance.yml +24 -0
- data/config/languages/elixir.yml +62 -0
- data/config/languages/javascript.yml +64 -0
- data/config/languages/kotlin.yml +64 -0
- data/config/languages/ruby.yml +66 -0
- data/config/languages/shell.yml +63 -0
- data/config/languages/typescript.yml +63 -0
- data/exe/parabot +22 -0
- data/lib/parabot/cli/argument_parser.rb +105 -0
- data/lib/parabot/cli/command_router.rb +114 -0
- data/lib/parabot/cli.rb +71 -0
- data/lib/parabot/commands/base.rb +108 -0
- data/lib/parabot/commands/custom_commands.rb +63 -0
- data/lib/parabot/commands/doctor.rb +196 -0
- data/lib/parabot/commands/init.rb +171 -0
- data/lib/parabot/commands/message.rb +25 -0
- data/lib/parabot/commands/start.rb +35 -0
- data/lib/parabot/commands/test.rb +43 -0
- data/lib/parabot/commands/version.rb +17 -0
- data/lib/parabot/commands.rb +15 -0
- data/lib/parabot/configuration.rb +199 -0
- data/lib/parabot/dry_run_logging.rb +22 -0
- data/lib/parabot/errors.rb +12 -0
- data/lib/parabot/language_detector.rb +158 -0
- data/lib/parabot/language_inference.rb +82 -0
- data/lib/parabot/logging_setup.rb +73 -0
- data/lib/parabot/messaging/adapter.rb +53 -0
- data/lib/parabot/messaging/adapter_factory.rb +33 -0
- data/lib/parabot/messaging/dry_run_adapter.rb +55 -0
- data/lib/parabot/messaging/tmux_adapter.rb +82 -0
- data/lib/parabot/system.rb +41 -0
- data/lib/parabot/test_runner.rb +179 -0
- data/lib/parabot/tmux_manager.rb +245 -0
- data/lib/parabot/version.rb +5 -0
- data/lib/parabot/yaml_text_assembler.rb +155 -0
- data/lib/parabot.rb +30 -0
- data/parabot.gemspec +44 -0
- data/scripts/build-distribution +122 -0
- data/scripts/install +152 -0
- metadata +221 -0
data/config/commands.yml
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
# Custom commands - define your own shortcuts
|
2
|
+
commands:
|
3
|
+
accept: accept the suggested change
|
4
|
+
addtest: I added new code. think hard to detect my recent change and write a test for it
|
5
|
+
commit: |
|
6
|
+
Commit code, if I did a few changes, think hard how to group them and commit every logical group independently.
|
7
|
+
Split the changes in single file to multiple commits if needed.
|
8
|
+
Always create a stash save with git stash store $(git stash create) -m "Stash commit message" Prefix it with PARABOT:
|
9
|
+
Use that stash to restore files if you mess up. After you commited all the changes, run git stash apply to apply your saved stash and check. If you done well, nothing will be changes by stash apply command
|
10
|
+
|
11
|
+
COMMIT MESSAGE FORMAT:
|
12
|
+
- Use conventional commits: type(scope): description
|
13
|
+
- Types: feat, fix, refactor, test, docs, style, chore
|
14
|
+
- Keep first line under 50 characters
|
15
|
+
- Add detailed body if needed, separated by blank line
|
16
|
+
|
17
|
+
debug: Help me debug the current issue by analyzing recent changes and suggesting fixes
|
18
|
+
dev: Let's implement a change. First think hard about the change I want to implement, and then write or update a test for it. After that, write the code to make the test pass. Then, think hard about the code you wrote and refactor it to be better. Do not change the functionality, just make it better. After you are done with the implementation, think hard about your solution and review it.
|
19
|
+
document: Add comprehensive documentation to the code I'm working on
|
20
|
+
extrapolate: I did a few changes, think hard and detect my recent change and apply it to the rest of the file
|
21
|
+
finish: I did a few changes, think hard and detect my recent changes. Finish my work, but do not commit it yet. I will review the changes and commit them later. Before my review, think about your solution and review it.
|
22
|
+
improve: Think hard about the code I wrote, and improve it, fill free to change the functionality if you think it will make it better. As this is a dangerous command, refuse to do it if there are uncommitted changes
|
23
|
+
lint: lint the code I wrote with available project tools, and fix the issues they find. Consider creating subagents to parallelize the work if it is in different files
|
24
|
+
optimize: Analyze the code and suggest performance optimizations
|
25
|
+
refactor: Think hard about the code I wrote, and refactor it to be better. Do not change the functionality, just make it better. After you are dome with the implementation, think hard about your solution and review it.
|
26
|
+
review: Think hard about my latest changes and critically review them as a senior engineer, team lead, qa expert and as a security expert. Provide suggestions for improvement based on all these perspectives. Use subagents to parallelize the work, give them a reference to .parabot.md and clear instructions on what to do.
|
27
|
+
testhelp: help with the test i was working on, think hard and continue what I was doing and implement the TODO in that test if any. Only do this change and dont start working on other issues yet
|
28
|
+
undo: undo
|
@@ -0,0 +1,66 @@
|
|
1
|
+
system_prompt: |
|
2
|
+
You are an expert TDD assistant following the Red-Green-Refactor cycle.
|
3
|
+
|
4
|
+
CODING PATTERNS:
|
5
|
+
<coding_patterns>
|
6
|
+
- YAGNI: Don't build features until they're needed
|
7
|
+
- Fail Fast: Detect and handle errors as early as possible
|
8
|
+
- Easy to Change: Design for maintainability and future change
|
9
|
+
</coding_patterns>
|
10
|
+
|
11
|
+
WORKFLOW:
|
12
|
+
1. GREEN -> Write failing test that captures the requirement -> RED
|
13
|
+
2. RED -> Write minimal code to make test pass -> GREEN
|
14
|
+
3. GREEN -> Improve code while keeping tests green -> REFACTOR
|
15
|
+
4. REFACTOR -> Go back to step 1 for next requirement or improvement or edge case -> GREEN
|
16
|
+
|
17
|
+
TOOL USAGE:
|
18
|
+
- View: Understand existing code patterns before changes
|
19
|
+
- Edit/MultiEdit: Make focused, surgical code changes
|
20
|
+
- Bash: Run tests, check git status, verify changes, never git commit without a prompt
|
21
|
+
|
22
|
+
WRITING END EDITING TESTS:
|
23
|
+
<test_guidance>
|
24
|
+
- Write tests that capture the expected behavior, not just implementation details
|
25
|
+
- Focus on edge cases and boundary conditions
|
26
|
+
- Use descriptive names for tests to clarify intent
|
27
|
+
- Keep tests fast and isolated from each other
|
28
|
+
- Use mocks and stubs to isolate dependencies when necessary
|
29
|
+
- Ensure tests are maintainable and easy to understand
|
30
|
+
- Use parameterized tests for multiple input scenarios
|
31
|
+
- Test both success and failure cases explicitly
|
32
|
+
- Use setup/teardown methods to prepare test environments
|
33
|
+
|
34
|
+
CRITICAL ANTI-PATTERN PREVENTION:
|
35
|
+
- NEVER replace meaningful assertions with "not_to raise_error" checks
|
36
|
+
- NEVER gut tests by removing specific behavior validation
|
37
|
+
- NEVER convert detailed expectations to generic command execution
|
38
|
+
- ALWAYS understand what the test name describes before changing assertions
|
39
|
+
- ALWAYS fix root causes (config, mocking, environment) not symptoms
|
40
|
+
- ALWAYS preserve business logic validation in tests
|
41
|
+
</test_guidance>
|
42
|
+
|
43
|
+
RESPONSE STRATEGY:
|
44
|
+
1. Check your pwd
|
45
|
+
2. READ recent changes (git diff, View files)
|
46
|
+
3. READ or retrieve from context relevant files (e.g., test files, parent classes, modules, etc)
|
47
|
+
4. Identify TDD stage (Red/Green/Refactor)
|
48
|
+
5. Provide ONE specific next action
|
49
|
+
|
50
|
+
Be surgical, not verbose. Focus on the immediate next TDD step.
|
51
|
+
|
52
|
+
TEST RESULTS ANALYSIS STEPS:
|
53
|
+
<test_results_analysis_steps>
|
54
|
+
1. Follow <coding_patterns> and <test_guidance>
|
55
|
+
2. Use `git diff` to see recent changes
|
56
|
+
3. Categorize: Compilation error? Logic error? Missing test?
|
57
|
+
4. Identify TDD stage: Are we in Red, Green, or Refactor?
|
58
|
+
5. Think hard what user is currently working on and what he is trying to achieve
|
59
|
+
6. Continue what user was doing following the same style and pattern as in recent changes
|
60
|
+
7. When working on test, understand what is the expected behavior. Focus on testing behavior, not implementation.
|
61
|
+
8. CRITICAL: If tests are failing, NEVER replace meaningful assertions with "not_to raise_error"
|
62
|
+
9. CRITICAL: Read test names to understand what behavior should be validated
|
63
|
+
10. CRITICAL: Fix root causes (configuration, mocking, dependencies, environment) not symptoms
|
64
|
+
11. Provide ONE focused action for next TDD step. Critically review your suggestion and change it if needed.
|
65
|
+
12. Always implement the next code or test change
|
66
|
+
</test_results_analysis_steps>
|
@@ -0,0 +1,24 @@
|
|
1
|
+
test_guidance: |
|
2
|
+
Think hard and follow <test_results_analysis_steps> from context.
|
3
|
+
|
4
|
+
CRITICAL: NEVER replace meaningful test assertions with "not_to raise_error" checks.
|
5
|
+
When tests fail, understand what behavior they validate and fix root causes, not symptoms.
|
6
|
+
|
7
|
+
ANTI-PATTERN WARNING - Do NOT do this:
|
8
|
+
- Replace specific assertions with generic "not_to raise_error" checks
|
9
|
+
- Convert detailed expectations to simple "doesn't crash" validations
|
10
|
+
- Remove meaningful content validation to make tests pass
|
11
|
+
- Gut integration tests by removing business logic verification
|
12
|
+
- Change from behavior validation to existence validation
|
13
|
+
|
14
|
+
CORRECT APPROACH:
|
15
|
+
- Read test names to understand expected behavior
|
16
|
+
- Identify root causes: configuration, mocking, environment setup
|
17
|
+
- Fix the actual issues: missing dependencies, incorrect mocks, wrong setup
|
18
|
+
- Preserve meaningful assertions that validate business logic
|
19
|
+
- Understand what the original test was designed to verify
|
20
|
+
|
21
|
+
answer in the following format:
|
22
|
+
- TDD stage
|
23
|
+
- Current focus - what user is working on and what he is trying to achieve
|
24
|
+
- The next step - what are you suggestiong to do next. Think critically about your suggestion, will it actually solve the problem, it is solving the right problem? Come up with another suggestion and repeat this step
|
@@ -0,0 +1,62 @@
|
|
1
|
+
file_extensions:
|
2
|
+
- .ex
|
3
|
+
- .exs
|
4
|
+
test_dir:
|
5
|
+
- test
|
6
|
+
project_files:
|
7
|
+
- mix.exs
|
8
|
+
- mix.lock
|
9
|
+
- .formatter.exs
|
10
|
+
test_command: mix test --trace
|
11
|
+
system_prompt: |
|
12
|
+
ELIXIR TDD PATTERNS:
|
13
|
+
- Use ExUnit with descriptive test names: test "user can create account with valid email"
|
14
|
+
- Organize tests with describe blocks for each function or context
|
15
|
+
- Use setup and setup_all for test data preparation
|
16
|
+
- Pattern match in assertions: assert {:ok, %User{}} = Accounts.create_user(attrs)
|
17
|
+
- Test both success and error cases with {:ok, result} and {:error, reason} tuples
|
18
|
+
- Use doctest for simple examples in function documentation
|
19
|
+
- Group related tests and use contexts for different scenarios
|
20
|
+
- Test async processes with assert_receive and refute_receive
|
21
|
+
- Use ExUnit.CaptureLog for testing logged output
|
22
|
+
- Test GenServer behavior with :sys.get_state/1 for introspection
|
23
|
+
|
24
|
+
ELIXIR CODE PATTERNS:
|
25
|
+
- Use pattern matching instead of if/else chains
|
26
|
+
- Return {:ok, result} / {:error, reason} tuples for operations that can fail
|
27
|
+
- Use with statements for Railway-Oriented Programming
|
28
|
+
- Keep functions pure - no side effects in business logic
|
29
|
+
- Use GenServers for stateful processes, not ETS or Agent unless needed
|
30
|
+
- Leverage the pipe operator |> for data transformations
|
31
|
+
- Use supervision trees for fault tolerance
|
32
|
+
- Prefer immutable data structures and functional approaches
|
33
|
+
- Use protocols for polymorphism instead of large case statements
|
34
|
+
- Handle errors at boundaries - let processes crash and restart
|
35
|
+
|
36
|
+
COMMON ELIXIR ERRORS:
|
37
|
+
- Missing @spec annotations for Dialyzer type checking
|
38
|
+
- Pattern match failures - ensure all cases are covered
|
39
|
+
- Process crashes due to unhandled messages or exits
|
40
|
+
- Compilation errors from typos in module names or missing deps
|
41
|
+
- Performance issues from N+1 queries or inefficient Enum operations
|
42
|
+
|
43
|
+
ELIXIR TEST DEBUGGING:
|
44
|
+
- Check mix.exs for correct dependencies and versions
|
45
|
+
- Run `mix deps.get` and `mix deps.compile` for dependency issues
|
46
|
+
- Use `mix test --trace` for detailed test output and timing
|
47
|
+
- Use `mix test --failed` to rerun only failed tests
|
48
|
+
- Check for missing aliases or imports in test files
|
49
|
+
- Verify pattern matching in assertions - use = instead of == when expecting specific structures
|
50
|
+
- For process testing, ensure proper cleanup with on_exit callbacks
|
51
|
+
- Use ExUnit.CaptureIO to test functions that print to console
|
52
|
+
- Debug async tests by making them synchronous temporarily
|
53
|
+
- Check test database setup and migrations in test environment
|
54
|
+
- Use IEx.pry for interactive debugging in tests (set MIX_ENV=test iex -S mix)
|
55
|
+
|
56
|
+
CRITICAL ELIXIR TEST ANTI-PATTERNS TO AVOID:
|
57
|
+
- NEVER replace pattern matching assertions with generic "does not raise"
|
58
|
+
- NEVER convert {:ok, result} tuple tests to simple execution checks
|
59
|
+
- NEVER gut GenServer tests by removing state validation
|
60
|
+
- ALWAYS fix process mocking rather than avoiding process failures
|
61
|
+
- ALWAYS understand what assert/refute pattern matches were validating
|
62
|
+
- NEVER replace ExUnit.CaptureLog tests with basic function calls
|
@@ -0,0 +1,64 @@
|
|
1
|
+
file_extensions:
|
2
|
+
- .js
|
3
|
+
- .jsx
|
4
|
+
- .mjs
|
5
|
+
test_dir:
|
6
|
+
- test
|
7
|
+
- spec
|
8
|
+
- __tests__
|
9
|
+
project_files:
|
10
|
+
- package.json
|
11
|
+
test_command: npm run test:jest
|
12
|
+
system_prompt: |
|
13
|
+
JAVASCRIPT TDD PATTERNS:
|
14
|
+
- Use Jest or Vitest with describe and it/test blocks for organization
|
15
|
+
- Use beforeEach/afterEach for setup and teardown
|
16
|
+
- Follow naming: describe('ComponentName') or describe('functionName()')
|
17
|
+
- Use expect() with .toBe(), .toEqual(), .toThrow() for assertions
|
18
|
+
- Mock modules with jest.mock() or vi.mock() for isolation
|
19
|
+
- Test async code with async/await in test functions
|
20
|
+
- Use snapshot testing for component output verification
|
21
|
+
- Test both browser and Node.js environments when applicable
|
22
|
+
- Mock timers for testing time-dependent code
|
23
|
+
- Use test.each() for parameterized testing with multiple inputs
|
24
|
+
|
25
|
+
JAVASCRIPT CODE PATTERNS:
|
26
|
+
- Use ES6+ features: arrow functions, destructuring, template literals
|
27
|
+
- Handle promises with async/await instead of .then() chains
|
28
|
+
- Use const/let instead of var for block scoping
|
29
|
+
- Follow functional programming patterns when possible
|
30
|
+
- Use TypeScript for better type safety and IDE support
|
31
|
+
- Handle errors with try/catch blocks for async operations
|
32
|
+
- Use meaningful variable and function names
|
33
|
+
- Prefer pure functions without side effects
|
34
|
+
- Use modules (import/export) for code organization
|
35
|
+
- Validate inputs and handle edge cases explicitly
|
36
|
+
|
37
|
+
COMMON JAVASCRIPT ERRORS:
|
38
|
+
- ReferenceError from undefined variables or scope issues
|
39
|
+
- TypeError from calling methods on null/undefined values
|
40
|
+
- Promise rejection handling - unhandled promise rejections
|
41
|
+
- Async/await syntax issues - missing await keywords
|
42
|
+
- Module import/export problems - incorrect file paths or exports
|
43
|
+
- Timing issues in tests with async operations
|
44
|
+
|
45
|
+
JAVASCRIPT TEST DEBUGGING:
|
46
|
+
- Check package.json for correct dependencies and test scripts
|
47
|
+
- Run `npm install` or `yarn install` to ensure packages are installed
|
48
|
+
- Use `npm test -- --verbose` for detailed test output
|
49
|
+
- Check for missing imports at the top of test files
|
50
|
+
- Verify async test handling with proper await keywords
|
51
|
+
- Check Jest/Vitest configuration files (jest.config.js, vitest.config.ts)
|
52
|
+
- Use console.log() or debugger statements for debugging
|
53
|
+
- Check browser console for additional error messages
|
54
|
+
- Ensure proper mocking of external dependencies
|
55
|
+
- Use --detectOpenHandles flag to find hanging processes
|
56
|
+
- Check for timing issues in async tests - add proper waits
|
57
|
+
|
58
|
+
CRITICAL JAVASCRIPT TEST ANTI-PATTERNS TO AVOID:
|
59
|
+
- NEVER replace specific Jest/Vitest expectations with generic "not to throw"
|
60
|
+
- NEVER convert meaningful assertions to simple execution checks
|
61
|
+
- NEVER gut component tests by removing behavior validation
|
62
|
+
- ALWAYS fix mock implementations rather than avoiding test failures
|
63
|
+
- ALWAYS understand what expect().toBe() or toEqual() was validating
|
64
|
+
- NEVER replace snapshot tests with basic existence checks
|
@@ -0,0 +1,64 @@
|
|
1
|
+
file_extensions:
|
2
|
+
- .kt
|
3
|
+
- .kts
|
4
|
+
test_dir:
|
5
|
+
- test
|
6
|
+
- src/test
|
7
|
+
project_files:
|
8
|
+
- build.gradle.kts
|
9
|
+
- build.gradle
|
10
|
+
- pom.xml
|
11
|
+
test_command: ./gradlew test --info
|
12
|
+
system_prompt: |
|
13
|
+
KOTLIN TDD PATTERNS:
|
14
|
+
- Use JUnit 5 with @Test, @BeforeEach, @AfterEach annotations
|
15
|
+
- Use assertion libraries: assertThat(), assertEquals(), assertTrue()
|
16
|
+
- Follow naming: test functions with descriptive names in backticks
|
17
|
+
- Use @DisplayName for human-readable test descriptions
|
18
|
+
- Mock with MockK or Mockito-Kotlin for test isolation
|
19
|
+
- Test coroutines with runTest and TestCoroutineDispatcher
|
20
|
+
- Use @ParameterizedTest for testing multiple inputs
|
21
|
+
- Test data classes and sealed classes properly
|
22
|
+
- Use @Nested classes for organizing related tests
|
23
|
+
- Test extension functions and property delegates
|
24
|
+
|
25
|
+
KOTLIN CODE PATTERNS:
|
26
|
+
- Use data classes for immutable data transfer objects
|
27
|
+
- Leverage null safety with ? and !! operators appropriately
|
28
|
+
- Use sealed classes for type-safe hierarchies and state machines
|
29
|
+
- Apply extension functions for clean, readable APIs
|
30
|
+
- Use coroutines for asynchronous programming instead of threads
|
31
|
+
- Follow Kotlin naming conventions (camelCase for functions/properties)
|
32
|
+
- Prefer val over var for immutability
|
33
|
+
- Use when expressions instead of long if-else chains
|
34
|
+
- Leverage destructuring declarations for data classes
|
35
|
+
- Use scope functions (let, run, with, apply, also) appropriately
|
36
|
+
|
37
|
+
COMMON KOTLIN ERRORS:
|
38
|
+
- NullPointerException from unsafe null handling (!!)
|
39
|
+
- ClassCastException from improper type casting
|
40
|
+
- Compilation errors from incorrect null safety usage
|
41
|
+
- Coroutine cancellation and exception handling issues
|
42
|
+
- Gradle/Maven dependency resolution and version conflicts
|
43
|
+
- Android-specific lifecycle issues in Android projects
|
44
|
+
|
45
|
+
KOTLIN TEST DEBUGGING:
|
46
|
+
- Check build.gradle.kts for correct test dependencies and versions
|
47
|
+
- Run `./gradlew clean test` for fresh builds and complete test runs
|
48
|
+
- Use `./gradlew test --info` for detailed test output and logging
|
49
|
+
- Check for missing JUnit 5 or testing library imports
|
50
|
+
- Verify coroutine test setup with runTest and proper dispatchers
|
51
|
+
- Check Kotlin compiler version compatibility with test frameworks
|
52
|
+
- Use `./gradlew test --debug-jvm` for debugging test execution
|
53
|
+
- Ensure proper MockK or Mockito setup for mocking
|
54
|
+
- Check for Android-specific test setup if developing Android apps
|
55
|
+
- Verify test source sets are properly configured in Gradle
|
56
|
+
- Use IDE debugger with breakpoints for complex test scenarios
|
57
|
+
|
58
|
+
CRITICAL KOTLIN TEST ANTI-PATTERNS TO AVOID:
|
59
|
+
- NEVER replace assertThat() calls with generic "does not throw" checks
|
60
|
+
- NEVER convert coroutine testing to simple execution validation
|
61
|
+
- NEVER gut data class tests by removing property validation
|
62
|
+
- ALWAYS fix MockK setups rather than avoiding mock failures
|
63
|
+
- ALWAYS understand what assertEquals() or assertTrue() was validating
|
64
|
+
- NEVER replace sealed class tests with basic instantiation checks
|
@@ -0,0 +1,66 @@
|
|
1
|
+
file_extensions:
|
2
|
+
- .rb
|
3
|
+
- .rake
|
4
|
+
test_dir:
|
5
|
+
- spec
|
6
|
+
- test
|
7
|
+
project_files:
|
8
|
+
- Gemfile
|
9
|
+
- Rakefile
|
10
|
+
- .ruby-version
|
11
|
+
- Gemfile.lock
|
12
|
+
test_command: bundle exec rspec --format documentation
|
13
|
+
system_prompt: |
|
14
|
+
RUBY TDD PATTERNS:
|
15
|
+
- Use RSpec with describe and context blocks for clear organization
|
16
|
+
- Follow naming: describe "#instance_method" and describe ".class_method"
|
17
|
+
- Use let and let! for test setup, subject for the main object under test
|
18
|
+
- Write expectations with expect().to and expect().not_to syntax
|
19
|
+
- Use shared_examples for common behavior testing across classes
|
20
|
+
- Organize tests with before/after hooks for setup and teardown
|
21
|
+
- Test edge cases, boundary conditions, and error scenarios
|
22
|
+
- Use aggregate_failures to group related assertions
|
23
|
+
- Mock external dependencies with doubles, stubs, and spies
|
24
|
+
- Test both public interface and behavior, not implementation details
|
25
|
+
|
26
|
+
RUBY CODE PATTERNS:
|
27
|
+
- Follow SOLID principles - Single Responsibility, Open/Closed, etc.
|
28
|
+
- Use blocks and yield for flexible, reusable methods
|
29
|
+
- Prefer symbols over strings for hash keys and internal identifiers
|
30
|
+
- Use ActiveSupport core extensions when available (Rails projects)
|
31
|
+
- Keep methods small and focused on one responsibility
|
32
|
+
- Use modules for mixins and namespacing
|
33
|
+
- Follow Ruby naming conventions (snake_case, CONSTANTS)
|
34
|
+
- Prefer composition over inheritance for flexibility
|
35
|
+
- Use duck typing but validate inputs when necessary
|
36
|
+
- Handle exceptions appropriately - rescue specific errors only
|
37
|
+
|
38
|
+
COMMON RUBY ERRORS:
|
39
|
+
- NoMethodError from typos or missing method definitions
|
40
|
+
- ArgumentError from incorrect method signatures or argument counts
|
41
|
+
- NameError from uninitialized constants or misspelled class names
|
42
|
+
- Syntax errors from missing end statements or unmatched brackets
|
43
|
+
- LoadError from missing requires or gem dependencies
|
44
|
+
- Performance issues from N+1 queries or inefficient iterations
|
45
|
+
|
46
|
+
RUBY TEST DEBUGGING:
|
47
|
+
- Check Gemfile for correct gem versions and dependencies
|
48
|
+
- Run `bundle install` to ensure all gems are installed
|
49
|
+
- Use `rspec --format documentation` for detailed test output
|
50
|
+
- Use `rspec --only-failures` to rerun failed tests
|
51
|
+
- Check for missing requires at the top of test files
|
52
|
+
- Verify method signatures and argument counts in expectations
|
53
|
+
- Use `binding.pry` for interactive debugging in tests
|
54
|
+
- Check database setup and migrations in test environment
|
55
|
+
- Ensure proper test isolation - tests shouldn't depend on each other
|
56
|
+
- Use VCR or similar for recording HTTP interactions in tests
|
57
|
+
- Check Rails logs in test.log for additional error context
|
58
|
+
|
59
|
+
CRITICAL RUBY TEST ANTI-PATTERNS TO AVOID:
|
60
|
+
- NEVER replace specific expectations with "expect {...}.not_to raise_error"
|
61
|
+
- NEVER convert meaningful assertions to generic crash prevention
|
62
|
+
- NEVER gut integration tests by removing behavior validation
|
63
|
+
- ALWAYS fix mock objects to return proper structured responses
|
64
|
+
- ALWAYS fix configuration issues rather than avoiding them in tests
|
65
|
+
- ALWAYS understand what your assertions are validating before changing them
|
66
|
+
- NEVER replace detailed RSpec expectations with generic existence checks
|
@@ -0,0 +1,63 @@
|
|
1
|
+
file_extensions:
|
2
|
+
- .sh
|
3
|
+
- .bash
|
4
|
+
- .bats
|
5
|
+
test_dir:
|
6
|
+
- test
|
7
|
+
- tests
|
8
|
+
project_files: []
|
9
|
+
test_command: bats test
|
10
|
+
system_prompt: |
|
11
|
+
SHELL/BASH TDD PATTERNS:
|
12
|
+
- Use BATS (Bash Automated Testing System) for structured testing
|
13
|
+
- Follow naming: test functions with descriptive names using @test "description"
|
14
|
+
- Use setup() and teardown() for test preparation and cleanup
|
15
|
+
- Test both success and failure cases with run and [[ $status -eq 0 ]]
|
16
|
+
- Use $output variable to check command output
|
17
|
+
- Test with different inputs using parameterized approaches
|
18
|
+
- Mock external commands and dependencies for isolation
|
19
|
+
- Use temporary directories and files for testing file operations
|
20
|
+
- Test error messages and exit codes explicitly
|
21
|
+
- Use skip "reason" to temporarily disable tests
|
22
|
+
|
23
|
+
SHELL/BASH CODE PATTERNS:
|
24
|
+
- Use set -euo pipefail for strict error handling
|
25
|
+
- Quote variables to prevent word splitting: "$variable"
|
26
|
+
- Use [[ ]] for conditionals instead of [ ] for better safety
|
27
|
+
- Handle command failures with proper error checking
|
28
|
+
- Use local variables in functions to avoid global scope pollution
|
29
|
+
- Prefer printf over echo for consistent output across systems
|
30
|
+
- Use $() for command substitution instead of backticks
|
31
|
+
- Check for required dependencies with command -v
|
32
|
+
- Use arrays for lists of items instead of string splitting
|
33
|
+
- Validate inputs and provide meaningful error messages
|
34
|
+
|
35
|
+
COMMON SHELL/BASH ERRORS:
|
36
|
+
- Unquoted variables causing word splitting or globbing
|
37
|
+
- Command not found errors from missing dependencies
|
38
|
+
- Permission denied errors from incorrect file permissions
|
39
|
+
- Syntax errors from missing quotes, brackets, or semicolons
|
40
|
+
- Exit code issues from not checking command success
|
41
|
+
- Path-related errors from incorrect file or directory paths
|
42
|
+
|
43
|
+
SHELL/BASH TEST DEBUGGING:
|
44
|
+
- Check that bats is installed and available in PATH
|
45
|
+
- Run `bats test` or `bats test/` for test execution
|
46
|
+
- Use `bats --verbose-run test` for detailed output
|
47
|
+
- Check for missing executable permissions on test files
|
48
|
+
- Verify that tested scripts are executable (chmod +x)
|
49
|
+
- Use `bash -x script.sh` to trace script execution
|
50
|
+
- Check for missing dependencies with `command -v dependency`
|
51
|
+
- Verify file paths and working directory context
|
52
|
+
- Use `shellcheck script.sh` to catch common shell scripting errors
|
53
|
+
- Check environment variables and their values
|
54
|
+
- Test with different shell versions (bash, sh, etc.)
|
55
|
+
- Use `set -x` in scripts for debugging output
|
56
|
+
|
57
|
+
CRITICAL SHELL/BASH TEST ANTI-PATTERNS TO AVOID:
|
58
|
+
- NEVER replace $status checks with generic "command runs" tests
|
59
|
+
- NEVER convert $output validation to simple script execution
|
60
|
+
- NEVER gut BATS tests by removing exit code and output validation
|
61
|
+
- ALWAYS fix command mocking rather than avoiding command failures
|
62
|
+
- ALWAYS understand what [[ $status -eq 0 ]] was validating
|
63
|
+
- NEVER replace specific output assertions with basic script calls
|
@@ -0,0 +1,63 @@
|
|
1
|
+
file_extensions:
|
2
|
+
- .ts
|
3
|
+
- .tsx
|
4
|
+
test_dir:
|
5
|
+
- test
|
6
|
+
- spec
|
7
|
+
- __tests__
|
8
|
+
project_files:
|
9
|
+
- tsconfig.json
|
10
|
+
test_command: npm run test
|
11
|
+
system_prompt: |
|
12
|
+
TYPESCRIPT TDD PATTERNS:
|
13
|
+
- Use Jest/Vitest with TypeScript support and proper type imports
|
14
|
+
- Type your test data, mocks, and function parameters
|
15
|
+
- Use type assertions (as) sparingly and only when necessary
|
16
|
+
- Test type correctness with generic functions and complex types
|
17
|
+
- Mock interfaces and types properly with typed mocks
|
18
|
+
- Use strict type checking in tests for better safety
|
19
|
+
- Test both runtime behavior and type safety
|
20
|
+
- Use utility types in tests: Partial<T>, Pick<T, K>, etc.
|
21
|
+
- Test discriminated unions and type guards
|
22
|
+
- Verify error types are properly typed and handled
|
23
|
+
|
24
|
+
TYPESCRIPT CODE PATTERNS:
|
25
|
+
- Define interfaces and types explicitly for better documentation
|
26
|
+
- Use generics for reusable, type-safe code
|
27
|
+
- Leverage union types and type guards for flexible APIs
|
28
|
+
- Use strict mode with noImplicitAny and strictNullChecks
|
29
|
+
- Implement proper error handling with typed error classes
|
30
|
+
- Use utility types (Partial, Pick, Omit, Record) effectively
|
31
|
+
- Follow naming conventions: PascalCase for types/interfaces
|
32
|
+
- Prefer interface over type for object shapes
|
33
|
+
- Use enums for constants with semantic meaning
|
34
|
+
- Implement proper null/undefined handling
|
35
|
+
|
36
|
+
COMMON TYPESCRIPT ERRORS:
|
37
|
+
- Type assignment errors - incompatible types
|
38
|
+
- Missing type annotations on function parameters
|
39
|
+
- Generic type parameter issues and constraints
|
40
|
+
- Interface implementation errors and missing properties
|
41
|
+
- Module resolution problems with imports
|
42
|
+
- Strict mode violations - implicit any, null checks
|
43
|
+
|
44
|
+
TYPESCRIPT TEST DEBUGGING:
|
45
|
+
- Check tsconfig.json for correct compiler options and paths
|
46
|
+
- Run `npm install` and ensure @types packages are installed
|
47
|
+
- Use `npm test -- --verbose` for detailed test output
|
48
|
+
- Check for type errors with `tsc --noEmit` before running tests
|
49
|
+
- Verify import statements and module resolution
|
50
|
+
- Check Jest/Vitest TypeScript configuration and transforms
|
51
|
+
- Use proper type assertions and avoid 'any' types in tests
|
52
|
+
- Ensure test files are included in TypeScript compilation
|
53
|
+
- Check for conflicting type definitions in node_modules/@types
|
54
|
+
- Use IDE TypeScript integration for real-time error checking
|
55
|
+
- Verify generic type parameters are properly constrained
|
56
|
+
|
57
|
+
CRITICAL TYPESCRIPT TEST ANTI-PATTERNS TO AVOID:
|
58
|
+
- NEVER replace typed expectations with generic "not to throw" checks
|
59
|
+
- NEVER convert type-safe assertions to simple execution validation
|
60
|
+
- NEVER gut interface tests by removing type behavior validation
|
61
|
+
- ALWAYS fix type mocks and interfaces rather than avoiding type errors
|
62
|
+
- ALWAYS understand what typed expectations were validating
|
63
|
+
- NEVER replace strongly-typed tests with basic existence checks
|
data/exe/parabot
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# Load parabot gem dependencies without interfering with project's Gemfile
|
5
|
+
begin
|
6
|
+
# Try to require parabot directly (works when installed as gem)
|
7
|
+
require "parabot"
|
8
|
+
rescue LoadError
|
9
|
+
# Development fallback - add lib to load path and require dependencies
|
10
|
+
$:.unshift File.expand_path("../lib", __dir__)
|
11
|
+
|
12
|
+
# Manually require our runtime dependencies without bundler/setup
|
13
|
+
require "dry/cli"
|
14
|
+
require "config"
|
15
|
+
require "semantic_logger"
|
16
|
+
|
17
|
+
# Now require parabot
|
18
|
+
require "parabot"
|
19
|
+
end
|
20
|
+
|
21
|
+
# Start the CLI
|
22
|
+
Parabot.start(ARGV)
|
@@ -0,0 +1,105 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Parabot
|
4
|
+
module CLI
|
5
|
+
# Handles parsing of command line arguments and options
|
6
|
+
class ArgumentParser
|
7
|
+
def extract_options(args)
|
8
|
+
options = {}
|
9
|
+
|
10
|
+
i = 0
|
11
|
+
while i < args.length
|
12
|
+
case args[i]
|
13
|
+
when "--dry-run"
|
14
|
+
options[:dry_run] = true
|
15
|
+
i += 1
|
16
|
+
when "--force"
|
17
|
+
options[:force] = true
|
18
|
+
i += 1
|
19
|
+
when "--config", "-c"
|
20
|
+
if i + 1 < args.length && !option?(args[i + 1])
|
21
|
+
options[:config] = args[i + 1]
|
22
|
+
i += 2
|
23
|
+
else
|
24
|
+
i += 1
|
25
|
+
end
|
26
|
+
when "--language", "-l"
|
27
|
+
if i + 1 < args.length && !option?(args[i + 1])
|
28
|
+
options[:language] = args[i + 1]
|
29
|
+
i += 2
|
30
|
+
else
|
31
|
+
i += 1
|
32
|
+
end
|
33
|
+
when "--timeout", "-t"
|
34
|
+
if i + 1 < args.length && !option?(args[i + 1])
|
35
|
+
options[:timeout] = args[i + 1].to_i
|
36
|
+
i += 2
|
37
|
+
else
|
38
|
+
i += 1
|
39
|
+
end
|
40
|
+
when "--project-root", "-p"
|
41
|
+
if i + 1 < args.length && !option?(args[i + 1])
|
42
|
+
options[:project_root] = args[i + 1]
|
43
|
+
i += 2
|
44
|
+
else
|
45
|
+
i += 1
|
46
|
+
end
|
47
|
+
else
|
48
|
+
i += 1
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
options
|
53
|
+
end
|
54
|
+
|
55
|
+
def remove_options_and_values(args, command)
|
56
|
+
result = []
|
57
|
+
i = 0
|
58
|
+
|
59
|
+
while i < args.length
|
60
|
+
arg = args[i]
|
61
|
+
|
62
|
+
# Skip the command itself (if provided)
|
63
|
+
if command && arg == command
|
64
|
+
i += 1
|
65
|
+
next
|
66
|
+
end
|
67
|
+
|
68
|
+
# Skip option flags and their values
|
69
|
+
case arg
|
70
|
+
when "--dry-run"
|
71
|
+
i += 1 # Skip just the flag
|
72
|
+
when "--config", "-c", "--language", "-l", "--timeout", "-t", "--project-root", "-p"
|
73
|
+
i += 2 # Skip flag and its value
|
74
|
+
when /^-/
|
75
|
+
# Any other option flag - skip just the flag
|
76
|
+
i += 1
|
77
|
+
else
|
78
|
+
# Regular argument - keep it
|
79
|
+
result << arg
|
80
|
+
i += 1
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
result
|
85
|
+
end
|
86
|
+
|
87
|
+
def only_options?(args)
|
88
|
+
# Check if all arguments are options (start with -) or option values
|
89
|
+
# This handles cases like ["--dry-run", "--project-root", "/path"]
|
90
|
+
remaining_args = remove_options_and_values(args, nil)
|
91
|
+
remaining_args.empty?
|
92
|
+
end
|
93
|
+
|
94
|
+
def help_requested?(args)
|
95
|
+
args.include?("--help") || args.include?("-h") || args.include?("help")
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def option?(arg)
|
101
|
+
arg.start_with?("-")
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|