mcp-coder-utils 0.1.3__tar.gz → 0.1.4__tar.gz

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 (78) hide show
  1. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/CLAUDE.md +19 -8
  2. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/knowledge_base/refactoring_principles.md +1 -1
  3. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/settings.local.json +46 -39
  4. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/commit_push/SKILL.md +6 -10
  5. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/implement_direct/SKILL.md +2 -4
  6. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/implementation_review/SKILL.md +7 -16
  7. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/implementation_review_supervisor/SKILL.md +4 -4
  8. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/issue_analyse/SKILL.md +4 -7
  9. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/issue_approve/SKILL.md +2 -5
  10. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/issue_create/SKILL.md +2 -5
  11. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/issue_update/SKILL.md +5 -8
  12. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/plan_review/SKILL.md +4 -8
  13. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/plan_review_supervisor/SKILL.md +2 -2
  14. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/rebase/SKILL.md +8 -18
  15. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/rebase/rebase_design.md +6 -3
  16. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.mcp.json +4 -4
  17. {mcp_coder_utils-0.1.3/src/mcp_coder_utils.egg-info → mcp_coder_utils-0.1.4}/PKG-INFO +2 -1
  18. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/claude.bat +5 -0
  19. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/docs/architecture/architecture.md +5 -0
  20. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/pyproject.toml +2 -0
  21. mcp_coder_utils-0.1.4/src/mcp_coder_utils/__init__.py +10 -0
  22. mcp_coder_utils-0.1.4/src/mcp_coder_utils/fs/__init__.py +11 -0
  23. mcp_coder_utils-0.1.4/src/mcp_coder_utils/fs/path_security.py +36 -0
  24. mcp_coder_utils-0.1.4/src/mcp_coder_utils/fs/read_file.py +25 -0
  25. mcp_coder_utils-0.1.4/src/mcp_coder_utils/fs/text.py +18 -0
  26. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/src/mcp_coder_utils/log_utils.py +155 -72
  27. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/src/mcp_coder_utils/subprocess_streaming.py +8 -0
  28. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4/src/mcp_coder_utils.egg-info}/PKG-INFO +2 -1
  29. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/src/mcp_coder_utils.egg-info/SOURCES.txt +7 -0
  30. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/src/mcp_coder_utils.egg-info/requires.txt +1 -0
  31. mcp_coder_utils-0.1.4/tests/test_fs_path_security.py +53 -0
  32. mcp_coder_utils-0.1.4/tests/test_fs_read_file.py +40 -0
  33. mcp_coder_utils-0.1.4/tests/test_fs_text.py +28 -0
  34. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/tests/test_log_utils.py +75 -1
  35. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/tests/test_subprocess_streaming.py +14 -0
  36. mcp_coder_utils-0.1.3/src/mcp_coder_utils/__init__.py +0 -1
  37. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/agents/commit-pusher.md +0 -0
  38. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/knowledge_base/planning_principles.md +0 -0
  39. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/knowledge_base/python.md +0 -0
  40. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/knowledge_base/software_engineering_principles.md +0 -0
  41. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/check_branch_status/SKILL.md +0 -0
  42. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/discuss/SKILL.md +0 -0
  43. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/implementation_approve/SKILL.md +0 -0
  44. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/implementation_finalise/SKILL.md +0 -0
  45. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/implementation_needs_rework/SKILL.md +0 -0
  46. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/implementation_new_tasks/SKILL.md +0 -0
  47. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/issue_requirements/SKILL.md +0 -0
  48. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/plan_approve/SKILL.md +0 -0
  49. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.claude/skills/plan_update/SKILL.md +0 -0
  50. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.gitattributes +0 -0
  51. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.github/dependabot.yml +0 -0
  52. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.github/workflows/approve-command.yml +0 -0
  53. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.github/workflows/ci.yml +0 -0
  54. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.github/workflows/label-new-issues.yml +0 -0
  55. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.github/workflows/publish.yml +0 -0
  56. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.gitignore +0 -0
  57. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.importlinter +0 -0
  58. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.large-files-allowlist +0 -0
  59. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/.python-version +0 -0
  60. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/LICENSE +0 -0
  61. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/README.md +0 -0
  62. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/claude_local.bat +0 -0
  63. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/setup.cfg +0 -0
  64. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/src/mcp_coder_utils/py.typed +0 -0
  65. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/src/mcp_coder_utils/redaction.py +0 -0
  66. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/src/mcp_coder_utils/subprocess_runner.py +0 -0
  67. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/src/mcp_coder_utils.egg-info/dependency_links.txt +0 -0
  68. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/src/mcp_coder_utils.egg-info/top_level.txt +0 -0
  69. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/tests/__init__.py +0 -0
  70. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/tests/test_redaction.py +0 -0
  71. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/tests/test_subprocess_runner.py +0 -0
  72. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/tests/test_subprocess_runner_real.py +0 -0
  73. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/todo_issues.md +0 -0
  74. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/tools/read_github_deps.py +0 -0
  75. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/tools/reinstall_local.bat +0 -0
  76. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/tools/ruff_check.bat +0 -0
  77. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/tools/ruff_check.sh +0 -0
  78. {mcp_coder_utils-0.1.3 → mcp_coder_utils-0.1.4}/vulture_whitelist.py +0 -0
