devloop 0.6.0__tar.gz → 0.6.2__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 (147) hide show
  1. {devloop-0.6.0 → devloop-0.6.2}/PKG-INFO +10 -10
  2. {devloop-0.6.0 → devloop-0.6.2}/README.md +9 -9
  3. {devloop-0.6.0 → devloop-0.6.2}/pyproject.toml +1 -1
  4. devloop-0.6.2/src/devloop/cli/templates/git_hooks/post-commit +99 -0
  5. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/tool_runner.py +2 -2
  6. {devloop-0.6.0 → devloop-0.6.2}/LICENSE +0 -0
  7. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/__init__.py +0 -0
  8. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/__init__.py +0 -0
  9. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/agent_health_monitor.py +0 -0
  10. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/ci_monitor.py +0 -0
  11. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/code_rabbit.py +0 -0
  12. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/doc_lifecycle.py +0 -0
  13. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/echo.py +0 -0
  14. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/file_logger.py +0 -0
  15. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/formatter.py +0 -0
  16. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/git_commit_assistant.py +0 -0
  17. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/linter.py +0 -0
  18. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/performance_profiler.py +0 -0
  19. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/sandbox_helper.py +0 -0
  20. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/security_scanner.py +0 -0
  21. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/snyk.py +0 -0
  22. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/test_runner.py +0 -0
  23. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/agents/type_checker.py +0 -0
  24. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/__init__.py +0 -0
  25. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/agent_rules.py +0 -0
  26. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/commands/__init__.py +0 -0
  27. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/commands/agent_publish.py +0 -0
  28. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/commands/audit.py +0 -0
  29. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/commands/custom_agents.py +0 -0
  30. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/commands/feedback.py +0 -0
  31. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/commands/marketplace.py +0 -0
  32. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/commands/marketplace_server.py +0 -0
  33. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/commands/metrics.py +0 -0
  34. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/commands/release.py +0 -0
  35. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/commands/summary.py +0 -0
  36. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/commands/telemetry.py +0 -0
  37. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/commands/tools.py +0 -0
  38. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/main.py +0 -0
  39. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/main_v1.py +0 -0
  40. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/pre_push_check.py +0 -0
  41. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/prerequisites.py +0 -0
  42. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/pyodide_installer.py +0 -0
  43. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/templates/.devloop/tools-registry.json +0 -0
  44. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/templates/claude_commands/README.md +0 -0
  45. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/templates/claude_commands/agent-summary.md +0 -0
  46. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/templates/claude_commands/devloop-findings.md +0 -0
  47. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/templates/claude_commands/devloop-status.md +0 -0
  48. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/templates/claude_commands/extract-findings.md +0 -0
  49. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/templates/claude_commands/verify-work.md +0 -0
  50. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/templates/devloop_agents_template.md +0 -0
  51. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/templates/git_hooks/pre-commit +0 -0
  52. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/templates/git_hooks/pre-commit-checks +0 -0
  53. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/templates/git_hooks/pre-push +0 -0
  54. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/templates/supervisor/devloop.conf +0 -0
  55. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/cli/templates/systemd/devloop.service +0 -0
  56. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/collectors/__init__.py +0 -0
  57. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/collectors/base.py +0 -0
  58. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/collectors/filesystem.py +0 -0
  59. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/collectors/git.py +0 -0
  60. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/collectors/manager.py +0 -0
  61. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/collectors/process.py +0 -0
  62. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/collectors/system.py +0 -0
  63. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/__init__.py +0 -0
  64. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/action_logger.py +0 -0
  65. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/agent.py +0 -0
  66. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/agent_audit_logger.py +0 -0
  67. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/agent_template.py +0 -0
  68. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/amp_integration.py +0 -0
  69. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/amp_thread_mapper.py +0 -0
  70. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/auto_fix.py +0 -0
  71. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/backup_manager.py +0 -0
  72. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/claude_adapter.py +0 -0
  73. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/config.py +0 -0
  74. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/config_schema.py +0 -0
  75. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/context.py +0 -0
  76. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/context_store.py +0 -0
  77. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/contextual_feedback.py +0 -0
  78. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/custom_agent.py +0 -0
  79. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/daemon_health.py +0 -0
  80. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/debug_trace.py +0 -0
  81. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/error_handler.py +0 -0
  82. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/error_notifier.py +0 -0
  83. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/event.py +0 -0
  84. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/event_replayer.py +0 -0
  85. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/event_store.py +0 -0
  86. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/feedback.py +0 -0
  87. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/file_lock_manager.py +0 -0
  88. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/learning.py +0 -0
  89. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/manager.py +0 -0
  90. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/operational_health.py +0 -0
  91. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/pattern_analyzer.py +0 -0
  92. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/pattern_detector.py +0 -0
  93. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/performance.py +0 -0
  94. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/proactive_feedback.py +0 -0
  95. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/summary_formatter.py +0 -0
  96. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/summary_generator.py +0 -0
  97. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/telemetry.py +0 -0
  98. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/tool_dependencies.py +0 -0
  99. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/tool_registry.py +0 -0
  100. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/core/transactional_io.py +0 -0
  101. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/integrations/__init__.py +0 -0
  102. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/integrations/beads_integration.py +0 -0
  103. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/lsp/__init__.py +0 -0
  104. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/lsp/__main__.py +0 -0
  105. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/lsp/mapper.py +0 -0
  106. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/lsp/server.py +0 -0
  107. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/marketplace/__init__.py +0 -0
  108. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/marketplace/api.py +0 -0
  109. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/marketplace/cache.py +0 -0
  110. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/marketplace/http_server.py +0 -0
  111. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/marketplace/installer.py +0 -0
  112. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/marketplace/metadata.py +0 -0
  113. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/marketplace/publisher.py +0 -0
  114. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/marketplace/registry.py +0 -0
  115. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/marketplace/registry_client.py +0 -0
  116. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/marketplace/reviews.py +0 -0
  117. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/marketplace/search.py +0 -0
  118. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/marketplace/signing.py +0 -0
  119. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/metrics/__init__.py +0 -0
  120. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/metrics/dora.py +0 -0
  121. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/metrics/value_metrics.py +0 -0
  122. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/providers/__init__.py +0 -0
  123. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/providers/artifactory_registry.py +0 -0
  124. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/providers/ci_provider.py +0 -0
  125. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/providers/circleci_provider.py +0 -0
  126. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/providers/github_actions_provider.py +0 -0
  127. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/providers/gitlab_ci_provider.py +0 -0
  128. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/providers/jenkins_provider.py +0 -0
  129. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/providers/provider_manager.py +0 -0
  130. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/providers/pypi_registry.py +0 -0
  131. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/providers/registry_provider.py +0 -0
  132. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/release/__init__.py +0 -0
  133. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/release/release_manager.py +0 -0
  134. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/security/__init__.py +0 -0
  135. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/security/audit_logger.py +0 -0
  136. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/security/bubblewrap_sandbox.py +0 -0
  137. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/security/cgroups_helper.py +0 -0
  138. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/security/factory.py +0 -0
  139. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/security/no_sandbox.py +0 -0
  140. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/security/package.json +0 -0
  141. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/security/path_validator.py +0 -0
  142. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/security/pyodide_runner.js +0 -0
  143. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/security/pyodide_sandbox.py +0 -0
  144. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/security/sandbox.py +0 -0
  145. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/security/token_manager.py +0 -0
  146. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/telemetry/__init__.py +0 -0
  147. {devloop-0.6.0 → devloop-0.6.2}/src/devloop/telemetry/telemetry_manager.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devloop
