codeforge-dev 1.12.0 → 1.14.1

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 (226) hide show
  1. package/.devcontainer/CHANGELOG.md +175 -2
  2. package/.devcontainer/CLAUDE.md +61 -268
  3. package/.devcontainer/README.md +17 -9
  4. package/.devcontainer/config/defaults/ccstatusline-settings.json +147 -0
  5. package/.devcontainer/config/defaults/main-system-prompt.md +6 -1
  6. package/.devcontainer/config/defaults/rules/spec-workflow.md +1 -55
  7. package/.devcontainer/config/defaults/rules/workspace-scope.md +13 -4
  8. package/.devcontainer/config/defaults/settings.json +5 -3
  9. package/.devcontainer/config/file-manifest.json +14 -0
  10. package/.devcontainer/devcontainer.json +32 -7
  11. package/.devcontainer/docs/optional-features.md +0 -65
  12. package/.devcontainer/docs/plugins.md +38 -23
  13. package/.devcontainer/features/ast-grep/devcontainer-feature.json +0 -1
  14. package/.devcontainer/features/biome/install.sh +13 -0
  15. package/.devcontainer/features/ccburn/devcontainer-feature.json +0 -1
  16. package/.devcontainer/features/ccms/devcontainer-feature.json +0 -1
  17. package/.devcontainer/features/ccms/install.sh +1 -1
  18. package/.devcontainer/features/ccstatusline/devcontainer-feature.json +0 -1
  19. package/.devcontainer/features/ccstatusline/install.sh +17 -115
  20. package/.devcontainer/features/ccusage/devcontainer-feature.json +0 -1
  21. package/.devcontainer/features/chromaterm/README.md +42 -0
  22. package/.devcontainer/features/chromaterm/chromaterm.yml +35 -0
  23. package/.devcontainer/features/chromaterm/devcontainer-feature.json +22 -0
  24. package/.devcontainer/features/chromaterm/install.sh +113 -0
  25. package/.devcontainer/features/claude-monitor/devcontainer-feature.json +0 -1
  26. package/.devcontainer/features/claude-session-dashboard/README.md +40 -0
  27. package/.devcontainer/features/claude-session-dashboard/devcontainer-feature.json +34 -0
  28. package/.devcontainer/features/claude-session-dashboard/install.sh +172 -0
  29. package/.devcontainer/features/kitty-terminfo/README.md +32 -0
  30. package/.devcontainer/features/kitty-terminfo/devcontainer-feature.json +13 -0
  31. package/.devcontainer/features/kitty-terminfo/install.sh +72 -0
  32. package/.devcontainer/features/lsp-servers/devcontainer-feature.json +0 -1
  33. package/.devcontainer/features/mcp-qdrant/devcontainer-feature.json +0 -1
  34. package/.devcontainer/features/shellcheck/install.sh +6 -2
  35. package/.devcontainer/features/tree-sitter/devcontainer-feature.json +0 -1
  36. package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +48 -59
  37. package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/.claude-plugin/plugin.json +7 -0
  38. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/AGENT-REDIRECTION.md +7 -12
  39. package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/README.md +197 -0
  40. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/REVIEW-RUBRIC.md +1 -1
  41. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/architect.md +3 -1
  42. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/bash-exec.md +3 -0
  43. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/claude-guide.md +5 -2
  44. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/debug-logs.md +7 -2
  45. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/dependency-analyst.md +6 -2
  46. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/doc-writer.md +4 -1
  47. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/explorer.md +4 -2
  48. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/generalist.md +10 -2
  49. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/git-archaeologist.md +5 -2
  50. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/migrator.md +4 -1
  51. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/perf-profiler.md +4 -1
  52. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/refactorer.md +5 -1
  53. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/researcher.md +6 -2
  54. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/security-auditor.md +5 -2
  55. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/spec-writer.md +3 -1
  56. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/statusline-config.md +4 -1
  57. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/test-writer.md +4 -1
  58. package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/hooks/hooks.json +51 -0
  59. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/guard-readonly-bash.py +2 -2
  60. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/inject-cwd.py +7 -4
  61. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/redirect-builtin-agents.py +17 -6
  62. package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/scripts/task-completed-check.py +166 -0
  63. package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/scripts/teammate-idle-check.py +81 -0
  64. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/verify-no-regression.py +14 -10
  65. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/verify-tests-pass.py +2 -14
  66. package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/README.md +17 -31
  67. package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/hooks/hooks.json +5 -1
  68. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → auto-code-quality}/scripts/advisory-test-runner.py +9 -8
  69. package/.devcontainer/plugins/devs-marketplace/plugins/codeforge-lsp/README.md +28 -0
  70. package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/README.md +28 -0
  71. package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/block-dangerous.py +2 -2
  72. package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/README.md +28 -0
  73. package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/hooks/hooks.json +0 -1
  74. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/README.md +28 -0
  75. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected-bash.py +1 -1
  76. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected.py +2 -2
  77. package/.devcontainer/plugins/devs-marketplace/plugins/session-context/.claude-plugin/plugin.json +7 -0
  78. package/.devcontainer/plugins/devs-marketplace/plugins/session-context/README.md +140 -0
  79. package/.devcontainer/plugins/devs-marketplace/plugins/session-context/hooks/hooks.json +33 -0
  80. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → session-context}/scripts/commit-reminder.py +3 -2
  81. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → session-context}/scripts/git-state-injector.py +18 -2
  82. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → session-context}/scripts/todo-harvester.py +9 -1
  83. package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/.claude-plugin/plugin.json +7 -0
  84. package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/README.md +158 -0
  85. package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/hooks/hooks.json +16 -0
  86. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/scripts/skill-suggester.py +189 -100
  87. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/api-design/SKILL.md +9 -6
  88. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/ast-grep-patterns/SKILL.md +7 -6
  89. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-agent-sdk/SKILL.md +8 -8
  90. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-code-headless/SKILL.md +8 -9
  91. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/debugging/SKILL.md +11 -7
  92. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/dependency-management/SKILL.md +10 -6
  93. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker/SKILL.md +8 -8
  94. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker-py/SKILL.md +9 -7
  95. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/documentation-patterns/SKILL.md +7 -6
  96. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/SKILL.md +9 -8
  97. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/git-forensics/SKILL.md +11 -9
  98. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/migration-patterns/SKILL.md +7 -6
  99. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/performance-profiling/SKILL.md +10 -8
  100. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/pydantic-ai/SKILL.md +8 -7
  101. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/refactoring-patterns/SKILL.md +9 -8
  102. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/security-checklist/SKILL.md +9 -8
  103. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/SKILL.md +7 -7
  104. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/SKILL.md +9 -7
  105. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/SKILL.md +7 -8
  106. package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/skills/team/SKILL.md +271 -0
  107. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/testing/SKILL.md +10 -7
  108. package/.devcontainer/plugins/devs-marketplace/plugins/spec-workflow/.claude-plugin/plugin.json +7 -0
  109. package/.devcontainer/plugins/devs-marketplace/plugins/spec-workflow/README.md +192 -0
  110. package/.devcontainer/plugins/devs-marketplace/plugins/spec-workflow/hooks/hooks.json +16 -0
  111. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/scripts/spec-reminder.py +3 -2
  112. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-build/SKILL.md +9 -6
  113. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-check/SKILL.md +10 -5
  114. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-init/SKILL.md +8 -4
  115. package/.devcontainer/plugins/devs-marketplace/plugins/spec-workflow/skills/spec-init/references/roadmap-template.md +33 -0
  116. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-new/SKILL.md +8 -4
  117. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-refine/SKILL.md +10 -7
  118. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-review/SKILL.md +10 -6
  119. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-update/SKILL.md +10 -5
  120. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/specification-writing/SKILL.md +9 -9
  121. package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/plugin.json +1 -2
  122. package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/README.md +28 -0
  123. package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/hooks/hooks.json +16 -0
  124. package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → ticket-workflow}/scripts/ticket-linker.py +9 -1
  125. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/README.md +104 -32
  126. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/hooks/hooks.json +49 -3
  127. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/guard-workspace-scope.py +269 -58
  128. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/inject-workspace-cwd.py +44 -0
  129. package/.devcontainer/scripts/setup-aliases.sh +13 -5
  130. package/.devcontainer/scripts/setup-config.sh +1 -0
  131. package/.devcontainer/scripts/setup-projects.sh +1 -1
  132. package/README.md +5 -5
  133. package/package.json +6 -2
  134. package/setup.js +3 -2
  135. package/.devcontainer/.env +0 -33
  136. package/.devcontainer/features/README.md +0 -126
  137. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/.claude-plugin/plugin.json +0 -7
  138. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/README.md +0 -81
  139. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/hooks/hooks.json +0 -17
  140. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/__pycache__/format-on-stop.cpython-314.pyc +0 -0
  141. package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/format-on-stop.py +0 -297
  142. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/.claude-plugin/plugin.json +0 -7
  143. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/README.md +0 -92
  144. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/hooks/hooks.json +0 -17
  145. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/__pycache__/lint-file.cpython-314.pyc +0 -0
  146. package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/lint-file.py +0 -536
  147. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/.claude-plugin/plugin.json +0 -8
  148. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/README.md +0 -250
  149. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +0 -112
  150. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/advisory-test-runner.cpython-314.pyc +0 -0
  151. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/collect-edited-files.cpython-314.pyc +0 -0
  152. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/commit-reminder.cpython-314.pyc +0 -0
  153. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/git-state-injector.cpython-314.pyc +0 -0
  154. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/guard-readonly-bash.cpython-314.pyc +0 -0
  155. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/redirect-builtin-agents.cpython-314.pyc +0 -0
  156. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/skill-suggester.cpython-314.pyc +0 -0
  157. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/syntax-validator.cpython-314.pyc +0 -0
  158. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/ticket-linker.cpython-314.pyc +0 -0
  159. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/todo-harvester.cpython-314.pyc +0 -0
  160. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/verify-no-regression.cpython-314.pyc +0 -0
  161. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/verify-tests-pass.cpython-314.pyc +0 -0
  162. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/collect-edited-files.py +0 -46
  163. package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/syntax-validator.py +0 -146
  164. package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/__pycache__/block-dangerous.cpython-314.pyc +0 -0
  165. package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/__pycache__/guard-protected.cpython-314.pyc +0 -0
  166. package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/system-prompt.md +0 -184
  167. package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/__pycache__/guard-workspace-scope.cpython-314.pyc +0 -0
  168. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive/.claude-plugin/commands/debug.md → agent-system/skills/debug/SKILL.md} +0 -0
  169. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/api-design/references/error-handling.md +0 -0
  170. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/api-design/references/rest-conventions.md +0 -0
  171. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/ast-grep-patterns/references/language-patterns.md +0 -0
  172. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-agent-sdk/references/sdk-typescript-reference.md +0 -0
  173. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-code-headless/references/cli-flags-and-output.md +0 -0
  174. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-code-headless/references/sdk-and-mcp.md +0 -0
  175. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/debugging/references/error-patterns.md +0 -0
  176. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/debugging/references/log-locations.md +0 -0
  177. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/dependency-management/references/ecosystem-commands.md +0 -0
  178. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/dependency-management/references/license-compliance.md +0 -0
  179. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker/references/compose-services.md +0 -0
  180. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker/references/dockerfile-patterns.md +0 -0
  181. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker-py/references/container-lifecycle.md +0 -0
  182. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker-py/references/resources-and-security.md +0 -0
  183. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/documentation-patterns/references/api-doc-templates.md +0 -0
  184. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/documentation-patterns/references/docstring-formats.md +0 -0
  185. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/middleware-and-lifespan.md +0 -0
  186. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/pydantic-models.md +0 -0
  187. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/routing-and-dependencies.md +0 -0
  188. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/sse-and-streaming.md +0 -0
  189. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/git-forensics/references/advanced-commands.md +0 -0
  190. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/git-forensics/references/investigation-playbooks.md +0 -0
  191. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/migration-patterns/references/javascript-migrations.md +0 -0
  192. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/migration-patterns/references/python-migrations.md +0 -0
  193. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/performance-profiling/references/interpreting-results.md +0 -0
  194. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/performance-profiling/references/tool-commands.md +0 -0
  195. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/pydantic-ai/references/agents-and-tools.md +0 -0
  196. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/pydantic-ai/references/models-and-streaming.md +0 -0
  197. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/refactoring-patterns/references/safe-transformations.md +0 -0
  198. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/refactoring-patterns/references/smell-catalog.md +0 -0
  199. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/security-checklist/references/owasp-patterns.md +0 -0
  200. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/security-checklist/references/secrets-patterns.md +0 -0
  201. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/references/cross-vendor-principles.md +0 -0
  202. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/references/patterns-and-antipatterns.md +0 -0
  203. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/references/skill-authoring-patterns.md +0 -0
  204. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/advanced-queries.md +0 -0
  205. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/javascript-patterns.md +0 -0
  206. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/python-patterns.md +0 -0
  207. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/schema-and-pragmas.md +0 -0
  208. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/ai-sdk-svelte.md +0 -0
  209. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/component-patterns.md +0 -0
  210. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/layercake.md +0 -0
  211. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/migration-guide.md +0 -0
  212. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/runes-and-reactivity.md +0 -0
  213. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/spa-and-routing.md +0 -0
  214. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/svelte-dnd-action.md +0 -0
  215. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/testing/references/fastapi-testing.md +0 -0
  216. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/testing/references/svelte-testing.md +0 -0
  217. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-build/references/review-checklist.md +0 -0
  218. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-init/references/backlog-template.md +0 -0
  219. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-init/references/milestones-template.md +0 -0
  220. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-new/references/template.md +0 -0
  221. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/specification-writing/references/criteria-patterns.md +0 -0
  222. /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/specification-writing/references/ears-templates.md +0 -0
  223. /package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/{.claude-plugin/commands/ticket/357/200/272create-pr.md" → skills/ticketcreate-pr/SKILL.md} +0 -0
  224. /package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/{.claude-plugin/commands/ticket/357/200/272new.md" → skills/ticketnew/SKILL.md} +0 -0
  225. /package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/{.claude-plugin/commands/ticket/357/200/272review-commit.md" → skills/ticketreview-commit/SKILL.md} +0 -0
  226. /package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/{.claude-plugin/commands/ticket/357/200/272work.md" → skills/ticketwork/SKILL.md} +0 -0
@@ -8,10 +8,12 @@ description: >-
8
8
  "what files contain", or needs quick file discovery, pattern matching,
9
9
  or codebase navigation. Supports thoroughness levels: quick, medium,
10
10
  very thorough. Reports findings with absolute file paths and never
11
- modifies any files.
11
+ modifies any files. Do not use for code modifications, multi-step
12
+ research requiring web access, or implementation tasks.
12
13
  tools: Read, Glob, Grep, Bash
13
- model: sonnet
14
+ model: haiku
14
15
  color: blue
16
+ permissionMode: plan
15
17
  memory:
16
18
  scope: project
17
19
  skills:
@@ -6,10 +6,18 @@ description: >-
6
6
  the user needs a keyword or file search that may require multiple attempts,
7
7
  multi-file investigation, code modifications across several files, or
8
8
  any complex task that doesn't fit a specialist agent's domain. Has access
9
- to all tools and can both read and write files.
9
+ to all tools and can both read and write files. Do not use when a
10
+ specialist agent clearly matches the task — prefer the domain
11
+ specialist for better results.
10
12
  tools: "*"
11
- model: opus
13
+ disallowedTools:
14
+ - EnterPlanMode
15
+ - EnterWorktree
16
+ - TeamCreate
17
+ - TeamDelete
18
+ model: inherit
12
19
  color: green
20
+ permissionMode: default
13
21
  memory:
14
22
  scope: project
15
23
  skills:
@@ -8,9 +8,12 @@ description: >-
8
8
  "git blame", "git bisect", "what happened to this code", "show the history
9
9
  of this file", "who contributed to this module", "recover lost commit",
10
10
  "trace this function's evolution", or needs any git history forensics.
11
+ Do not use for modifying git history, making commits, pushing, or any
12
+ git write operations.
11
13
  tools: Read, Grep, Bash
12
- model: sonnet
14
+ model: haiku
13
15
  color: blue
16
+ permissionMode: plan
14
17
  memory:
15
18
  scope: project
16
19
  skills:
@@ -52,7 +55,7 @@ Before starting work, read project-specific instructions:
52
55
  - **NEVER** change the working tree — no `git checkout`, `git reset`, `git restore`, `git clean`, or `git switch`. Changing the working tree could discard the user's uncommitted work.
53
56
  - **NEVER** modify refs — no `git tag`, `git branch -d`, `git branch -m`, or `git update-ref`.
54
57
  - **NEVER** modify configuration — no `git config` writes.
55
- - Your Bash usage is **git-read-only guarded**. Only these git subcommands are permitted: `log`, `blame`, `show`, `diff`, `bisect` (view mode only), `reflog`, `shortlog`, `rev-list`, `rev-parse`, `ls-files`, `ls-tree`, `cat-file`, `name-rev`, `describe`, `merge-base`, `branch -a` / `branch --list`, `remote -v`, `stash list`, `worktree list`.
58
+ - Your Bash usage is **git-read-only guarded**. Only these git subcommands are permitted: `log`, `blame`, `show`, `diff`, `bisect` (view mode only), `reflog`, `shortlog`, `rev-list`, `rev-parse`, `ls-files`, `ls-tree`, `cat-file`, `name-rev`, `describe`, `merge-base`, `branch -a` / `branch --list`, `remote -v`, `stash list`.
56
59
  - You may also use `Read`, `Grep`, and non-git Bash commands that are read-only (`wc`, `sort`, `head`, `uniq`).
57
60
 
58
61
  ## Investigation Workflow
@@ -8,10 +8,13 @@ description: >-
8
8
  "update the framework", "bump Python version", "convert from Express to
9
9
  Fastify", "upgrade Pydantic", "modernize the codebase", or needs any
10
10
  framework, library, or language version migration with step-by-step
11
- verification.
11
+ verification. Do not use for new feature development, bug fixes, or
12
+ changes unrelated to version or framework migration.
12
13
  tools: Read, Edit, Write, Glob, Grep, Bash, WebFetch
13
14
  model: opus
14
15
  color: magenta
16
+ permissionMode: acceptEdits
17
+ isolation: worktree
15
18
  memory:
16
19
  scope: user
17
20
  skills:
@@ -8,10 +8,13 @@ description: >-
8
8
  "measure performance", "optimize the build", "check response times",
9
9
  "profile the database queries", "find memory leaks", or needs any
10
10
  performance measurement, bottleneck identification, or optimization
11
- guidance backed by profiling data.
11
+ guidance backed by profiling data. Do not use for implementing
12
+ optimizations or modifying code — measurement and analysis only.
12
13
  tools: Read, Bash, Glob, Grep
13
14
  model: sonnet
14
15
  color: yellow
16
+ permissionMode: plan
17
+ background: true
15
18
  memory:
16
19
  scope: project
17
20
  skills:
@@ -7,10 +7,14 @@ description: >-
7
7
  asks "refactor this", "clean up this code", "reduce complexity", "split this
8
8
  class", "extract this function", "remove duplication", "simplify this module",
9
9
  or discusses code smells, technical debt, or structural improvements.
10
- Runs tests after every edit to guarantee safety.
10
+ Runs tests after every edit to guarantee safety. Do not use for
11
+ adding new features, fixing bugs, or making behavioral changes to
12
+ code.
11
13
  tools: Read, Edit, Glob, Grep, Bash
12
14
  model: opus
13
15
  color: yellow
16
+ permissionMode: acceptEdits
17
+ isolation: worktree
14
18
  memory:
15
19
  scope: project
16
20
  skills:
@@ -7,12 +7,16 @@ description: >-
7
7
  approach for", "investigate this", "research", "look into", "compare X vs Y",
8
8
  "explain this concept", or needs codebase analysis, library evaluation,
9
9
  technology comparison, or technical deep-dives. Reports structured findings
10
- with citations without modifying any files.
10
+ with citations without modifying any files. Do not use for code
11
+ modifications, file writing, or implementation tasks.
11
12
  tools: Read, Glob, Grep, WebSearch, WebFetch, Bash
12
- model: opus
13
+ model: sonnet
13
14
  color: cyan
15
+ permissionMode: plan
14
16
  memory:
15
17
  scope: user
18
+ skills:
19
+ - documentation-patterns
16
20
  ---
17
21
 
18
22
  # Research Agent
@@ -8,10 +8,13 @@ description: >-
8
8
  "find hardcoded credentials", "check dependency vulnerabilities", "OWASP
9
9
  review", "security check", or needs a security assessment of any code.
10
10
  Reports findings with severity ratings and remediation guidance without
11
- modifying any files.
11
+ modifying any files. Do not use for fixing vulnerabilities or
12
+ implementing security changes — audit and reporting only.
12
13
  tools: Read, Glob, Grep, Bash
13
- model: opus
14
+ model: sonnet
14
15
  color: red
16
+ permissionMode: plan
17
+ background: true
15
18
  memory:
16
19
  scope: user
17
20
  skills:
@@ -8,10 +8,12 @@ description: >-
8
8
  "spec this feature", "write user stories", "define the behavior of",
9
9
  "create a technical specification", or needs structured requirements,
10
10
  acceptance criteria, or feature specifications grounded in the actual
11
- codebase state.
11
+ codebase state. Do not use for code implementation or writing
12
+ executable code — specification authoring only.
12
13
  tools: Read, Glob, Grep, WebSearch
13
14
  model: opus
14
15
  color: magenta
16
+ permissionMode: plan
15
17
  memory:
16
18
  scope: user
17
19
  skills:
@@ -5,10 +5,13 @@ description: >-
5
5
  status line setting. Use when the user asks "set up my status line", "convert
6
6
  my PS1", "customize the status bar", "show git branch in status line",
7
7
  "add context usage to status line", or wants to configure what appears in
8
- Claude Code's bottom status bar. Can read shell configs and write settings.
8
+ Claude Code's bottom status bar. Can read shell configs and write
9
+ settings. Do not use for general Claude Code settings, non-status-line
10
+ configuration, or shell profile modifications.
9
11
  tools: Read, Edit
10
12
  model: sonnet
11
13
  color: orange
14
+ permissionMode: acceptEdits
12
15
  memory:
13
16
  scope: user
14
17
  ---
@@ -7,10 +7,13 @@ description: >-
7
7
  "write tests for", "add tests", "increase test coverage", "create unit tests",
8
8
  "add integration tests", "test this function", "test this module", or needs
9
9
  automated test coverage for any code. Supports pytest, Vitest, Jest, Go
10
- testing, and Rust test frameworks.
10
+ testing, and Rust test frameworks. Do not use for modifying
11
+ application source code, fixing bugs, or implementing features.
11
12
  tools: Read, Write, Edit, Glob, Grep, Bash
12
13
  model: opus
13
14
  color: green
15
+ permissionMode: acceptEdits
16
+ isolation: worktree
14
17
  memory:
15
18
  scope: project
16
19
  skills:
@@ -0,0 +1,51 @@
1
+ {
2
+ "description": "Agent redirection, subagent configuration, and team quality gate hooks",
3
+ "hooks": {
4
+ "PreToolUse": [
5
+ {
6
+ "matcher": "Task",
7
+ "hooks": [
8
+ {
9
+ "type": "command",
10
+ "command": "python3 ${CLAUDE_PLUGIN_ROOT}/scripts/redirect-builtin-agents.py",
11
+ "timeout": 5
12
+ }
13
+ ]
14
+ }
15
+ ],
16
+ "SubagentStart": [
17
+ {
18
+ "matcher": "",
19
+ "hooks": [
20
+ {
21
+ "type": "command",
22
+ "command": "python3 ${CLAUDE_PLUGIN_ROOT}/scripts/inject-cwd.py",
23
+ "timeout": 3
24
+ }
25
+ ]
26
+ }
27
+ ],
28
+ "TeammateIdle": [
29
+ {
30
+ "hooks": [
31
+ {
32
+ "type": "command",
33
+ "command": "python3 ${CLAUDE_PLUGIN_ROOT}/scripts/teammate-idle-check.py",
34
+ "timeout": 10
35
+ }
36
+ ]
37
+ }
38
+ ],
39
+ "TaskCompleted": [
40
+ {
41
+ "hooks": [
42
+ {
43
+ "type": "command",
44
+ "command": "python3 ${CLAUDE_PLUGIN_ROOT}/scripts/task-completed-check.py",
45
+ "timeout": 60
46
+ }
47
+ ]
48
+ }
49
+ ]
50
+ }
51
+ }
@@ -12,7 +12,7 @@ command substitution ($(), backticks), backgrounding (&), redirections
12
12
  (>, >>), eval/exec, inline scripting (python -c, node -e), and
13
13
  path/backslash prefix bypasses (/usr/bin/rm, \\rm).
14
14
 
15
- Reads tool input from stdin (JSON). Returns JSON on stdout.
15
+ Reads tool input from stdin (JSON). Outputs block reason to stderr.
16
16
  Exit 0: Command is safe (allowed)
17
17
  Exit 2: Command would modify state (blocked)
18
18
  """
@@ -601,7 +601,7 @@ def main():
601
601
  error = check_general_readonly(command)
602
602
 
603
603
  if error:
604
- json.dump({"error": error}, sys.stdout)
604
+ print(error, file=sys.stderr)
605
605
  sys.exit(2)
606
606
 
607
607
  sys.exit(0)
@@ -23,10 +23,13 @@ def main():
23
23
 
24
24
  json.dump(
25
25
  {
26
- "additionalContext": (
27
- f"Working Directory: {cwd} — restrict all file operations to "
28
- f"this directory unless explicitly instructed otherwise."
29
- )
26
+ "hookSpecificOutput": {
27
+ "hookEventName": "SubagentStart",
28
+ "additionalContext": (
29
+ f"Working Directory: {cwd} — restrict all file operations to "
30
+ f"this directory unless explicitly instructed otherwise."
31
+ ),
32
+ }
30
33
  },
31
34
  sys.stdout,
32
35
  )
@@ -3,7 +3,12 @@
3
3
  Redirect built-in agents - PreToolUse hook for Task tool.
4
4
 
5
5
  Intercepts Task tool calls and transparently redirects built-in agent
6
- types to enhanced custom agents defined in the code-directive plugin.
6
+ types to enhanced custom agents defined in the agent-system plugin.
7
+
8
+ Handles three cases:
9
+ - Built-in name (e.g. "claude-code-guide") → qualified custom name
10
+ - Unqualified custom name (e.g. "claude-guide") → qualified custom name
11
+ - Already-qualified name (e.g. "agent-system:claude-guide") → passthrough
7
12
 
8
13
  The redirect preserves the original prompt — only the subagent_type
9
14
  is changed. Model selection is left to the custom agent's YAML config.
@@ -28,7 +33,11 @@ REDIRECT_MAP = {
28
33
  }
29
34
 
30
35
  # Plugin name prefix for fully-qualified agent references
31
- PLUGIN_PREFIX = "code-directive"
36
+ PLUGIN_PREFIX = "agent-system"
37
+
38
+ # Unqualified custom name → fully-qualified custom name
39
+ # Handles cases where the model uses the short name directly
40
+ UNQUALIFIED_MAP = {v: f"{PLUGIN_PREFIX}:{v}" for v in REDIRECT_MAP.values()}
32
41
 
33
42
  LOG_FILE = os.environ.get("AGENT_REDIRECT_LOG", "/tmp/agent-redirect.log")
34
43
 
@@ -54,12 +63,14 @@ def main() -> None:
54
63
  tool_input = input_data.get("tool_input", {})
55
64
  subagent_type = tool_input.get("subagent_type", "")
56
65
 
57
- if subagent_type not in REDIRECT_MAP:
66
+ if subagent_type in REDIRECT_MAP:
67
+ target = REDIRECT_MAP[subagent_type]
68
+ qualified_name = f"{PLUGIN_PREFIX}:{target}"
69
+ elif subagent_type in UNQUALIFIED_MAP:
70
+ qualified_name = UNQUALIFIED_MAP[subagent_type]
71
+ else:
58
72
  sys.exit(0)
59
73
 
60
- target = REDIRECT_MAP[subagent_type]
61
- qualified_name = f"{PLUGIN_PREFIX}:{target}"
62
-
63
74
  log(f"{subagent_type} → {qualified_name}")
64
75
 
65
76
  # Include all original fields in updatedInput — Claude Code may replace
@@ -0,0 +1,166 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ TaskCompleted quality gate — runs project test suite before allowing completion.
4
+
5
+ Detects the project's test framework and runs it. If tests fail, the task
6
+ stays open and the teammate receives feedback to fix the failures.
7
+
8
+ Exit 0: Tests pass (or no test framework / runner not installed)
9
+ Exit 2: Tests fail (task stays open, feedback sent via stderr)
10
+ """
11
+
12
+ import json
13
+ import os
14
+ import subprocess
15
+ import sys
16
+
17
+ TIMEOUT_SECONDS = 60
18
+
19
+
20
+ def detect_test_framework(cwd: str) -> tuple[str, list[str]]:
21
+ """Detect which test framework is available in the project.
22
+
23
+ Checks for: pytest, vitest, jest, mocha, go test, cargo test.
24
+ Falls back to npm test if a test script is defined.
25
+
26
+ Returns:
27
+ Tuple of (framework_name, command_list) or ("", []) if none found.
28
+ """
29
+ try:
30
+ entries = set(os.listdir(cwd))
31
+ except OSError:
32
+ return ("", [])
33
+
34
+ # Python: pytest
35
+ if "pytest.ini" in entries or "conftest.py" in entries:
36
+ return ("pytest", ["python3", "-m", "pytest", "--tb=short", "-q"])
37
+
38
+ for cfg_name in ("pyproject.toml", "setup.cfg", "tox.ini"):
39
+ cfg_path = os.path.join(cwd, cfg_name)
40
+ if os.path.isfile(cfg_path):
41
+ try:
42
+ with open(cfg_path, "r", encoding="utf-8") as f:
43
+ content = f.read()
44
+ if any(
45
+ marker in content
46
+ for marker in ("[tool.pytest", "[pytest]", "[tool:pytest]")
47
+ ):
48
+ return ("pytest", ["python3", "-m", "pytest", "--tb=short", "-q"])
49
+ except OSError:
50
+ pass
51
+
52
+ if "tests" in entries and os.path.isdir(os.path.join(cwd, "tests")):
53
+ return ("pytest", ["python3", "-m", "pytest", "--tb=short", "-q"])
54
+
55
+ for entry in entries:
56
+ if entry.startswith("test_") and entry.endswith(".py"):
57
+ return ("pytest", ["python3", "-m", "pytest", "--tb=short", "-q"])
58
+
59
+ # JavaScript: vitest
60
+ for name in entries:
61
+ if name.startswith("vitest.config"):
62
+ return ("vitest", ["npx", "vitest", "run", "--reporter=verbose"])
63
+
64
+ for vite_cfg in ("vite.config.ts", "vite.config.js"):
65
+ cfg_path = os.path.join(cwd, vite_cfg)
66
+ if os.path.isfile(cfg_path):
67
+ try:
68
+ with open(cfg_path, "r", encoding="utf-8") as f:
69
+ if "test" in f.read():
70
+ return (
71
+ "vitest",
72
+ ["npx", "vitest", "run", "--reporter=verbose"],
73
+ )
74
+ except OSError:
75
+ pass
76
+
77
+ # JavaScript: jest
78
+ for name in entries:
79
+ if name.startswith("jest.config"):
80
+ return ("jest", ["npx", "jest", "--verbose"])
81
+
82
+ pkg_json = os.path.join(cwd, "package.json")
83
+ if os.path.isfile(pkg_json):
84
+ try:
85
+ with open(pkg_json, "r", encoding="utf-8") as f:
86
+ pkg = json.loads(f.read())
87
+
88
+ if "jest" in pkg:
89
+ return ("jest", ["npx", "jest", "--verbose"])
90
+
91
+ dev_deps = pkg.get("devDependencies", {})
92
+ deps = pkg.get("dependencies", {})
93
+
94
+ if "mocha" in dev_deps or "mocha" in deps:
95
+ return ("mocha", ["npx", "mocha", "--reporter", "spec"])
96
+
97
+ test_script = pkg.get("scripts", {}).get("test", "")
98
+ if test_script and "no test specified" not in test_script:
99
+ return ("npm-test", ["npm", "test"])
100
+ except (OSError, json.JSONDecodeError):
101
+ pass
102
+
103
+ # Go
104
+ if "go.mod" in entries:
105
+ return ("go", ["go", "test", "./...", "-count=1"])
106
+
107
+ # Rust
108
+ if "Cargo.toml" in entries:
109
+ return ("cargo", ["cargo", "test"])
110
+
111
+ return ("", [])
112
+
113
+
114
+ def main():
115
+ try:
116
+ json.load(sys.stdin)
117
+ except (json.JSONDecodeError, ValueError):
118
+ pass
119
+
120
+ cwd = os.getcwd()
121
+ framework, cmd = detect_test_framework(cwd)
122
+
123
+ if not framework:
124
+ sys.exit(0)
125
+
126
+ try:
127
+ result = subprocess.run(
128
+ cmd,
129
+ cwd=cwd,
130
+ capture_output=True,
131
+ text=True,
132
+ timeout=TIMEOUT_SECONDS,
133
+ )
134
+ except subprocess.TimeoutExpired:
135
+ # Timeout is not a definitive failure — allow completion but warn
136
+ print(
137
+ f"Tests timed out ({framework}, {TIMEOUT_SECONDS}s). "
138
+ f"Task completion allowed — verify tests manually.",
139
+ file=sys.stderr,
140
+ )
141
+ sys.exit(0)
142
+ except FileNotFoundError:
143
+ sys.exit(0)
144
+ except OSError:
145
+ sys.exit(0)
146
+
147
+ if result.returncode == 0:
148
+ sys.exit(0)
149
+
150
+ output = (result.stdout + "\n" + result.stderr).strip()
151
+ if not output:
152
+ output = "(no test output)"
153
+
154
+ lines = output.splitlines()
155
+ if len(lines) > 50:
156
+ output = "...(truncated)\n" + "\n".join(lines[-50:])
157
+
158
+ print(
159
+ f"Tests failed ({framework}). Fix failures before marking task complete:\n{output}",
160
+ file=sys.stderr,
161
+ )
162
+ sys.exit(2)
163
+
164
+
165
+ if __name__ == "__main__":
166
+ main()
@@ -0,0 +1,81 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ TeammateIdle quality gate — checks if teammate has incomplete tasks.
4
+
5
+ Runs when a teammate is about to go idle. Queries the shared task list
6
+ directory for tasks assigned to this teammate that aren't yet completed.
7
+
8
+ Exit 0: Allow idle (no incomplete tasks or unable to determine)
9
+ Exit 2: Send feedback via stderr (incomplete tasks found)
10
+ """
11
+
12
+ import json
13
+ import os
14
+ import sys
15
+
16
+
17
+ def find_incomplete_tasks(teammate_name: str) -> list[str]:
18
+ """Scan task directories for incomplete tasks owned by this teammate."""
19
+ config_dir = os.environ.get("CLAUDE_CONFIG_DIR", os.path.expanduser("~/.claude"))
20
+ tasks_base = os.path.join(config_dir, "tasks")
21
+
22
+ if not os.path.isdir(tasks_base):
23
+ return []
24
+
25
+ incomplete = []
26
+ for entry in os.listdir(tasks_base):
27
+ team_dir = os.path.join(tasks_base, entry)
28
+ if not os.path.isdir(team_dir):
29
+ continue
30
+
31
+ for filename in sorted(os.listdir(team_dir)):
32
+ if not filename.endswith(".json"):
33
+ continue
34
+
35
+ task_path = os.path.join(team_dir, filename)
36
+ try:
37
+ with open(task_path, "r", encoding="utf-8") as f:
38
+ task = json.load(f)
39
+
40
+ owner = task.get("owner", "")
41
+ status = task.get("status", "")
42
+ subject = task.get("subject", filename)
43
+
44
+ if owner == teammate_name and status in ("pending", "in_progress"):
45
+ incomplete.append(subject)
46
+ except (OSError, json.JSONDecodeError, ValueError):
47
+ continue
48
+
49
+ return incomplete
50
+
51
+
52
+ def main():
53
+ try:
54
+ input_data = json.load(sys.stdin)
55
+ except (json.JSONDecodeError, ValueError):
56
+ sys.exit(0)
57
+
58
+ teammate_name = (
59
+ input_data.get("teammate_name")
60
+ or input_data.get("agent_name")
61
+ or ""
62
+ )
63
+ if not teammate_name:
64
+ sys.exit(0)
65
+
66
+ incomplete = find_incomplete_tasks(teammate_name)
67
+ if not incomplete:
68
+ sys.exit(0)
69
+
70
+ task_list = "; ".join(incomplete[:5])
71
+ suffix = f" (and {len(incomplete) - 5} more)" if len(incomplete) > 5 else ""
72
+ print(
73
+ f"You have {len(incomplete)} incomplete task(s): {task_list}{suffix}. "
74
+ f"Check TaskList and continue working before going idle.",
75
+ file=sys.stderr,
76
+ )
77
+ sys.exit(2)
78
+
79
+
80
+ if __name__ == "__main__":
81
+ main()
@@ -178,7 +178,10 @@ def main():
178
178
  # Timeout is non-critical for PostToolUse — don't block the agent
179
179
  json.dump(
180
180
  {
181
- "additionalContext": f"[Tests] {framework} timed out after 60s — skipping regression check."
181
+ "hookSpecificOutput": {
182
+ "hookEventName": "PostToolUse",
183
+ "additionalContext": f"[Tests] {framework} timed out after 60s — skipping regression check.",
184
+ }
182
185
  },
183
186
  sys.stdout,
184
187
  )
@@ -199,19 +202,20 @@ def main():
199
202
 
200
203
  if result.returncode != 0:
201
204
  edited = os.path.basename(file_path)
202
- json.dump(
203
- {
204
- "error": (
205
- f"Regression detected after editing {edited} "
206
- f"({framework}). Fix the failing tests before continuing:\n{output}"
207
- )
208
- },
209
- sys.stdout,
205
+ print(
206
+ f"Regression detected after editing {edited} "
207
+ f"({framework}). Fix the failing tests before continuing:\n{output}",
208
+ file=sys.stderr,
210
209
  )
211
210
  sys.exit(2)
212
211
 
213
212
  json.dump(
214
- {"additionalContext": f"[Tests] No regression ({framework}): all tests passed"},
213
+ {
214
+ "hookSpecificOutput": {
215
+ "hookEventName": "PostToolUse",
216
+ "additionalContext": f"[Tests] No regression ({framework}): all tests passed",
217
+ }
218
+ },
215
219
  sys.stdout,
216
220
  )
217
221
  sys.exit(0)
@@ -136,12 +136,7 @@ def main():
136
136
  timeout=60,
137
137
  )
138
138
  except subprocess.TimeoutExpired:
139
- json.dump(
140
- {
141
- "additionalContext": f"[Tests] {framework} timed out after 60s. Consider running tests manually."
142
- },
143
- sys.stdout,
144
- )
139
+ print(f"Tests timed out ({framework})", file=sys.stderr)
145
140
  sys.exit(2)
146
141
  except FileNotFoundError:
147
142
  # Test runner not installed — non-critical
@@ -159,16 +154,9 @@ def main():
159
154
  output = "...(truncated)\n" + "\n".join(lines[-50:])
160
155
 
161
156
  if result.returncode != 0:
162
- json.dump(
163
- {"error": f"Tests failed ({framework}):\n{output}"},
164
- sys.stdout,
165
- )
157
+ print(f"Tests failed ({framework}):\n{output}", file=sys.stderr)
166
158
  sys.exit(2)
167
159
 
168
- json.dump(
169
- {"additionalContext": f"[Tests] All tests passed ({framework})"},
170
- sys.stdout,
171
- )
172
160
  sys.exit(0)
173
161
 
174
162