@@ -13,7 +13,7 @@ When in doubt, keep it in the consumer until a second consumer needs it.
13
13
 
14
14
  ## MCP Tools — mandatory
15
15
 
16
- Use MCP tools for **all** operations. Never use `Read`, `Write`, `Edit`, or `Bash` for tasks that have an MCP equivalent.
16
+ **Do NOT use native Claude Code file tools** (`Read`, `Write`, `Edit`, `Glob`, `Grep`, `Bash`) for any operation that has an MCP equivalent. Always use the `mcp__workspace__*` tools instead. This applies to all file reading, writing, editing, searching, listing, and git operations.
17
17
 
18
18
  ### Tool mapping
19
19
 
@@ -27,6 +27,7 @@ Use MCP tools for **all** operations. Never use `Read`, `Write`, `Edit`, or `Bas
27
27
  | Move file | `mcp__workspace__move_file` |
28
28
  | List directory | `mcp__workspace__list_directory` |
29
29
  | Search files | `mcp__workspace__search_files` |
30
+ | Search reference files | `mcp__workspace__search_reference_files` |
30
31
  | Read reference project | `mcp__workspace__read_reference_file` |
31
32
  | List reference dir | `mcp__workspace__list_reference_directory` |
32
33
  | Get reference projects | `mcp__workspace__get_reference_projects` |
@@ -38,12 +39,20 @@ Use MCP tools for **all** operations. Never use `Read`, `Write`, `Edit`, or `Bas
38
39
  | Format code (black+isort) | `mcp__tools-py__run_format_code` |
39
40
  | Get library source | `mcp__tools-py__get_library_source` |
40
41
  | Refactoring | `mcp__tools-py__move_symbol`, `move_module`, `rename_symbol`, `list_symbols`, `find_references` |
42
+ | Git (read-only) | `mcp__workspace__git` |
43
+ | Get base branch | `mcp__workspace__get_base_branch` |
44
+ | Check file size | `mcp__workspace__check_file_size` |
45
+ | Check branch status | `mcp__workspace__check_branch_status` |
46
+ | List GitHub issues | `mcp__workspace__github_issue_list` |
47
+ | View GitHub issue | `mcp__workspace__github_issue_view` |
48
+ | View GitHub PR | `mcp__workspace__github_pr_view` |
49
+ | Search GitHub | `mcp__workspace__github_search` |
41
50
 
42
51
  ### Reference projects
43
52
 
44
53
  Read-only browse via `mcp__workspace__read_reference_file`:
45
54
 
46
- - `p_mcp_coder` — `mcp_coder` source
55
+ - `p_coder` — `mcp_coder` source
47
56
  - `p_workspace` — `mcp-workspace` source
48
57
  - `p_config` — `mcp-config` source
49
58
  - `p_tools` — `mcp-tools-py` source
@@ -64,17 +73,19 @@ All checks must pass before proceeding.
64
73
 
65
74
  ## Git operations
66
75
 
67
- **Allowed commands via Bash:**
76
+ **Prefer MCP tools** for read-only git operations: use `mcp__workspace__git` with the `command` parameter (log, diff, status, merge_base, show, branch, fetch, rev_parse, ls_tree, ls_files, ls_remote). These run without permission prompts.
77
+
78
+ **Compact diff:** `mcp__workspace__git` with command `"diff"` includes compact diff by default — detects moved code, collapses unchanged blocks. Use `compact=False` for raw output.
79
+
80
+ **Bash commands** for git operations that have no MCP equivalent:
68
81
 
69
82
  ```
70
- git status / diff / commit / log / fetch / ls-tree
71
- gh issue view / gh run view
72
- mcp-coder git-tool compact-diff # diff that detects moves, collapses unchanged blocks
73
- mcp-coder check branch-status # CI status, rebase needs, task completion, labels
74
- mcp-coder check file-size # find files exceeding line-count threshold
83
+ git commit / git add
75
84
  mcp-coder gh-tool set-status <label> # change issue workflow status label
76
85
  ```