3
- Version: 0.6.0
3
+ Version: 0.6.2
4
4
  Summary: Intelligent background agents for development workflow automation
5
5
  License: MIT
6
6
  License-File: LICENSE
@@ -536,7 +536,7 @@ config = (
536
536
  )
537
537
  ```
538
538
 
539
- [View agent documentation →](./docs/agents.md)
539
+ [View agent architecture and categories →](./ARCHITECTURE.md)
540
540
 
541
541
  ---
542
542
 
@@ -1331,7 +1331,7 @@ poetry run mypy src
1331
1331
  ### Marketplace
1332
1332
  - **[Marketplace Guide](./docs/MARKETPLACE_GUIDE.md)** — Discovering, installing, and publishing agents
1333
1333
  - **[Marketplace API Guide](./docs/MARKETPLACE_API.md)** — Agent registry API reference
1334
- - **[Agent Reference](./docs/agents.md)** — Built-in agents documentation
1334
+ - **[Agent Reference](./ARCHITECTURE.md)** — Agent categories and architecture
1335
1335
 
1336
1336
  ### Advanced
1337
1337
  - **[Development Guide](./docs/development.md)** — Contributing guide
@@ -1344,14 +1344,14 @@ poetry run mypy src
1344
1344
 
1345
1345
  DevLoop follows these core principles:
1346
1346
 
1347
- ✅ **Non-Intrusive** — Runs in background without blocking workflow
1348
- ✅ **Event-Driven** — All actions triggered by observable events
1349
- ✅ **Configurable** — Fine-grained control over agent behavior
1350
- ✅ **Context-Aware** — Understands your project structure
1351
- ✅ **Parallel** — Multiple agents run concurrently
1352
- ✅ **Lightweight** — Respects system resources
1347
+ ✅ **Non-Intrusive** — Runs in background without blocking workflow
1348
+ ✅ **Event-Driven** — All actions triggered by observable events
1349
+ ✅ **Configurable** — Fine-grained control over agent behavior
1350
+ ✅ **Context-Aware** — Understands your project structure
1351
+ ✅ **Parallel** — Multiple agents run concurrently
1352
+ ✅ **Lightweight** — Respects system resources
1353
1353
 
1354
- [Read the full design spec →](./AGENTS.md)
1354
+ [Read the AI agent workflow guide →](./AGENTS.md) | [System architecture →](./ARCHITECTURE.md)
1355
1355
 
1356
1356
  ---
1357
1357
 
@@ -495,7 +495,7 @@ config = (
495
495
  )
496
496
  ```
