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.
- package/.devcontainer/CHANGELOG.md +175 -2
- package/.devcontainer/CLAUDE.md +61 -268
- package/.devcontainer/README.md +17 -9
- package/.devcontainer/config/defaults/ccstatusline-settings.json +147 -0
- package/.devcontainer/config/defaults/main-system-prompt.md +6 -1
- package/.devcontainer/config/defaults/rules/spec-workflow.md +1 -55
- package/.devcontainer/config/defaults/rules/workspace-scope.md +13 -4
- package/.devcontainer/config/defaults/settings.json +5 -3
- package/.devcontainer/config/file-manifest.json +14 -0
- package/.devcontainer/devcontainer.json +32 -7
- package/.devcontainer/docs/optional-features.md +0 -65
- package/.devcontainer/docs/plugins.md +38 -23
- package/.devcontainer/features/ast-grep/devcontainer-feature.json +0 -1
- package/.devcontainer/features/biome/install.sh +13 -0
- package/.devcontainer/features/ccburn/devcontainer-feature.json +0 -1
- package/.devcontainer/features/ccms/devcontainer-feature.json +0 -1
- package/.devcontainer/features/ccms/install.sh +1 -1
- package/.devcontainer/features/ccstatusline/devcontainer-feature.json +0 -1
- package/.devcontainer/features/ccstatusline/install.sh +17 -115
- package/.devcontainer/features/ccusage/devcontainer-feature.json +0 -1
- package/.devcontainer/features/chromaterm/README.md +42 -0
- package/.devcontainer/features/chromaterm/chromaterm.yml +35 -0
- package/.devcontainer/features/chromaterm/devcontainer-feature.json +22 -0
- package/.devcontainer/features/chromaterm/install.sh +113 -0
- package/.devcontainer/features/claude-monitor/devcontainer-feature.json +0 -1
- package/.devcontainer/features/claude-session-dashboard/README.md +40 -0
- package/.devcontainer/features/claude-session-dashboard/devcontainer-feature.json +34 -0
- package/.devcontainer/features/claude-session-dashboard/install.sh +172 -0
- package/.devcontainer/features/kitty-terminfo/README.md +32 -0
- package/.devcontainer/features/kitty-terminfo/devcontainer-feature.json +13 -0
- package/.devcontainer/features/kitty-terminfo/install.sh +72 -0
- package/.devcontainer/features/lsp-servers/devcontainer-feature.json +0 -1
- package/.devcontainer/features/mcp-qdrant/devcontainer-feature.json +0 -1
- package/.devcontainer/features/shellcheck/install.sh +6 -2
- package/.devcontainer/features/tree-sitter/devcontainer-feature.json +0 -1
- package/.devcontainer/plugins/devs-marketplace/.claude-plugin/marketplace.json +48 -59
- package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/AGENT-REDIRECTION.md +7 -12
- package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/README.md +197 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/REVIEW-RUBRIC.md +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/architect.md +3 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/bash-exec.md +3 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/claude-guide.md +5 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/debug-logs.md +7 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/dependency-analyst.md +6 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/doc-writer.md +4 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/explorer.md +4 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/generalist.md +10 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/git-archaeologist.md +5 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/migrator.md +4 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/perf-profiler.md +4 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/refactorer.md +5 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/researcher.md +6 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/security-auditor.md +5 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/spec-writer.md +3 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/statusline-config.md +4 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/agents/test-writer.md +4 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/hooks/hooks.json +51 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/guard-readonly-bash.py +2 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/inject-cwd.py +7 -4
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/redirect-builtin-agents.py +17 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/scripts/task-completed-check.py +166 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/scripts/teammate-idle-check.py +81 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/verify-no-regression.py +14 -10
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → agent-system}/scripts/verify-tests-pass.py +2 -14
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/README.md +17 -31
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-code-quality/hooks/hooks.json +5 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → auto-code-quality}/scripts/advisory-test-runner.py +9 -8
- package/.devcontainer/plugins/devs-marketplace/plugins/codeforge-lsp/README.md +28 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/README.md +28 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/block-dangerous.py +2 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/README.md +28 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/notify-hook/hooks/hooks.json +0 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/README.md +28 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected-bash.py +1 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/guard-protected.py +2 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/session-context/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/session-context/README.md +140 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/session-context/hooks/hooks.json +33 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → session-context}/scripts/commit-reminder.py +3 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → session-context}/scripts/git-state-injector.py +18 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → session-context}/scripts/todo-harvester.py +9 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/README.md +158 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/hooks/hooks.json +16 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/scripts/skill-suggester.py +189 -100
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/api-design/SKILL.md +9 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/ast-grep-patterns/SKILL.md +7 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-agent-sdk/SKILL.md +8 -8
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-code-headless/SKILL.md +8 -9
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/debugging/SKILL.md +11 -7
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/dependency-management/SKILL.md +10 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker/SKILL.md +8 -8
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker-py/SKILL.md +9 -7
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/documentation-patterns/SKILL.md +7 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/SKILL.md +9 -8
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/git-forensics/SKILL.md +11 -9
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/migration-patterns/SKILL.md +7 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/performance-profiling/SKILL.md +10 -8
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/pydantic-ai/SKILL.md +8 -7
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/refactoring-patterns/SKILL.md +9 -8
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/security-checklist/SKILL.md +9 -8
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/SKILL.md +7 -7
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/SKILL.md +9 -7
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/SKILL.md +7 -8
- package/.devcontainer/plugins/devs-marketplace/plugins/skill-engine/skills/team/SKILL.md +271 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/testing/SKILL.md +10 -7
- package/.devcontainer/plugins/devs-marketplace/plugins/spec-workflow/.claude-plugin/plugin.json +7 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/spec-workflow/README.md +192 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/spec-workflow/hooks/hooks.json +16 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/scripts/spec-reminder.py +3 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-build/SKILL.md +9 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-check/SKILL.md +10 -5
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-init/SKILL.md +8 -4
- package/.devcontainer/plugins/devs-marketplace/plugins/spec-workflow/skills/spec-init/references/roadmap-template.md +33 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-new/SKILL.md +8 -4
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-refine/SKILL.md +10 -7
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-review/SKILL.md +10 -6
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-update/SKILL.md +10 -5
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/specification-writing/SKILL.md +9 -9
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/plugin.json +1 -2
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/README.md +28 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/hooks/hooks.json +16 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → ticket-workflow}/scripts/ticket-linker.py +9 -1
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/README.md +104 -32
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/hooks/hooks.json +49 -3
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/guard-workspace-scope.py +269 -58
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/inject-workspace-cwd.py +44 -0
- package/.devcontainer/scripts/setup-aliases.sh +13 -5
- package/.devcontainer/scripts/setup-config.sh +1 -0
- package/.devcontainer/scripts/setup-projects.sh +1 -1
- package/README.md +5 -5
- package/package.json +6 -2
- package/setup.js +3 -2
- package/.devcontainer/.env +0 -33
- package/.devcontainer/features/README.md +0 -126
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/.claude-plugin/plugin.json +0 -7
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/README.md +0 -81
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/hooks/hooks.json +0 -17
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/__pycache__/format-on-stop.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-formatter/scripts/format-on-stop.py +0 -297
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/.claude-plugin/plugin.json +0 -7
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/README.md +0 -92
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/hooks/hooks.json +0 -17
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/__pycache__/lint-file.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/auto-linter/scripts/lint-file.py +0 -536
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/.claude-plugin/plugin.json +0 -8
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/README.md +0 -250
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/hooks/hooks.json +0 -112
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/advisory-test-runner.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/collect-edited-files.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/commit-reminder.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/git-state-injector.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/guard-readonly-bash.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/redirect-builtin-agents.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/skill-suggester.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/syntax-validator.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/ticket-linker.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/todo-harvester.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/verify-no-regression.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/__pycache__/verify-tests-pass.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/collect-edited-files.py +0 -46
- package/.devcontainer/plugins/devs-marketplace/plugins/code-directive/scripts/syntax-validator.py +0 -146
- package/.devcontainer/plugins/devs-marketplace/plugins/dangerous-command-blocker/scripts/__pycache__/block-dangerous.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/protected-files-guard/scripts/__pycache__/guard-protected.cpython-314.pyc +0 -0
- package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/.claude-plugin/system-prompt.md +0 -184
- package/.devcontainer/plugins/devs-marketplace/plugins/workspace-scope-guard/scripts/__pycache__/guard-workspace-scope.cpython-314.pyc +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive/.claude-plugin/commands/debug.md → agent-system/skills/debug/SKILL.md} +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/api-design/references/error-handling.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/api-design/references/rest-conventions.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/ast-grep-patterns/references/language-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-agent-sdk/references/sdk-typescript-reference.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-code-headless/references/cli-flags-and-output.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/claude-code-headless/references/sdk-and-mcp.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/debugging/references/error-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/debugging/references/log-locations.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/dependency-management/references/ecosystem-commands.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/dependency-management/references/license-compliance.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker/references/compose-services.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker/references/dockerfile-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker-py/references/container-lifecycle.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/docker-py/references/resources-and-security.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/documentation-patterns/references/api-doc-templates.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/documentation-patterns/references/docstring-formats.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/middleware-and-lifespan.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/pydantic-models.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/routing-and-dependencies.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/fastapi/references/sse-and-streaming.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/git-forensics/references/advanced-commands.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/git-forensics/references/investigation-playbooks.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/migration-patterns/references/javascript-migrations.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/migration-patterns/references/python-migrations.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/performance-profiling/references/interpreting-results.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/performance-profiling/references/tool-commands.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/pydantic-ai/references/agents-and-tools.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/pydantic-ai/references/models-and-streaming.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/refactoring-patterns/references/safe-transformations.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/refactoring-patterns/references/smell-catalog.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/security-checklist/references/owasp-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/security-checklist/references/secrets-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/references/cross-vendor-principles.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/references/patterns-and-antipatterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/skill-building/references/skill-authoring-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/advanced-queries.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/javascript-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/python-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/sqlite/references/schema-and-pragmas.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/ai-sdk-svelte.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/component-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/layercake.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/migration-guide.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/runes-and-reactivity.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/spa-and-routing.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/svelte5/references/svelte-dnd-action.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/testing/references/fastapi-testing.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → skill-engine}/skills/testing/references/svelte-testing.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-build/references/review-checklist.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-init/references/backlog-template.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-init/references/milestones-template.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/spec-new/references/template.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/specification-writing/references/criteria-patterns.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/{code-directive → spec-workflow}/skills/specification-writing/references/ears-templates.md +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/{.claude-plugin/commands/ticket/357/200/272create-pr.md" → skills/ticketcreate-pr/SKILL.md} +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/{.claude-plugin/commands/ticket/357/200/272new.md" → skills/ticketnew/SKILL.md} +0 -0
- /package/.devcontainer/plugins/devs-marketplace/plugins/ticket-workflow/{.claude-plugin/commands/ticket/357/200/272review-commit.md" → skills/ticketreview-commit/SKILL.md} +0 -0
- /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:
|
|
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
|
-
|
|
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:
|
|
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
|
|
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:
|
|
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:
|
|
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
|
|
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).
|
|
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
|
-
|
|
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
|
-
"
|
|
27
|
-
|
|
28
|
-
|
|
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
|
|
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 = "
|
|
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
|
|
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
|
package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/scripts/task-completed-check.py
ADDED
|
@@ -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()
|
package/.devcontainer/plugins/devs-marketplace/plugins/agent-system/scripts/teammate-idle-check.py
ADDED
|
@@ -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
|
-
"
|
|
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
|
-
|
|
203
|
-
{
|
|
204
|
-
|
|
205
|
-
|
|
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
|
-
{
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|