77
86
 
87
+ **Status labels:** use `mcp-coder gh-tool set-status` to change issue workflow status — never use raw `gh issue edit` with label flags.
88
+
78
89
  **Before every commit:** run `mcp__tools-py__run_format_code`, then stage and commit.
79
90
 
80
91
  **Bash discipline:** no `cd` prefix. Don't chain approved with unapproved commands. Run them separately.
@@ -15,7 +15,7 @@ Quick reference for refactoring rules and tools. For detailed process, examples,
15
15
  1. Plan target structure
16
16
  2. Move source code — `move_symbol` / `move_module`
17
17
  3. Move tests to mirror new structure
18
- 4. Review diff — `mcp-coder git-tool compact-diff` (remaining diff should be imports only)
18
+ 4. Review diff — `mcp__workspace__git_diff` (remaining diff should be imports only)
19
19
  5. Run all checks — pytest, pylint, mypy, ruff
20
20
  6. Check file sizes — `mcp-coder check file-size --max-lines 750`
21
21
 
@@ -1,30 +1,16 @@
1
1
  {
2
2
  "permissions": {
3
3
  "allow": [
4
- "mcp__tools-py__run_pylint_check",
5
- "mcp__tools-py__run_pytest_check",
6
- "mcp__tools-py__run_mypy_check",
7
- "mcp__workspace__get_reference_projects",
8
- "mcp__workspace__list_reference_directory",
9
- "mcp__workspace__read_reference_file",
10
- "mcp__workspace__list_directory",
11
- "mcp__workspace__read_file",
12
- "mcp__workspace__save_file",
13
- "mcp__workspace__append_file",
14
- "mcp__workspace__delete_this_file",
15
- "mcp__workspace__move_file",
16
- "mcp__workspace__edit_file",
17
- "Bash(git diff:*)",
18
- "Bash(gh run view:*)",
19
- "Bash(gh issue view:*)",
20
- "Bash(./tools/tach_check.sh:*)",
21
- "Bash(tach check:*)",
22
- "Bash(start docs/architecture/dependency_graph.html)",
23
- "Bash(./tools/pycycle_check.sh:*)",
24
- "Bash(python -m pytest:*)",
25
4
  "Bash(./tools/ruff_check.sh:*)",
5
+ "Bash(git checkout:*)",
6
+ "Bash(git pull:*)",
7
+ "Bash(mcp-coder gh-tool:*)",
8
+ "Bash(mcp-coder git-tool:*)",
9
+ "Bash(start docs/architecture/dependency_graph.html)",
10
+ "Skill(check_branch_status)",
26
11
  "Skill(commit_push)",
27
12
  "Skill(discuss)",
13
+ "Skill(implement_direct)",
28
14
  "Skill(implementation_approve)",
29
15
  "Skill(implementation_finalise)",
30
16
  "Skill(implementation_needs_rework)",
@@ -34,37 +20,58 @@
34
20
  "Skill(issue_analyse)",
35
21
  "Skill(issue_approve)",
36
22
  "Skill(issue_create)",
23
+ "Skill(issue_requirements)",
37
24
  "Skill(issue_update)",
38
25
  "Skill(plan_approve)",
39
26
  "Skill(plan_review)",
40
27
  "Skill(plan_review_supervisor)",
41
28
  "Skill(plan_update)",
42
29
  "Skill(rebase)",
43
- "Bash(find:*)",
44
- "Bash(git status:*)",
45
- "Bash(git log:*)",
46
- "Bash(git fetch:*)",
47
- "Bash(mcp-coder check file-size:*)",
48
- "Bash(mcp-coder check branch-status:*)",
49
- "Skill(check_branch_status)",
50
- "Skill(implement_direct)",
51
- "Skill(issue_requirements)",
52
30
  "WebFetch(domain:*)",
53
- "Bash(mcp-coder gh-tool:*)",
54
- "Bash(git ls-tree:*)",
55
- "Bash(mcp-coder git-tool:*)",
56
- "Bash(ruff rule:*)",
57
- "Bash(ruff check:*)",
58
- "mcp__tools-py__list_symbols",
31
+ "mcp__obsidian-wiki__add-tags",
32
+ "mcp__obsidian-wiki__create-directory",
33
+ "mcp__obsidian-wiki__create-note",
34
+ "mcp__obsidian-wiki__delete-note",
35
+ "mcp__obsidian-wiki__edit-note",
36
+ "mcp__obsidian-wiki__list-available-vaults",
37
+ "mcp__obsidian-wiki__move-note",
38
+ "mcp__obsidian-wiki__read-note",
39
+ "mcp__obsidian-wiki__remove-tags",
40
+ "mcp__obsidian-wiki__rename-tag",
41
+ "mcp__obsidian-wiki__search-vault",
59
42
  "mcp__tools-py__find_references",
43
+ "mcp__tools-py__get_library_source",
44
+ "mcp__tools-py__list_symbols",
45
+ "mcp__tools-py__move_module",
60
46
  "mcp__tools-py__move_symbol",
61
47
  "mcp__tools-py__rename_symbol",
62
- "mcp__tools-py__move_module",
63
48
  "mcp__tools-py__run_format_code",
64
49
  "mcp__tools-py__run_lint_imports_check",
50
+ "mcp__tools-py__run_mypy_check",
51
+ "mcp__tools-py__run_pylint_check",
52
+ "mcp__tools-py__run_pytest_check",
53
+ "mcp__tools-py__run_ruff_check",
65
54
  "mcp__tools-py__run_vulture_check",
66
- "mcp__tools-py__get_library_source",
67
- "mcp__workspace__search_files"
55
+ "mcp__workspace__append_file",
56
+ "mcp__workspace__check_branch_status",
57
+ "mcp__workspace__check_file_size",
58
+ "mcp__workspace__delete_this_file",
59
+ "mcp__workspace__edit_file",
60
+ "mcp__workspace__get_base_branch",
61
+ "mcp__workspace__get_reference_projects",
62
+ "mcp__workspace__git",
63
+ "mcp__workspace__github_issue_list",
64
+ "mcp__workspace__github_issue_view",
65
+ "mcp__workspace__github_pr_view",
66
+ "mcp__workspace__github_search",
67
+ "mcp__workspace__list_directory",
68
+ "mcp__workspace__list_reference_directory",
69
+ "mcp__workspace__move_file",
70
+ "mcp__workspace__read_file",
71
+ "mcp__workspace__read_reference_file",
72
+ "mcp__workspace__save_file",
73
+ "mcp__workspace__search_files",
74
+ "mcp__workspace__search_reference_files"
68
75
  ]
69
76
  },
70
77
  "enableAllProjectMcpServers": true,
@@ -2,16 +2,14 @@
2
2
  description: Format code, review changes, commit, and push to remote
3
3
  disable-model-invocation: true
4
4
  allowed-tools:
5
- - "Bash(git status *)"
6
- - "Bash(git diff *)"
5
+ - mcp__workspace__git
7
6
  - "Bash(git add *)"
8
7
  - "Bash(git commit *)"
9
8
  - "Bash(git push *)"
10
- - "Bash(git log *)"
11
9
  - mcp__tools-py__run_format_code
12
- - Read
13
- - Glob
14
- - Grep
10
+ - mcp__workspace__read_file
11
+ - mcp__workspace__list_directory
12
+ - mcp__workspace__search_files
15
13
  ---
16
14
 
17
15
  # Commit and Push Changes
@@ -22,10 +20,8 @@ Follow this process to commit and push your changes:
22
20
  Use `mcp__tools-py__run_format_code` to format all code (black + isort).
23
21
 
24
22
  ## 2. Review Changes
25
- ```bash
26
- git status
27
- git diff
28
- ```
23
+ Use `mcp__workspace__git` with command `"status"` to check working directory state.
24
+ Use `mcp__workspace__git` with command `"diff"` to review the changes.
29
25
 
30
26
  ## 3. Stage Changes
31
27
  Stage all relevant changes (exclude any files that shouldn't be committed).
@@ -3,7 +3,7 @@ name: implement-direct
3
3
  disable-model-invocation: true
4
4
  argument-hint: [issue-number]
5
5
  allowed-tools:
6
- - "Bash(gh issue view *)"
6
+ - mcp__workspace__github_issue_view
7
7
  - "Bash(mcp-coder gh-tool *)"
8
8
  - mcp__workspace__read_file
9
9
  - mcp__tools-py__run_format_code
@@ -23,9 +23,7 @@ If no issue number is provided:
23
23
  ## Steps
24
24
 
25
25
  1. **Fetch issue details**
26
- ```bash
27
- gh issue view <issue_number>
28
- ```
26
+ Use `mcp__workspace__github_issue_view` to fetch the issue details.
29
27
  Read the issue title, description, and acceptance criteria carefully.
30
28
 
31
29
  2. **Checkout/create issue branch**
@@ -2,25 +2,19 @@
2
2
  description: Code review of implementation with compact diff analysis
3
3
  disable-model-invocation: true
4
4
  allowed-tools:
5
- - "Bash(git fetch *)"
6
- - "Bash(git status *)"
7
- - "Bash(git diff *)"
8
- - "Bash(mcp-coder git-tool *)"
9
- - "Bash(mcp-coder check branch-status *)"
5
+ - mcp__workspace__git
6
+ - mcp__workspace__check_branch_status
10
7
  - mcp__workspace__read_file
11
8
  - mcp__workspace__list_directory
12
- - Glob
13
- - Grep
9
+ - mcp__workspace__search_files
14
10
  ---
15
11
 
16
12
  # Implementation Review (Code Review)
17
13
 
18
14
  **First, ensure we're up to date:**
19
- ```bash
20
- git fetch
21
- git status
22
- mcp-coder check branch-status --llm-truncate
23
- ```
15
+ Call `mcp__workspace__git` with command `"fetch"` and args `["origin"]`.
16
+ Use `mcp__workspace__git` with command `"status"` to check working directory state.
17
+ Call `mcp__workspace__check_branch_status`.
24
18
 
25
19
  Confirm and display the current feature branch name.
26
20
 
@@ -30,10 +24,7 @@ Confirm and display the current feature branch name.
30
24
 
31
25
  ## Code Review Request
32
26
 
33
- Run this command to get the changes to review:
34
- ```bash
35
- mcp-coder git-tool compact-diff
36
- ```
27
+ Use `mcp__workspace__git` with command `"diff"` to get the changes to review.
37
28
 
38
29
  No need to run all checks; do not use pylint warnings. Feel free to further analyse any mentioned files and/or the file structure.
39
30
 
@@ -2,9 +2,9 @@
2
2
  description: Autonomous code review — supervisor delegates to engineer subagents with knowledge base
3
3
  disable-model-invocation: true
4
4
  allowed-tools:
5
- - "Bash(gh issue view *)"
6
- - "Bash(mcp-coder git-tool *)"
7
- - "Bash(mcp-coder check branch-status *)"
5
+ - mcp__workspace__github_issue_view
6
+ - mcp__workspace__check_branch_status
7
+ - mcp__workspace__git
8
8
  - mcp__workspace__read_file
9
9
  - mcp__workspace__save_file
10
10
  - mcp__workspace__edit_file
@@ -20,7 +20,7 @@ You are a technical lead supervising a software engineer (subagent). You do not
20
20
 
21
21
  **Setup:**
22
22
 
23
- 1. Read the GitHub issue (`gh issue view` using the branch name), `pr_info/steps/summary.md`, and `pr_info/steps/Decisions.md` (if it exists) to understand requirements and design decisions.
23
+ 1. Read the GitHub issue (call `mcp__workspace__github_issue_view` with the issue number from the branch name), `pr_info/steps/summary.md`, and `pr_info/steps/Decisions.md` (if it exists) to understand requirements and design decisions.
24
24
  2. Read the knowledge base files:
25
25
  - `.claude/knowledge_base/software_engineering_principles.md`
26
26
  - `.claude/knowledge_base/python.md`
@@ -3,8 +3,8 @@ description: Analyse GitHub issue requirements, feasibility, and implementation
3
3
  disable-model-invocation: true
4
4
  argument-hint: "<issue-number>"
5
5
  allowed-tools:
6
- - "Bash(gh issue view *)"
7
- - "Bash(git ls-remote *)"
6
+ - mcp__workspace__github_issue_view
7
+ - mcp__workspace__git
8
8
  - mcp__workspace__read_file
9
9
  - mcp__workspace__list_directory
10
10
  ---
@@ -20,10 +20,7 @@ If no issue number is provided:
20
20
  1. Read `.vscodeclaude_status.txt` and extract the issue number from the `Issue #NNN` line
21
21
  2. If the file doesn't exist or has no issue number, ask the user
22
22
 
23
- Fetch the issue:
24
- ```bash
25
- gh issue view <issue_number>
26
- ```
23
+ Fetch the issue using `mcp__workspace__github_issue_view`.
27
24
 
28
25
  ## Instructions
29
26
 
@@ -46,7 +43,7 @@ During the discussion, actively identify constraints and rationale — the "why"
46
43
  **Base Branch Handling:**
47
44
  If the issue contains a `### Base Branch` section:
48
45
  - Display the specified base branch prominently
49
- - Verify the branch exists using: `git ls-remote --heads origin <branch-name>`
46
+ - Verify the branch exists using `mcp__workspace__git` with command `"ls_remote"` and args `["--heads", "origin", "<branch-name>"]`
50
47
  - If the branch does NOT exist, show a clear warning:
51
48
  "Warning: Base branch 'X' does not exist on remote. Branch creation will fail."
52
49
  - Continue with the analysis (non-blocking error)
@@ -3,7 +3,7 @@ description: Approve issue to transition to next workflow status
3
3
  disable-model-invocation: true
4
4
  argument-hint: "<issue-number>"
5
5
  allowed-tools:
6
- - "Bash(gh issue view *)"
6
+ - mcp__workspace__github_issue_view
7
7
  - "Bash(gh issue comment *)"
8
8
  - "Bash(MSYS_NO_PATHCONV=1 gh issue comment *)"
9
9
  - mcp__workspace__read_file
@@ -23,10 +23,7 @@ If no issue number is provided:
23
23
 
24
24
  ## Instructions
25
25
 
26
- 1. Fetch the issue to confirm it exists:
27
- ```bash
28
- gh issue view <issue_number>
29
- ```
26
+ 1. Fetch the issue to confirm it exists using `mcp__workspace__github_issue_view`.
30
27
 
31
28
  2. Validate that the issue is ready for approval:
32
29
  - Issue has been analyzed/discussed
@@ -4,7 +4,7 @@ disable-model-invocation: true
4
4
  argument-hint: "<title>"
5
5
  allowed-tools:
6
6
  - "Bash(gh issue create *)"
7
- - "Bash(git ls-remote *)"
7
+ - mcp__workspace__git
8
8
  ---
9
9
 
10
10
  # Create GitHub Issue
@@ -31,10 +31,7 @@ Use cases:
31
31
  - Features building on existing work
32
32
  - Long-running feature branches
33
33
 
34
- **Important:** Before specifying a base branch, verify it exists:
35
- ```bash
36
- git ls-remote --heads origin <branch-name>
37
- ```
34
+ **Important:** Before specifying a base branch, verify it exists using `mcp__workspace__git` with command `"ls_remote"` and args `["--heads", "origin", "<branch-name>"]`.
38
35
 
39
36
  If no base branch is needed, omit this section entirely.
40
37
 
@@ -4,12 +4,12 @@ disable-model-invocation: true
4
4
  argument-hint: "<issue-number>"
5
5
  allowed-tools:
6
6
  - "Bash(gh issue edit *)"
7
- - "Bash(gh issue view *)"
7
+ - mcp__workspace__github_issue_view
8
8
  - mcp__workspace__save_file
9
9
  - mcp__workspace__delete_this_file
10
- - Read
11
- - Glob
12
- - Grep
10
+ - mcp__workspace__read_file
11
+ - mcp__workspace__list_directory
12
+ - mcp__workspace__search_files
13
13
  ---
14
14
 
15
15
  # Update GitHub Issue
@@ -19,10 +19,7 @@ Based on our prior `/issue_analyse` discussion, update the GitHub issue with ref
19
19
  **Instructions:**
20
20
  1. If no issue context is found from prior analysis, respond: "No issue context found. Please run `/issue_analyse <number>` first."
21
21
 
22
- 2. First, fetch the current issue content:
23
- ```bash
24
- gh issue view <issue_number> --json title,body
25
- ```
22
+ 2. First, fetch the current issue content using `mcp__workspace__github_issue_view`.
26
23
 
27
24
  3. Draft updated issue text with:
28
25
  - Clear, concise title
@@ -2,21 +2,17 @@
2
2
  description: Review implementation plan for completeness, simplicity, and risks
3
3
  disable-model-invocation: true
4
4
  allowed-tools:
5
- - "Bash(git fetch *)"
6
- - "Bash(git status *)"
5
+ - mcp__workspace__git
7
6
  - mcp__workspace__read_file
8
7
  - mcp__workspace__list_directory
9
- - Glob
10
- - Grep
8
+ - mcp__workspace__search_files
11
9
  ---
12
10
 
13
11
  # Review Implementation Plan
14
12
 
15
13
  **First, ensure we're up to date:**
16
- ```bash
17
- git fetch
18
- git status
19
- ```
14
+ Call `mcp__workspace__git` with command `"fetch"` and args `["origin"]`.
15
+ Use `mcp__workspace__git` with command `"status"` to check working directory state.
20
16
 
21
17
  Confirm and display the current feature branch name.
22
18
 
@@ -2,7 +2,7 @@
2
2
  description: Autonomous plan review — supervisor delegates to engineer subagents
3
3
  disable-model-invocation: true
4
4
  allowed-tools:
5
- - "Bash(gh issue view *)"
5
+ - mcp__workspace__github_issue_view
6
6
  - mcp__workspace__read_file
7
7
  - mcp__workspace__save_file
8
8
  - mcp__workspace__edit_file
@@ -18,7 +18,7 @@ You are a technical lead supervising a software engineer (subagent). You do not
18
18
 
19
19
  **Setup:**
20
20
 
21
- 1. Read the GitHub issue (`gh issue view` using the branch name), `pr_info/steps/summary.md`, and `pr_info/steps/Decisions.md` (if it exists) to understand requirements and design decisions.
21
+ 1. Read the GitHub issue (using `mcp__workspace__github_issue_view`), `pr_info/steps/summary.md`, and `pr_info/steps/Decisions.md` (if it exists) to understand requirements and design decisions.
22
22
  2. Read the knowledge base files:
23
23
  - `.claude/knowledge_base/software_engineering_principles.md`
24
24
  - `.claude/knowledge_base/planning_principles.md`
@@ -2,11 +2,7 @@
2
2
  description: Rebase feature branch onto base branch with conflict resolution
3
3
  disable-model-invocation: true
4
4
  allowed-tools:
5
- - "Bash(git status *)"
6
- - "Bash(git log *)"
7
- - "Bash(git branch *)"
8
- - "Bash(git ls-files *)"
9
- - "Bash(git fetch *)"
5
+ - mcp__workspace__git
10
6
  - "Bash(git rebase *)"
11
7
  - "Bash(git add *)"
12
8
  - "Bash(git rm *)"
@@ -17,12 +13,8 @@ allowed-tools:
17
13
  - "Bash(git restore *)"
18
14
  - "Bash(git stash *)"
19
15
  - "Bash(git push --force-with-lease *)"
20
- - "Bash(git diff *)"
21
- - "Bash(git rev-parse *)"
22
- - "Bash(gh run view *)"
23
- - "Bash(gh issue view *)"
24
16
  - mcp__tools-py__run_format_code
25
- - "Bash(mcp-coder gh-tool get-base-branch *)"
17
+ - mcp__workspace__get_base_branch
26
18
  - mcp__tools-py__run_pylint_check
27
19
  - mcp__tools-py__run_pytest_check
28
20
  - mcp__tools-py__run_mypy_check
@@ -38,10 +30,12 @@ allowed-tools:
38
30
  - mcp__workspace__move_file
39
31
  ---
40
32
 
41
- !`git status`
42
-
43
33
  # Rebase Branch onto Base Branch
44
34
 
35
+ ## First Step
36
+
37
+ Call `mcp__workspace__git` with command `"status"` before doing anything else.
38
+
45
39
  Rebase the current feature branch onto its base branch and resolve conflicts.
46
40
 
47
41
  **Core philosophy:** Main is the source of truth. The feature branch adapts to main. For source code conflicts, preserve main's improvements and rework the feature branch code to fit.
@@ -52,11 +46,7 @@ If the rebase becomes complex, suggest switching to cherry-picking as an alterna
52
46
 
53
47
  ## Determine Base Branch
54
48
 
55
- First, detect the correct base branch:
56
- ```bash
57
- BASE_BRANCH=$(mcp-coder gh-tool get-base-branch)
58
- echo "Rebasing onto: $BASE_BRANCH"
59
- ```
49
+ First, detect the correct base branch using `mcp__workspace__get_base_branch`.
60
50
 
61
51
  ## Base Branch Confirmation
62
52
 
@@ -72,7 +62,7 @@ If the base branch is not `main` or `master`, ask the user to confirm before pro
72
62
 
73
63
  ## Workflow
74
64
 
75
- 1. `git fetch origin`
65
+ 1. Call `mcp__workspace__git` with command `"fetch"` and args `["origin"]`
76
66
  2. `git rebase origin/${BASE_BRANCH}`
77
67
  3. For each conflict:
78
68
  - If file is under `pr_info/`: auto-resolve with `git checkout --theirs <file>` (keep feature branch version), then `git add <file>` — no user input needed
@@ -14,10 +14,13 @@ The slash command requires two sets of permissions in `allowed-tools`:
14
14
 
15
15
  These are the additional git permissions needed specifically for rebase operations:
16
16
 
17
+ **MCP tools:**
18
+ - `mcp__workspace__git_status`
19
+ - `mcp__workspace__git_log`
20
+
21
+ **Bash commands:**
17
22
  ```
18
- # Status and investigation
19
- Bash(git status:*)
20
- Bash(git log:*)
23
+ # Investigation
21
24
  Bash(git branch:*)
22
25
  Bash(git ls-files:*)
23
26
 
@@ -28,13 +28,13 @@
28
28
  "--log-level",
29
29
  "INFO",
30
30
  "--reference-project",
31
- "p_mcp_coder=${USERPROFILE}\\Documents\\GitHub\\mcp_coder",
31
+ "name=p_coder,path=${USERPROFILE}\\Documents\\GitHub\\mcp_coder,url=https://github.com/MarcusJellinghaus/mcp_coder",
32
32
  "--reference-project",
33
- "p_workspace=${USERPROFILE}\\Documents\\GitHub\\mcp-workspace",
33
+ "name=p_workspace,path=${USERPROFILE}\\Documents\\GitHub\\mcp-workspace,url=https://github.com/MarcusJellinghaus/mcp-workspace",
34
34
  "--reference-project",
35
- "p_config=${USERPROFILE}\\Documents\\GitHub\\mcp-config",
35
+ "name=p_config,path=${USERPROFILE}\\Documents\\GitHub\\mcp-config,url=https://github.com/MarcusJellinghaus/mcp-config",
36
36
  "--reference-project",
37
- "p_tools=${USERPROFILE}\\Documents\\GitHub\\mcp-tools-py"
37
+ "name=p_tools,path=${USERPROFILE}\\Documents\\GitHub\\mcp-tools-py,url=https://github.com/MarcusJellinghaus/mcp-tools-py"
38
38
  ],
39
39
  "env": {
40
40
  "PYTHONPATH": "${MCP_CODER_VENV_DIR}\\Lib\\"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mcp-coder-utils
3
- Version: 0.1.3
3
+ Version: 0.1.4
4
4
  Summary: Shared low-level Python helpers (subprocess, logging, fs) for the mcp-coder family of repos
5
5
  Author-email: Marcus Jellinghaus <Marcus@Jellinghaus.ch>
6
6
  Project-URL: Homepage, https://github.com/MarcusJellinghaus/mcp-coder-utils
@@ -17,6 +17,7 @@ Requires-Dist: structlog>=23.2.0
17
17
  Requires-Dist: python-json-logger>=3.3.0
18
18
  Provides-Extra: test
19
19
  Requires-Dist: pytest; extra == "test"
20
+ Requires-Dist: pytest-asyncio; extra == "test"
20
21
  Requires-Dist: pytest-xdist; extra == "test"
21
22
  Provides-Extra: dev
22
23
  Requires-Dist: mcp-coder-utils[test]; extra == "dev"
@@ -90,3 +90,8 @@ echo Project dir: !MCP_CODER_PROJECT_DIR!
90
90
  echo Venv dir: !MCP_CODER_VENV_DIR!
91
91
 
92
92
  C:\Users\%USERNAME%\.local\bin\claude.exe %*
93
+
94
+ REM Reset terminal state after Claude exits (workaround for dirty terminal bug)
95
+ REM See https://github.com/anthropics/claude-code/issues/38761
96
+ for /f %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
97
+ <nul set /p="!ESC![?2004l!ESC![?1l!ESC![?25h!ESC![J"
@@ -44,6 +44,11 @@ src/mcp_coder_utils/
44
44
  log_utils.py
45
45
  subprocess_runner.py
46
46
  subprocess_streaming.py
47
+ fs/
48
+ __init__.py
49
+ path_security.py
50
+ read_file.py
51
+ text.py
47
52
  ```
48
53
 
49
54
  ## Tests
@@ -25,6 +25,7 @@ dependencies = [
25
25
  [project.optional-dependencies]
26
26
  test = [
27
27
  "pytest",
28
+ "pytest-asyncio",
28
29
  "pytest-xdist",
29
30
  ]
30
31
 
@@ -60,6 +61,7 @@ where = ["src"]
60
61
  [tool.pytest.ini_options]
61
62
  testpaths = ["tests"]
62
63
  pythonpath = ["src"]
64
+ asyncio_mode = "auto"
63
65
  addopts = ["--strict-markers", "--tb=short", "-n", "auto"]
64
66
 
65
67
  [tool.black]
@@ -0,0 +1,10 @@
1
+ """Shared low-level Python helpers for the mcp-coder family of repos."""
2
+
3
+ from importlib.metadata import PackageNotFoundError, version
4
+
5
+ try:
6
+ __version__ = version("mcp-coder-utils")
7
+ except PackageNotFoundError:
8
+ __version__ = "0.0.0.dev0"
9
+
10
+ __all__ = ["__version__"]
@@ -0,0 +1,11 @@
1
+ """Filesystem helpers — encoding, line-endings, path security."""
2
+
3
+ from mcp_coder_utils.fs.path_security import normalize_path
4
+ from mcp_coder_utils.fs.read_file import read_file
5
+ from mcp_coder_utils.fs.text import normalize_line_endings
6
+
7
+ __all__ = [
8
+ "normalize_line_endings",
9
+ "normalize_path",
10
+ "read_file",
11
+ ]