497
497
 
498
- [View agent documentation →](./docs/agents.md)
498
+ [View agent architecture and categories →](./ARCHITECTURE.md)
499
499
 
500
500
  ---
501
501
 
@@ -1290,7 +1290,7 @@ poetry run mypy src
1290
1290
  ### Marketplace
1291
1291
  - **[Marketplace Guide](./docs/MARKETPLACE_GUIDE.md)** — Discovering, installing, and publishing agents
1292
1292
  - **[Marketplace API Guide](./docs/MARKETPLACE_API.md)** — Agent registry API reference
1293
- - **[Agent Reference](./docs/agents.md)** — Built-in agents documentation
1293
+ - **[Agent Reference](./ARCHITECTURE.md)** — Agent categories and architecture
1294
1294
 
1295
1295
  ### Advanced
1296
1296
  - **[Development Guide](./docs/development.md)** — Contributing guide
@@ -1303,14 +1303,14 @@ poetry run mypy src
1303
1303
 
1304
1304
  DevLoop follows these core principles:
1305
1305
 
1306
- ✅ **Non-Intrusive** — Runs in background without blocking workflow
1307
- ✅ **Event-Driven** — All actions triggered by observable events
1308
- ✅ **Configurable** — Fine-grained control over agent behavior
1309
- ✅ **Context-Aware** — Understands your project structure
1310
- ✅ **Parallel** — Multiple agents run concurrently
1311
- ✅ **Lightweight** — Respects system resources
1306
+ ✅ **Non-Intrusive** — Runs in background without blocking workflow
1307
+ ✅ **Event-Driven** — All actions triggered by observable events
1308
+ ✅ **Configurable** — Fine-grained control over agent behavior
1309
+ ✅ **Context-Aware** — Understands your project structure
1310
+ ✅ **Parallel** — Multiple agents run concurrently
1311
+ ✅ **Lightweight** — Respects system resources
1312
1312
 
1313
- [Read the full design spec →](./AGENTS.md)
1313
+ [Read the AI agent workflow guide →](./AGENTS.md) | [System architecture →](./ARCHITECTURE.md)
1314
1314
 
1315
1315
  ---
1316
1316
 
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "devloop"
3
- version = "0.6.0"
3
+ version = "0.6.2"
4
4
  description = "Intelligent background agents for development workflow automation"
5
5
  authors = ["DevLoop Contributors <devloop@example.com>"]
6
6
  license = "MIT"
@@ -0,0 +1,99 @@
1
+ #!/bin/sh
2
+ #
3
+ # Post-commit hook: Auto-close Beads issues on commit
4
+ #
5
+ # This hook automatically closes Beads issues referenced in commit messages.
6
+ #
7
+ # Supported commit message patterns:
8
+ # - "fixes claude-agents-abc123"
9
+ # - "closes claude-agents-abc123"
10
+ # - "resolves claude-agents-abc123"
11
+ # - Multiple issues: "fixes claude-agents-abc123, claude-agents-def456"
12
+ #
13
+ # The hook will:
14
+ # 1. Parse the commit message for issue references
15
+ # 2. Close each referenced issue with commit SHA and message as reason
16
+ # 3. Exit silently if bd is not available
17
+ # 4. Exit silently if no issues are referenced
18
+
19
+ set -e
20
+
21
+ # Check if bd is available
22
+ if ! command -v bd >/dev/null 2>&1; then
23
+ exit 0
24
+ fi
25
+
26
+ # Check if we're in a bd workspace
27
+ if [ ! -d .beads ]; then
28
+ exit 0
29
+ fi
30
+
31
+ # Get the commit SHA and message
32
+ COMMIT_SHA=$(git rev-parse HEAD)
33
+ COMMIT_SHA_SHORT=$(git rev-parse --short HEAD)
34
+ COMMIT_MSG=$(git log -1 --pretty=%B)
35
+
36
+ # Extract issue IDs from commit message
37
+ # Pattern: (fixes|closes|resolves) (claude-agents-[a-z0-9]+|#\d+)
38
+ # Examples: "fixes claude-agents-abc123" or "closes #42"
39
+
40
+ # Helper function to parse and close issues
41
+ parse_and_close_issues() {
42
+ local msg="$1"
43
+ local sha="$2"
44
+ local sha_short="$3"
45
+
46
+ # Convert message to lowercase for case-insensitive matching
47
+ local lower_msg=$(echo "$msg" | tr '[:upper:]' '[:lower:]')
48
+
49
+ # Extract all issue references after fixes/closes/resolves keywords
50
+ # This regex looks for the keywords followed by issue IDs
51
+ local matches=$(echo "$lower_msg" | grep -oE '(fixes|closes|resolves)[[:space:]]+(claude-agents-[a-z0-9]+|#[0-9]+)' || true)
52
+
53
+ if [ -z "$matches" ]; then
54
+ return
55
+ fi
56
+
57
+ # Process each match and extract the issue ID
58
+ echo "$matches" | while read -r line; do
59
+ # Extract just the issue ID part (everything after the keyword and space)
60
+ local issue_id=$(echo "$line" | sed 's/^[^ ]* //')
61
+
62
+ if [ -n "$issue_id" ]; then
63
+ close_issue "$issue_id" "$sha" "$sha_short" "$msg"
64
+ fi
65
+ done
66
+ }
67
+
68
+ # Helper function to close a single issue
69
+ close_issue() {
70
+ local issue_id="$1"
71
+ local sha="$2"
72
+ local sha_short="$3"
73
+ local msg="$4"
74
+
75
+ # Clean up the issue ID (remove leading # if present)
76
+ issue_id=$(echo "$issue_id" | sed 's/^#//')
77
+
78
+ # Construct the reason string
79
+ local reason="Completed in commit $sha_short: $msg"
80
+
81
+ # Limit reason length to avoid overly long strings
82
+ if [ ${#reason} -gt 200 ]; then
83
+ reason="Completed in commit $sha_short"
84
+ fi
85
+
86
+ # Attempt to close the issue
87
+ if bd close "$issue_id" --reason "$reason" >/dev/null 2>&1; then
88
+ echo "✓ Closed $issue_id"
89
+ else
90
+ # Issue may not exist or may already be closed - don't fail the commit
91
+ # Silently continue
92
+ :
93
+ fi
94
+ }
95
+
96
+ # Parse and close issues from the commit message
97
+ parse_and_close_issues "$COMMIT_MSG" "$COMMIT_SHA" "$COMMIT_SHA_SHORT"
98
+
99
+ exit 0
@@ -3,6 +3,7 @@ Tool Runner - Execute tools from the tool registry with error handling.
3
3
  """
4
4
 
5
5
  import logging
6
+ import shlex
6
7
  import subprocess
7
8
  from dataclasses import dataclass
8
9
  from pathlib import Path
@@ -270,8 +271,7 @@ class ToolRunner:
270
271
 
271
272
  try:
272
273
  result = subprocess.run(
273
- fix_cmd,
274
- shell=True,
274
+ shlex.split(fix_cmd),
275
275
  cwd=str(self.cwd),
276
276
  capture_output=True,
277
277
  text=True,
File without changes
File without changes
File without changes