claude-code-kit 0.25.0__tar.gz → 0.26.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/.claude-plugin/marketplace.json +1 -1
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/.claude-plugin/plugin.json +1 -1
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/CHANGELOG.md +35 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/PKG-INFO +1 -1
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/hooks.json +11 -2
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/guard-secrets.sh +1 -1
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/pyproject.toml +1 -1
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/continuity.md +4 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/scripts/check_docs_consistency.py +34 -19
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/scripts/init.sh +4 -2
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/src/claude_kit/__init__.py +1 -1
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/src/claude_kit/cli.py +20 -2
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/src/claude_kit/hooks.py +4 -3
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/src/claude_kit/pipeline.py +82 -3
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/settings.json +2 -2
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/.gitignore +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/CLAUDE.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/CONTRIBUTING.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/LICENSE +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/acceptance-reviewer.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/auditor.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/dependency-scanner.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/developer.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/devils-advocate.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/devops-engineer.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/e2e-tester.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/em-reviewer.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/incident-responder.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/merge-reviewer.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/observability-engineer.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/orchestrator.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/owasp-reviewer.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/policy-validator.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/pr-raiser.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/risk-classifier.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/sdlc-code-reviewer.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/secret-scanner.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/security-reviewer.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/senior-backend-dev.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/senior-frontend-dev.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/senior-tester.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/spec-doc-writer.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/story-planner.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/technical-architect.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/tester.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/ui-designer.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/agents/unit-tester.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/catalog/capture.yaml +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/catalog/mcp.yaml +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/catalog/org.yaml +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/catalog/profiles.yaml +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/catalog/stacks.yaml +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/commands/abort.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/commands/init.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/commands/sdlc.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/commands/status.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/docs/agentic-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/docs/agents.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/docs/architecture.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/docs/coverage-audit.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/docs/eval-harness.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/docs/org-capabilities.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/docs/stack-skills/GAP-ANALYSIS.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/docs/stack-skills/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/docs/stack-skills/REPO-INVENTORY.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/audit-log.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/capture-learnings.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/guard-destructive-git.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/guard-kubectl-delete.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/lint-fix.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/load-autonomy.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/load-continuity.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/load-learnings.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/type-check.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/validate-frontmatter.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/validate-settings.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/warn-large-edits.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/warn-llm-io.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/warn-missing-tests.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/warn-sensitive-files.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/hooks/scripts/warn-shared-modules.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/agent-guardrails.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/agent-memory.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/agent-resilience.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/autonomy-levels.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/code-organization.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/design-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/devops-observability.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/documentation.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/evals.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/frontend-best-practices.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/goal-setting-and-monitoring.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/human-in-the-loop.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/linting-and-formatting.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/mandatory-workflow.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/model-tiers.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/quality-gates.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/rarv-cycle.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/reasoning-techniques.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/responsive-and-accessibility.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/risk-classification.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/testing.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/rules/tool-design.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/scripts/gen_hooks.py +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/_references/accessibility-checklist.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/_references/orchestration-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/_references/performance-checklist.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/_references/security-checklist.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/_references/testing-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/accessibility-review/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/alembic-migrations/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/alembic-migrations/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/alembic-migrations/references/alembic-setup-and-env.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/alembic-migrations/references/async-and-multitenant-migrations.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/alembic-migrations/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/alembic-migrations/references/troubleshooting-and-debugging.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/alembic-migrations/references/writing-migrations.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/anthropic-vertex-integration/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/anthropic-vertex-integration/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/anthropic-vertex-integration/references/generate-helpers-and-retry.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/anthropic-vertex-integration/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/anthropic-vertex-integration/references/vertex-client-and-auth.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/api-and-interface-design/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/api-integration/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/api-pagination-filtering-sorting/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/api-pagination-filtering-sorting/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/api-pagination-filtering-sorting/references/query-params-conventions.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/api-pagination-filtering-sorting/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/api-pagination-filtering-sorting/references/response-metadata.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/archive-sprint/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/async-python-patterns/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/async-python-patterns/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/async-python-patterns/references/async-boundaries.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/async-python-patterns/references/lifecycle-and-gather.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/async-python-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/auth-and-rbac/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/auth-and-rbac/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/auth-and-rbac/references/auth-dependencies.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/auth-and-rbac/references/rbac-and-permissions.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/auth-and-rbac/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/auth-and-rbac/references/security-hardening.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/auth-and-rbac/references/tokens-and-hashing.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/backend-repo-architecture/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/backend-repo-architecture/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/backend-repo-architecture/references/deployment-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/backend-repo-architecture/references/entrypoint-and-config.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/backend-repo-architecture/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/backend-repo-architecture/references/structure-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/backend-repo-architecture/references/troubleshooting.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/backlog/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/backlog/item-template.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/browser-testing-with-devtools/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/bug-hunt/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/ci-cd-and-automation/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/code-review-and-quality/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/code-simplification/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/component-design/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/configargparse-yaml-env-layering/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/configargparse-yaml-env-layering/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/configargparse-yaml-env-layering/references/config-layering-anatomy.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/configargparse-yaml-env-layering/references/mode-dispatch-and-precedence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/configargparse-yaml-env-layering/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/consolidate-learnings/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/containerization-and-deployment/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/containerization-and-deployment/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/containerization-and-deployment/references/deployment-and-secrets.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/containerization-and-deployment/references/dockerfile-and-compose.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/containerization-and-deployment/references/entrypoint-and-modes.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/containerization-and-deployment/references/kerberos-kinit-bootstrap.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/containerization-and-deployment/references/makefile-dev-workflow.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/containerization-and-deployment/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/context-engineering/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/cron-and-scheduled-jobs/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/cron-and-scheduled-jobs/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/cron-and-scheduled-jobs/references/choosing-and-operations.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/cron-and-scheduled-jobs/references/kubernetes-cronjob.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/cron-and-scheduled-jobs/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/cron-and-scheduled-jobs/references/temporal-schedules.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/data-engineering-bigquery-gcs/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/data-engineering-bigquery-gcs/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/data-engineering-bigquery-gcs/references/bigquery-advanced-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/data-engineering-bigquery-gcs/references/bigquery-gcs-io.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/data-engineering-bigquery-gcs/references/medallion-architecture.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/data-engineering-bigquery-gcs/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/data-engineering-bigquery-gcs/references/temp-table-merge-pattern.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/debugging-and-error-recovery/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/decision/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/decision/adr-template.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/deprecation-and-migration/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/design-patterns-and-conventions/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/design-patterns-and-conventions/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/design-patterns-and-conventions/references/anti-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/design-patterns-and-conventions/references/naming-and-layout.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/design-patterns-and-conventions/references/patterns-catalog.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/design-patterns-and-conventions/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/design-patterns-and-conventions/references/testing-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/design-patterns-and-conventions/references/troubleshooting.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/docker-compose/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/docker-compose/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/docker-compose/references/compose-services-and-healthchecks.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/docker-compose/references/dev-vs-prod-variants.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/docker-compose/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/docker-shared/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/docker-shared/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/docker-shared/references/dockerignore-and-build-secrets.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/docker-shared/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/docker-shared/references/shared-base-images.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/docker-shared/references/shared-compose-fragments.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/dockerfile-backend/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/dockerfile-backend/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/dockerfile-backend/references/backend-dockerfile-anatomy.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/dockerfile-backend/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/dockerfile-backend/references/system-deps-and-caching.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/dockerfile-frontend/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/dockerfile-frontend/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/dockerfile-frontend/references/build-args-and-nginx.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/dockerfile-frontend/references/frontend-dockerfile-anatomy.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/dockerfile-frontend/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/documentation-and-adrs/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/doubt-driven-development/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/edge-to-service-trust-boundary/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/edge-to-service-trust-boundary/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/edge-to-service-trust-boundary/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/edge-to-service-trust-boundary/references/trust-contract.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/execute/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/fastapi-service-patterns/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/fastapi-service-patterns/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/fastapi-service-patterns/references/api-versioning.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/fastapi-service-patterns/references/app-factory-and-lifespan.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/fastapi-service-patterns/references/custom-route-and-middleware.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/fastapi-service-patterns/references/dependency-injection.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/fastapi-service-patterns/references/model-and-serialization-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/fastapi-service-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/file-export-and-reporting/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/file-export-and-reporting/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/file-export-and-reporting/references/excel-generation.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/file-export-and-reporting/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/file-export-and-reporting/references/streaming-and-downloads.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/frontend-repo-architecture/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/frontend-repo-architecture/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/frontend-repo-architecture/references/api-layer-and-types.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/frontend-repo-architecture/references/divergences.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/frontend-repo-architecture/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/frontend-repo-architecture/references/structure-and-state.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/frontend-repo-architecture/references/testing-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/frontend-ui-engineering/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/gcp-cloud-run-github-actions/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/gcp-cloud-run-github-actions/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/gcp-cloud-run-github-actions/references/cloud-run-deploy.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/gcp-cloud-run-github-actions/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/gcp-cloud-run-github-actions/references/workflow-structure.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/gcs-file-storage-patterns/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/gcs-file-storage-patterns/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/gcs-file-storage-patterns/references/client-and-uploads.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/gcs-file-storage-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/gcs-file-storage-patterns/references/signed-urls-and-reads.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/git-workflow-and-versioning/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/grafana-dashboards-and-alerts/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/grafana-dashboards-and-alerts/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/grafana-dashboards-and-alerts/references/dashboard-json-and-templating.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/grafana-dashboards-and-alerts/references/provisioning-and-organization.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/grafana-dashboards-and-alerts/references/red-metrics-queries.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/grafana-dashboards-and-alerts/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/grafana-dashboards-and-alerts/references/unified-alerting.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/graphql-patterns/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/graphql-patterns/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/graphql-patterns/references/apollo-client-frontend.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/graphql-patterns/references/apollo-client-setup.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/graphql-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/graphql-patterns/references/strawberry-backend.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/graphql-patterns/references/when-to-use-graphql.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/idea-refine/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/idea-refine/examples.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/idea-refine/frameworks.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/idea-refine/refinement-criteria.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/idea-refine/scripts/idea-refine.sh +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/incident-postmortem/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/incremental-implementation/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/interview-me/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kafka-config-driven/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kafka-config-driven/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kafka-config-driven/references/config-and-sasl-kerberos.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kafka-config-driven/references/consumer-producer-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kafka-config-driven/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kafka-config-driven/references/troubleshooting-and-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kubectl-operations/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kubectl-operations/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kubectl-operations/references/command-reference.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kubectl-operations/references/context-namespace-rbac.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kubectl-operations/references/debugging-playbooks.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kubectl-operations/references/output-formats-and-selectors.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kubectl-operations/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kubernetes-workload-hardening/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kubernetes-workload-hardening/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kubernetes-workload-hardening/references/networkpolicy-and-rbac.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kubernetes-workload-hardening/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/kubernetes-workload-hardening/references/securitycontext-and-podsecurity.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/langfuse-llm-tracing/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/langfuse-llm-tracing/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/langfuse-llm-tracing/references/langfuse-client-and-tracing.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/langfuse-llm-tracing/references/python-and-typescript.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/langfuse-llm-tracing/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/load-testing/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/manual-test/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/modernization-and-migration/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/modernization-and-migration/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/modernization-and-migration/references/migration-best-practices.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/modernization-and-migration/references/pydantic-v1-to-v2.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/modernization-and-migration/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/modernization-and-migration/references/shared-internal-library.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/modernization-and-migration/references/sqlalchemy-14-to-20.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/multi-tenancy-patterns/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/multi-tenancy-patterns/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/multi-tenancy-patterns/references/caching-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/multi-tenancy-patterns/references/isolation-strategies.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/multi-tenancy-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/multi-tenancy-patterns/references/tenant-resolution.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/node-express-service/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/node-express-service/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/node-express-service/references/app-factory-and-mode-dispatch.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/node-express-service/references/config-and-module-alias.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/node-express-service/references/middleware-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/node-express-service/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/node-objection-knex/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/node-objection-knex/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/node-objection-knex/references/migrations-and-validation.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/node-objection-knex/references/objection-model-and-knex.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/node-objection-knex/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/notifications-and-messaging/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/notifications-and-messaging/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/notifications-and-messaging/references/provider-abstraction.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/notifications-and-messaging/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/notifications-and-messaging/references/templates-and-fallback.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/observability-and-logging/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/observability-and-logging/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/observability-and-logging/references/health-and-readiness.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/observability-and-logging/references/logging-and-structlog.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/observability-and-logging/references/outbound-metrics-and-multi-mode.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/observability-and-logging/references/pii-redaction.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/observability-and-logging/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/observability-and-logging/references/tracing-and-metrics.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/over-engineering-review/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/performance-optimization/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/planning-and-task-breakdown/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/playwright-verification/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/pydantic-schema-patterns/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/pydantic-schema-patterns/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/pydantic-schema-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/pydantic-schema-patterns/references/settings-and-validation.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/pydantic-schema-patterns/references/troubleshooting-and-common-errors.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/pydantic-schema-patterns/references/v1-vs-v2.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/python-dao-and-database/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/python-dao-and-database/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/python-dao-and-database/references/advanced-query-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/python-dao-and-database/references/basedao-and-sessions.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/python-dao-and-database/references/mongodb-advanced.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/python-dao-and-database/references/other-db-mongodb.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/python-dao-and-database/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/python-dao-and-database/references/sqlalchemy-1x-vs-2x.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/radix-tailwind-component-patterns/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/radix-tailwind-component-patterns/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/radix-tailwind-component-patterns/references/radix-primitives-and-variants.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/radix-tailwind-component-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/radix-tailwind-component-patterns/references/tailwind-theme-and-cn.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/react-hook-form-zod-patterns/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/react-hook-form-zod-patterns/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/react-hook-form-zod-patterns/references/form-setup-and-zod.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/react-hook-form-zod-patterns/references/multi-step-and-modes.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/react-hook-form-zod-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/redis-caching-patterns/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/redis-caching-patterns/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/redis-caching-patterns/references/cache-manager-and-fallback.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/redis-caching-patterns/references/namespacing-and-invalidation.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/redis-caching-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/refresh-docs/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/remember/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/scope/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/scope/scope-template.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/sdlc/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/security-and-hardening/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/security-verification/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/shannon-ai-pentest/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/shannon-ai-pentest/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/shannon-ai-pentest/references/operating-guide.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/shipping-and-launch/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/simplification-debt/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/smoke-test/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/source-driven-development/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/spec-driven-development/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/sprint/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/sprint/sprint-template.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/tanstack-react-query-patterns/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/tanstack-react-query-patterns/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/tanstack-react-query-patterns/references/mutations-and-cache.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/tanstack-react-query-patterns/references/query-keys-and-hooks.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/tanstack-react-query-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/task-tracker-sync/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/temporal-config-driven/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/temporal-config-driven/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/temporal-config-driven/references/config-and-retry-idempotency.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/temporal-config-driven/references/dag-dsl-interpreter.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/temporal-config-driven/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/temporal-config-driven/references/schedule-registration.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/temporal-config-driven/references/schedules-and-cron.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/temporal-config-driven/references/worker-workflow-activity-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/test-driven-development/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/test-plan-review/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/testing-conventions/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/testing-conventions/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/testing-conventions/references/async-and-mocking.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/testing-conventions/references/coverage-gap-and-recommendations.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/testing-conventions/references/github-actions-test-orchestration.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/testing-conventions/references/pytest-and-fixtures.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/testing-conventions/references/pytest-asyncio-modes.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/testing-conventions/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/testing-conventions/references/security-regression-tests.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/testing-conventions/references/vitest-frontend-testing.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/threat-model/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/triage/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/ui-ux-design/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/unit-test/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/using-agent-skills/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/vitest-rtl-msw-patterns/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/vitest-rtl-msw-patterns/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/vitest-rtl-msw-patterns/references/msw-and-contract-tests.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/vitest-rtl-msw-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/vitest-rtl-msw-patterns/references/vitest-rtl-setup.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/zap-vapt-scanning/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/zap-vapt-scanning/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/zap-vapt-scanning/references/operating-guide.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/zap-vapt-scanning/scripts/endpoints.example.txt +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/zap-vapt-scanning/scripts/requirements.txt +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/zap-vapt-scanning/scripts/zap_vapt.py +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/zustand-state-patterns/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/zustand-state-patterns/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/zustand-state-patterns/references/async-polling-and-persistence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/zustand-state-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/skills/zustand-state-patterns/references/store-structure-and-selectors.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/src/claude_kit/__main__.py +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/src/claude_kit/catalog.py +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/src/claude_kit/models.py +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/src/claude_kit/prompts.py +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/src/claude_kit/render.py +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/src/claude_kit/scaffold.py +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/src/claude_kit/upgrader.py +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/src/claude_kit/validator.py +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/CLAUDE.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/CLAUDE.stack.md.tmpl +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/CONTINUITY.template.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/README.claude-sdlc.md.tmpl +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/agent-memory/MEMORY.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/agent-memory/api/.gitkeep +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/agent-memory/architecture/.gitkeep +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/agent-memory/debugging/.gitkeep +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/agent-memory/gotchas/.gitkeep +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/agent-memory/patterns/.gitkeep +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/agent-memory/performance/.gitkeep +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/artifacts/adr.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/artifacts/api-change-report.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/artifacts/feature-spec.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/artifacts/release-plan.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/artifacts/runbook.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/artifacts/security-review.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/artifacts/test-plan.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/agents/data-workflow-agent.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/agents/founder-prototype-agent.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/agents/internal-tools-builder.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/agents/pm-copilot.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/agents/staff-pm-reviewer.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/agents/support-ticket-engineer.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/packs/devops-and-release/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/packs/devops-and-release/pack.yaml +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/packs/engineering-core/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/packs/engineering-core/pack.yaml +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/packs/non-engineer-builder/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/packs/non-engineer-builder/pack.yaml +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/packs/onboarding-and-docs/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/packs/onboarding-and-docs/pack.yaml +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/packs/product-to-code/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/packs/product-to-code/pack.yaml +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/packs/quality-and-review/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/packs/quality-and-review/pack.yaml +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/packs/security-and-compliance/README.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/packs/security-and-compliance/pack.yaml +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/rules/ai-working-agreement.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/rules/ambiguity-resolution.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/rules/branch-and-pr-policy.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/rules/compliance-policy.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/rules/non-engineer-safe-coding.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/rules/pii-policy.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/rules/production-data-policy.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/rules/prompt-to-task-conversion.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/rules/prototype-boundaries.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/rules/secrets-policy.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/skills/customer-issue-to-fix/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/skills/feature-from-idea/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/skills/prompt-to-safe-task/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/skills/prototype-to-production/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/skills/repo-onboarding/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/skills/review-scope/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/skills/review-sprint/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/skills/review-sprint-plan/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/org/skills/review-ux-flow/SKILL.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/backend/go/net-http/rules/go-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/backend/python/fastapi/rules/fastapi-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/db/mongodb/agents/migration-specialist.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/db/mongodb/agents/mongodb-specialist.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/db/mongodb/rules/mongodb-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/db/postgres/agents/db-performance-reviewer.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/db/postgres/agents/migration-specialist.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/db/postgres/agents/postgres-specialist.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/db/postgres/rules/database-performance.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/db/postgres/rules/postgres-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/frontend/react/rules/design-system-compliance.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/frontend/react/rules/mobile-design-guidelines.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/frontend/react/rules/react-patterns.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/frontend/react/rules/ui-design-system.md +0 -0
- {claude_code_kit-0.25.0 → claude_code_kit-0.26.0}/templates/stacks/frontend/react/rules/ux-patterns.md +0 -0
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"name": "claude-kit",
|
|
11
11
|
"source": "./",
|
|
12
12
|
"description": "Cookiecutter-style scaffolder for an autonomous Claude Code SDLC config (no app code, no Docker): install CLAUDE.md + .claude/ (rules, the profile's agents/skills, hooks, artifact templates) + optional .mcp.json, then run /sdlc to drive spec → review → build → test → security → ship through profile-aware quality gates, working memory, and a self-improving learnings loop.",
|
|
13
|
-
"version": "0.
|
|
13
|
+
"version": "0.26.0",
|
|
14
14
|
"license": "MIT",
|
|
15
15
|
"keywords": ["sdlc", "agents", "orchestration", "quality-gates", "workflow", "scaffold", "cookiecutter"]
|
|
16
16
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "claude-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"description": "Cookiecutter-style scaffolder for an autonomous Claude Code SDLC config (no app code, no Docker). `claude-kit init` asks ordered questions and installs CLAUDE.md + .claude/ (rules, the profile's agents/skills, hooks, artifact templates) + optional .mcp.json; run /sdlc to drive spec → review → build → test → security → ship through profile-aware quality gates with working memory and a self-improving learnings loop.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Arjunsingh Yadav",
|
|
@@ -4,6 +4,41 @@ All notable changes to claude-kit are documented here. The format follows
|
|
|
4
4
|
[Keep a Changelog](https://keepachangelog.com/), and the project uses
|
|
5
5
|
[semantic versioning](https://semver.org/).
|
|
6
6
|
|
|
7
|
+
## [0.26.0] — 2026-06-24
|
|
8
|
+
|
|
9
|
+
**Post-hardening follow-up: two correctness/security fixes plus polish, all from a verified review
|
|
10
|
+
punch list.**
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- **Plugin now guards secret-file reads out of the box.** `protect-secrets` (PreToolUse/Read — blocks
|
|
14
|
+
reading `.env`/`.pem`/`.key`/`id_rsa`/credentials/…) was installed by the pip CLI (it's in the
|
|
15
|
+
`standard`/`all` profiles) but missing from the always-on plugin hook set, so plugin-only users had
|
|
16
|
+
no Read guard until they ran an init. It's now in `PLUGIN_HOOK_IDS`; `hooks/hooks.json` gains a
|
|
17
|
+
`PreToolUse`/`Read` group.
|
|
18
|
+
- **`.github/dependabot.yml`** for the `github-actions` ecosystem (weekly, grouped) so CI/publish
|
|
19
|
+
actions are kept current and SHA-pinned by Dependabot's PRs, with auditable tag comments.
|
|
20
|
+
`pypa/gh-action-pypi-publish` stays on `release/v1` (required for Trusted Publishing + attestations).
|
|
21
|
+
|
|
22
|
+
### Changed
|
|
23
|
+
- **`pipeline close-gate` enforces the blocking-findings rule.** It now refuses to record a gate as
|
|
24
|
+
passed while any **critical/high/medium** findings are open (`rules/quality-gates.md`); low/cosmetic
|
|
25
|
+
still pass. A deliberate override requires `--force` **with** `--override-reason "<why>"`, recorded
|
|
26
|
+
under `gate_overrides[gate]` for human review.
|
|
27
|
+
- **`pipeline validate` re-checks gate evidence.** When a gate is recorded passed and has a
|
|
28
|
+
`gate_evidence` path, validate now fails if that file no longer exists on disk, and surfaces any
|
|
29
|
+
force-closed gate. Lenient on the upgrade path (no evidence map → silent; partial map → warn).
|
|
30
|
+
- **Inline hook guards quiet their `jq` calls** (`2>/dev/null || true`) so malformed/missing hook JSON
|
|
31
|
+
can't spam stderr — matching the script-backed guards; `guard-secrets.sh` aligned for consistency.
|
|
32
|
+
|
|
33
|
+
### Fixed
|
|
34
|
+
- **Docs consistency checker catches duplicate gate tables.** `check_docs_consistency.py` previously
|
|
35
|
+
keyed profile gate rows in a dict, so a second (possibly stale) table could silently overwrite an
|
|
36
|
+
earlier one; it now collects every occurrence, flags duplicates, and requires each to match
|
|
37
|
+
`profiles.yaml`.
|
|
38
|
+
- **Stale comments in `scripts/init.sh`** corrected: it's described as the degraded, no-resolution
|
|
39
|
+
fallback (the pip CLI is the catalog-driven/upgrade-safe installer), and existing files are noted as
|
|
40
|
+
written to `*.claude-kit` sidecars (not `*.example`).
|
|
41
|
+
|
|
7
42
|
## [0.25.0] — 2026-06-24
|
|
8
43
|
|
|
9
44
|
**PR4 of the phased hardening review: supply-chain provenance, an explicit trust model, and a full
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-code-kit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.26.0
|
|
4
4
|
Summary: Cookiecutter-style scaffolder for an autonomous Claude Code SDLC configuration (no app code, no Docker). Asks ordered questions and installs CLAUDE.md + .claude/ (rules, the chosen profile's agents/skills, hooks, artifact templates) + optional .mcp.json; run /sdlc to drive spec → review → build → test → security → ship through profile-aware quality gates, working memory, and a self-improving learnings loop.
|
|
5
5
|
Project-URL: Homepage, https://github.com/ajyadav013/claude-kit
|
|
6
6
|
Project-URL: Repository, https://github.com/ajyadav013/claude-kit
|
|
@@ -29,11 +29,11 @@
|
|
|
29
29
|
"hooks": [
|
|
30
30
|
{
|
|
31
31
|
"type": "command",
|
|
32
|
-
"command": "command -v jq >/dev/null 2>&1 || exit 0; CMD=$(jq -r '.tool_input.command'); if echo \"$CMD\" | grep -qE 'rm[[:space:]]+-[^[:space:]]*r[^[:space:]]*f'; then echo 'BLOCKED: rm -rf is disabled by claude-kit. Move to trash or delete specific paths explicitly.' >&2; exit 2; fi"
|
|
32
|
+
"command": "command -v jq >/dev/null 2>&1 || exit 0; CMD=$(jq -r '.tool_input.command' 2>/dev/null || true); if echo \"$CMD\" | grep -qE 'rm[[:space:]]+-[^[:space:]]*r[^[:space:]]*f'; then echo 'BLOCKED: rm -rf is disabled by claude-kit. Move to trash or delete specific paths explicitly.' >&2; exit 2; fi"
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
35
|
"type": "command",
|
|
36
|
-
"command": "command -v jq >/dev/null 2>&1 || exit 0; CMD=$(jq -r '.tool_input.command'); if echo \"$CMD\" | grep -qE 'git[[:space:]]+push.*[[:space:]:](main|master)([[:space:]]|$)'; then echo 'BLOCKED: refusing to push to main/master — use a feature branch and a PR.' >&2; exit 2; fi"
|
|
36
|
+
"command": "command -v jq >/dev/null 2>&1 || exit 0; CMD=$(jq -r '.tool_input.command' 2>/dev/null || true); if echo \"$CMD\" | grep -qE 'git[[:space:]]+push.*[[:space:]:](main|master)([[:space:]]|$)'; then echo 'BLOCKED: refusing to push to main/master — use a feature branch and a PR.' >&2; exit 2; fi"
|
|
37
37
|
},
|
|
38
38
|
{
|
|
39
39
|
"type": "command",
|
|
@@ -49,6 +49,15 @@
|
|
|
49
49
|
}
|
|
50
50
|
]
|
|
51
51
|
},
|
|
52
|
+
{
|
|
53
|
+
"matcher": "Read",
|
|
54
|
+
"hooks": [
|
|
55
|
+
{
|
|
56
|
+
"type": "command",
|
|
57
|
+
"command": "command -v jq >/dev/null 2>&1 || exit 0; FP=$(jq -r '.tool_input.file_path // empty' 2>/dev/null || true); if echo \"$FP\" | grep -qE '(^|/)\\.env$|\\.pem$|\\.key$|(^|/)id_rsa|(^|/)id_ed25519|(^|/)credentials(\\.json)?$|\\.p12$'; then echo 'BLOCKED: refusing to read a secrets file. Use .env.example or a secret manager.' >&2; exit 2; fi"
|
|
58
|
+
}
|
|
59
|
+
]
|
|
60
|
+
},
|
|
52
61
|
{
|
|
53
62
|
"matcher": "Edit|Write",
|
|
54
63
|
"hooks": [
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
# Pairs with the secret-scanner agent and the protect-secrets read-guard — this is the automatic,
|
|
4
4
|
# every-commit guardrail. Degrades to a no-op when not a git commit or git/jq is unavailable.
|
|
5
5
|
command -v jq >/dev/null 2>&1 || exit 0
|
|
6
|
-
CMD=$(jq -r '.tool_input.command // empty' 2>/dev/null)
|
|
6
|
+
CMD=$(jq -r '.tool_input.command // empty' 2>/dev/null || true)
|
|
7
7
|
echo "$CMD" | grep -qE 'git[[:space:]]+commit' || exit 0
|
|
8
8
|
cd "${CLAUDE_PROJECT_DIR:-.}" 2>/dev/null || exit 0
|
|
9
9
|
command -v git >/dev/null 2>&1 || exit 0
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "claude-code-kit"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.26.0"
|
|
8
8
|
description = "Cookiecutter-style scaffolder for an autonomous Claude Code SDLC configuration (no app code, no Docker). Asks ordered questions and installs CLAUDE.md + .claude/ (rules, the chosen profile's agents/skills, hooks, artifact templates) + optional .mcp.json; run /sdlc to drive spec → review → build → test → security → ship through profile-aware quality gates, working memory, and a self-improving learnings loop."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.9"
|
|
@@ -39,10 +39,14 @@ Schema (keep it small and truthful — omit a field rather than guess it):
|
|
|
39
39
|
"lanes": { "<lane>": "not-started | in-progress | passed | failed" },
|
|
40
40
|
"last_gate_passed": "<gate token, e.g. code-review>",
|
|
41
41
|
"open_findings": { "critical": 0, "high": 0, "medium": 0 },
|
|
42
|
+
"gate_evidence": { "<gate token>": "<path to the evidence artifact>" },
|
|
43
|
+
"gate_overrides": { "<gate token>": "<why a blocking gate was force-closed>" },
|
|
42
44
|
"next": "<the immediate next action>"
|
|
43
45
|
}
|
|
44
46
|
```
|
|
45
47
|
|
|
48
|
+
A gate is PASS only when zero **critical/high/medium** findings remain open (low/cosmetic may pass with notes). `gate_evidence` records the artifact backing each passed gate; `gate_overrides` is written **only** when a gate is deliberately force-closed despite open blocking findings, so a reviewer (or `claude-kit pipeline validate`) can surface and re-examine it.
|
|
49
|
+
|
|
46
50
|
**Resume by reloading, not by re-running.** On resume, read the snapshot as *context* to decide where to continue — then continue from there. Do **not** re-run setup that already ran, re-apply edits already committed, or re-open a gate already PASSed. Re-enter at the first gate *after* `last_gate_passed`, re-running only un-passed or defect-affected lanes. The snapshot records what was *true when written*, so the verify-before-trust check still applies (`.claude/rules/agent-memory.md`): if a "passed" gate's artifact is gone, treat it as not passed. If the snapshot is absent or unparseable, fall back to the freeform CONTINUITY state (back-compatible) and proceed.
|
|
47
51
|
|
|
48
52
|
## Concurrency
|
|
@@ -183,13 +183,17 @@ def _effective_gates() -> dict[str, set[str]]:
|
|
|
183
183
|
return {name: resolve(name) for name in profiles}
|
|
184
184
|
|
|
185
185
|
|
|
186
|
-
def _doc_gate_sets(relfile: str) -> dict[str, set[str]]:
|
|
187
|
-
"""Parse
|
|
188
|
-
|
|
186
|
+
def _doc_gate_sets(relfile: str) -> dict[str, list[set[str]]]:
|
|
187
|
+
"""Parse *every* lean/standard/enterprise gate row from a doc (one entry per table occurrence).
|
|
188
|
+
|
|
189
|
+
Returns a list of gate sets per profile rather than a single value, so a second (possibly stale)
|
|
190
|
+
gate table can't silently overwrite an earlier one — each occurrence is checked independently.
|
|
191
|
+
"""
|
|
192
|
+
raw: dict[str, list[str]] = {}
|
|
189
193
|
for line in _read(relfile).splitlines():
|
|
190
194
|
m = re.match(r"\|\s*\*\*(lean|standard|enterprise)\*\*\s*\|(.+?)\|\s*$", line)
|
|
191
195
|
if m:
|
|
192
|
-
raw
|
|
196
|
+
raw.setdefault(m.group(1), []).append(m.group(2))
|
|
193
197
|
|
|
194
198
|
def tokens(cell: str) -> set[str]:
|
|
195
199
|
return {
|
|
@@ -198,16 +202,18 @@ def _doc_gate_sets(relfile: str) -> dict[str, set[str]]:
|
|
|
198
202
|
if t.strip().strip("*").strip("\\").strip()
|
|
199
203
|
}
|
|
200
204
|
|
|
201
|
-
def expand(
|
|
202
|
-
cell = raw[profile]
|
|
205
|
+
def expand(cell: str) -> set[str]:
|
|
203
206
|
if (
|
|
204
207
|
"+" in cell
|
|
205
208
|
): # e.g. "standard + pipeline-green · observability-ready · acceptance"
|
|
206
209
|
base, extra = cell.split("+", 1)
|
|
207
|
-
|
|
210
|
+
base_name = base.strip().strip("*").lower()
|
|
211
|
+
base_cells = raw.get(base_name)
|
|
212
|
+
base_gates = expand(base_cells[0]) if base_cells else set()
|
|
213
|
+
return base_gates | tokens(extra)
|
|
208
214
|
return tokens(cell)
|
|
209
215
|
|
|
210
|
-
return {p: expand(
|
|
216
|
+
return {p: [expand(c) for c in cells] for p, cells in raw.items()}
|
|
211
217
|
|
|
212
218
|
|
|
213
219
|
def check_profile_gates() -> list[str]:
|
|
@@ -216,21 +222,30 @@ def check_profile_gates() -> list[str]:
|
|
|
216
222
|
for relfile in ("README.md", "skills/sdlc/SKILL.md"):
|
|
217
223
|
doc = _doc_gate_sets(relfile)
|
|
218
224
|
for profile in ("lean", "standard", "enterprise"):
|
|
219
|
-
|
|
225
|
+
occurrences = doc.get(profile) or []
|
|
226
|
+
if not occurrences:
|
|
220
227
|
errors.append(f"{relfile}: no gate row found for profile {profile!r}")
|
|
221
228
|
continue
|
|
222
|
-
if
|
|
223
|
-
missing = effective[profile] - doc[profile]
|
|
224
|
-
extra = doc[profile] - effective[profile]
|
|
225
|
-
detail = []
|
|
226
|
-
if missing:
|
|
227
|
-
detail.append(f"missing {sorted(missing)}")
|
|
228
|
-
if extra:
|
|
229
|
-
detail.append(f"unexpected {sorted(extra)}")
|
|
229
|
+
if len(occurrences) > 1:
|
|
230
230
|
errors.append(
|
|
231
|
-
f"{relfile}: {
|
|
232
|
-
|
|
231
|
+
f"{relfile}: {len(occurrences)} gate rows for profile {profile!r} "
|
|
232
|
+
"(duplicate gate table) — keep exactly one so a stale table can't hide "
|
|
233
|
+
"behind a correct one"
|
|
233
234
|
)
|
|
235
|
+
for idx, gates in enumerate(occurrences):
|
|
236
|
+
if gates != effective[profile]:
|
|
237
|
+
missing = effective[profile] - gates
|
|
238
|
+
extra = gates - effective[profile]
|
|
239
|
+
detail = []
|
|
240
|
+
if missing:
|
|
241
|
+
detail.append(f"missing {sorted(missing)}")
|
|
242
|
+
if extra:
|
|
243
|
+
detail.append(f"unexpected {sorted(extra)}")
|
|
244
|
+
where = "" if len(occurrences) == 1 else f" (occurrence {idx + 1})"
|
|
245
|
+
errors.append(
|
|
246
|
+
f"{relfile}: {profile} gate row{where} disagrees with "
|
|
247
|
+
"profiles.yaml — " + "; ".join(detail)
|
|
248
|
+
)
|
|
234
249
|
return errors
|
|
235
250
|
|
|
236
251
|
|
|
@@ -5,13 +5,15 @@
|
|
|
5
5
|
# project's .claude/ directory and drops a generic CLAUDE.md at the project root.
|
|
6
6
|
#
|
|
7
7
|
# Used by the /claude-kit:init slash command (plugin) and runnable directly from a checkout.
|
|
8
|
-
#
|
|
8
|
+
# This is a degraded, no-resolution fallback: it copies the full payload as-is. The pip CLI
|
|
9
|
+
# (`claude-kit init`) is the recommended installer — it is catalog-driven (stack/profile/MCP
|
|
10
|
+
# resolution) and upgrade-safe (diff/upgrade), which this script does not do.
|
|
9
11
|
#
|
|
10
12
|
# Usage: init.sh [TARGET_DIR] [--defaults] [--force] [--minimal] [--no-hooks]
|
|
11
13
|
# TARGET_DIR project to scaffold into (default: $CLAUDE_PROJECT_DIR or current dir)
|
|
12
14
|
# --defaults accepted for parity with the pip CLI (`claude-kit init --defaults`); a no-op here
|
|
13
15
|
# because this shell fallback is already non-interactive
|
|
14
|
-
# --force overwrite existing CLAUDE.md / settings.json (otherwise written as *.
|
|
16
|
+
# --force overwrite existing CLAUDE.md / settings.json (otherwise written as *.claude-kit sidecars)
|
|
15
17
|
# --minimal only CLAUDE.md + rules/ (skip agents, skills, hooks, memory)
|
|
16
18
|
# --no-hooks skip installing hook scripts and settings.json
|
|
17
19
|
set -euo pipefail
|
|
@@ -381,9 +381,27 @@ def pipeline_close_gate(
|
|
|
381
381
|
..., "--evidence", help="path to the evidence artifact for this gate"
|
|
382
382
|
),
|
|
383
383
|
path: str = typer.Argument(".", help="target project dir (default: .)"),
|
|
384
|
+
force: bool = typer.Option(
|
|
385
|
+
False,
|
|
386
|
+
"--force",
|
|
387
|
+
help="close the gate despite open critical/high/medium findings (requires --override-reason)",
|
|
388
|
+
),
|
|
389
|
+
override_reason: Optional[str] = typer.Option(
|
|
390
|
+
None,
|
|
391
|
+
"--override-reason",
|
|
392
|
+
help="justification recorded when --force bypasses open blocking findings",
|
|
393
|
+
),
|
|
384
394
|
) -> None:
|
|
385
|
-
"""Record a quality gate as passed, with an evidence file, in the pipeline snapshot.
|
|
386
|
-
|
|
395
|
+
"""Record a quality gate as passed, with an evidence file, in the pipeline snapshot.
|
|
396
|
+
|
|
397
|
+
Refuses to pass a gate while critical/high/medium findings are open unless --force is given with
|
|
398
|
+
an --override-reason (recorded for human review).
|
|
399
|
+
"""
|
|
400
|
+
_print_report(
|
|
401
|
+
*pipeline.close_gate(
|
|
402
|
+
path, gate, evidence, force=force, override_reason=override_reason
|
|
403
|
+
)
|
|
404
|
+
)
|
|
387
405
|
|
|
388
406
|
|
|
389
407
|
@pipeline_app.command("abort")
|
|
@@ -19,7 +19,7 @@ from typing import Any
|
|
|
19
19
|
|
|
20
20
|
_RM_RF_GUARD = (
|
|
21
21
|
"command -v jq >/dev/null 2>&1 || exit 0; "
|
|
22
|
-
"CMD=$(jq -r '.tool_input.command'); "
|
|
22
|
+
"CMD=$(jq -r '.tool_input.command' 2>/dev/null || true); "
|
|
23
23
|
"if echo \"$CMD\" | grep -qE 'rm[[:space:]]+-[^[:space:]]*r[^[:space:]]*f'; then "
|
|
24
24
|
"echo 'BLOCKED: rm -rf is disabled by claude-kit. Move to trash or delete specific paths "
|
|
25
25
|
"explicitly.' >&2; exit 2; fi"
|
|
@@ -30,7 +30,7 @@ _RM_RF_GUARD = (
|
|
|
30
30
|
# (maintenance, mainframe-fix, remaster-ui, domain-model) are NOT blocked.
|
|
31
31
|
_PUSH_GUARD = (
|
|
32
32
|
"command -v jq >/dev/null 2>&1 || exit 0; "
|
|
33
|
-
"CMD=$(jq -r '.tool_input.command'); "
|
|
33
|
+
"CMD=$(jq -r '.tool_input.command' 2>/dev/null || true); "
|
|
34
34
|
"if echo \"$CMD\" | grep -qE 'git[[:space:]]+push.*[[:space:]:](main|master)([[:space:]]|$)'; "
|
|
35
35
|
"then echo 'BLOCKED: refusing to push to main/master — use a feature branch and a PR.' >&2; "
|
|
36
36
|
"exit 2; fi"
|
|
@@ -38,7 +38,7 @@ _PUSH_GUARD = (
|
|
|
38
38
|
|
|
39
39
|
_SECRETS_GUARD = (
|
|
40
40
|
"command -v jq >/dev/null 2>&1 || exit 0; "
|
|
41
|
-
"FP=$(jq -r '.tool_input.file_path // empty'); "
|
|
41
|
+
"FP=$(jq -r '.tool_input.file_path // empty' 2>/dev/null || true); "
|
|
42
42
|
'if echo "$FP" | grep -qE \'(^|/)\\.env$|\\.pem$|\\.key$|(^|/)id_rsa|(^|/)id_ed25519|'
|
|
43
43
|
"(^|/)credentials(\\.json)?$|\\.p12$'; then "
|
|
44
44
|
"echo 'BLOCKED: refusing to read a secrets file. Use .env.example or a secret manager.' >&2; "
|
|
@@ -244,6 +244,7 @@ PLUGIN_HOOK_IDS: frozenset[str] = frozenset(
|
|
|
244
244
|
"guard-rm-rf",
|
|
245
245
|
"guard-push-main",
|
|
246
246
|
"guard-destructive-git",
|
|
247
|
+
"protect-secrets",
|
|
247
248
|
"guard-commit-secrets",
|
|
248
249
|
"warn-shared-modules",
|
|
249
250
|
"warn-llm-io",
|
|
@@ -27,6 +27,9 @@ SCOPES = frozenset({"individual", "team", "organization"})
|
|
|
27
27
|
MODES = frozenset({"A", "B", "C", "D"})
|
|
28
28
|
LANE_STATES = frozenset({"not-started", "in-progress", "passed", "failed"})
|
|
29
29
|
FINDING_KEYS = frozenset({"critical", "high", "medium", "low"})
|
|
30
|
+
#: Severities that block a gate (rules/quality-gates.md: a gate is PASS only with zero of these;
|
|
31
|
+
#: low/cosmetic may pass with notes). Ordered for stable messages.
|
|
32
|
+
BLOCKING_FINDINGS = ("critical", "high", "medium")
|
|
30
33
|
|
|
31
34
|
|
|
32
35
|
def _snapshot_path(target: str | Path) -> Path:
|
|
@@ -73,6 +76,23 @@ def _selection(target: str | Path) -> dict[str, Any]:
|
|
|
73
76
|
return sel if isinstance(sel, dict) else {}
|
|
74
77
|
|
|
75
78
|
|
|
79
|
+
def _blocking_findings(snap: dict[str, Any]) -> dict[str, int]:
|
|
80
|
+
"""Return the ``{severity: count}`` of open findings that block a gate (count > 0).
|
|
81
|
+
|
|
82
|
+
Only :data:`BLOCKING_FINDINGS` severities count; malformed/absent counts are ignored (lenient
|
|
83
|
+
for older or partial snapshots).
|
|
84
|
+
"""
|
|
85
|
+
raw = snap.get("open_findings")
|
|
86
|
+
if not isinstance(raw, dict):
|
|
87
|
+
return {}
|
|
88
|
+
out: dict[str, int] = {}
|
|
89
|
+
for sev in BLOCKING_FINDINGS:
|
|
90
|
+
count = raw.get(sev, 0)
|
|
91
|
+
if isinstance(count, int) and not isinstance(count, bool) and count > 0:
|
|
92
|
+
out[sev] = count
|
|
93
|
+
return out
|
|
94
|
+
|
|
95
|
+
|
|
76
96
|
def validate(target: str | Path) -> tuple[bool, list[str]]:
|
|
77
97
|
"""Validate the pipeline snapshot's shape and coherence (no writes).
|
|
78
98
|
|
|
@@ -136,6 +156,31 @@ def validate(target: str | Path) -> tuple[bool, list[str]]:
|
|
|
136
156
|
if gate is not None and gates and gate not in gates:
|
|
137
157
|
fail(f"last_gate_passed {gate!r} is not a gate of this profile ({gates})")
|
|
138
158
|
|
|
159
|
+
overrides = snap.get("gate_overrides")
|
|
160
|
+
if overrides is not None and not isinstance(overrides, dict):
|
|
161
|
+
fail("gate_overrides must be an object of {gate: reason}")
|
|
162
|
+
|
|
163
|
+
# A recorded gate's evidence artifact must still exist on disk. Lenient on the upgrade path:
|
|
164
|
+
# a snapshot with no gate_evidence map at all simply doesn't track evidence (the norm for
|
|
165
|
+
# orchestrator-written snapshots) — stay silent; only flag a *partial* map that omits this gate.
|
|
166
|
+
if gate is not None:
|
|
167
|
+
evidence_map = snap.get("gate_evidence")
|
|
168
|
+
if isinstance(evidence_map, dict) and gate in evidence_map:
|
|
169
|
+
ev = evidence_map[gate]
|
|
170
|
+
if not (isinstance(ev, str) and Path(ev).expanduser().is_file()):
|
|
171
|
+
fail(
|
|
172
|
+
f"last_gate_passed {gate!r} is recorded passed but its evidence file is "
|
|
173
|
+
f"missing: {ev!r}"
|
|
174
|
+
)
|
|
175
|
+
elif isinstance(evidence_map, dict):
|
|
176
|
+
msgs.append(
|
|
177
|
+
f"WARN last_gate_passed {gate!r} has no recorded gate_evidence path"
|
|
178
|
+
)
|
|
179
|
+
if isinstance(overrides, dict) and gate in overrides:
|
|
180
|
+
msgs.append(
|
|
181
|
+
f"WARN gate {gate!r} was force-closed (override: {overrides[gate]!r}) — review"
|
|
182
|
+
)
|
|
183
|
+
|
|
139
184
|
for field in ("task", "stage", "next"):
|
|
140
185
|
if field not in snap or snap[field] is None:
|
|
141
186
|
msgs.append(f"WARN snapshot has no {field!r} (resume context is weaker)")
|
|
@@ -176,13 +221,23 @@ def status(target: str | Path) -> tuple[bool, list[str]]:
|
|
|
176
221
|
|
|
177
222
|
|
|
178
223
|
def close_gate(
|
|
179
|
-
target: str | Path,
|
|
224
|
+
target: str | Path,
|
|
225
|
+
gate: str,
|
|
226
|
+
evidence: str | Path,
|
|
227
|
+
*,
|
|
228
|
+
force: bool = False,
|
|
229
|
+
override_reason: str | None = None,
|
|
180
230
|
) -> tuple[bool, list[str]]:
|
|
181
231
|
"""Record ``gate`` as passed (with an evidence artifact) in the snapshot.
|
|
182
232
|
|
|
183
233
|
Validates that the evidence file exists and that ``gate`` is a real gate for the installed
|
|
184
|
-
profile,
|
|
185
|
-
|
|
234
|
+
profile, **refuses to pass a gate while critical/high/medium findings are open** (per
|
|
235
|
+
``rules/quality-gates.md``), then sets ``last_gate_passed`` and stores the evidence path. Seeds a
|
|
236
|
+
minimal snapshot (profile/scope from the install snapshot) if no run snapshot exists yet.
|
|
237
|
+
|
|
238
|
+
A forced close (``force=True`` with a non-empty ``override_reason``) bypasses the blocking-findings
|
|
239
|
+
rule but records the reason under ``gate_overrides[gate]`` so ``validate``/``status`` can surface it
|
|
240
|
+
for human review.
|
|
186
241
|
"""
|
|
187
242
|
msgs: list[str] = []
|
|
188
243
|
evidence_path = Path(evidence).expanduser().resolve()
|
|
@@ -212,6 +267,30 @@ def close_gate(
|
|
|
212
267
|
"stage": gate,
|
|
213
268
|
}
|
|
214
269
|
|
|
270
|
+
blocking = _blocking_findings(snap)
|
|
271
|
+
if blocking:
|
|
272
|
+
rendered = ", ".join(f"{sev}={count}" for sev, count in blocking.items())
|
|
273
|
+
if not force:
|
|
274
|
+
return False, [
|
|
275
|
+
f"FAIL cannot close {gate!r}: {rendered} open finding(s) must be resolved first "
|
|
276
|
+
"(critical/high/medium block a gate per quality-gates.md). "
|
|
277
|
+
"Re-run with --force --override-reason '<why>' to record a deliberate override."
|
|
278
|
+
]
|
|
279
|
+
if not (override_reason and override_reason.strip()):
|
|
280
|
+
return False, [
|
|
281
|
+
"FAIL --force requires --override-reason '<why>' explaining why the open "
|
|
282
|
+
f"finding(s) ({rendered}) are being bypassed"
|
|
283
|
+
]
|
|
284
|
+
overrides = snap.get("gate_overrides")
|
|
285
|
+
if not isinstance(overrides, dict):
|
|
286
|
+
overrides = {}
|
|
287
|
+
overrides[gate] = override_reason.strip()
|
|
288
|
+
snap["gate_overrides"] = overrides
|
|
289
|
+
msgs.append(
|
|
290
|
+
f"WARN gate {gate!r} force-closed with open findings ({rendered}): "
|
|
291
|
+
f"{override_reason.strip()}"
|
|
292
|
+
)
|
|
293
|
+
|
|
215
294
|
snap["last_gate_passed"] = gate
|
|
216
295
|
evidence_map = snap.get("gate_evidence")
|
|
217
296
|
if not isinstance(evidence_map, dict):
|
|
@@ -26,11 +26,11 @@
|
|
|
26
26
|
"hooks": [
|
|
27
27
|
{
|
|
28
28
|
"type": "command",
|
|
29
|
-
"command": "command -v jq >/dev/null 2>&1 || exit 0; CMD=$(jq -r '.tool_input.command'); if echo \"$CMD\" | grep -qE 'rm[[:space:]]+-[^[:space:]]*r[^[:space:]]*f'; then echo 'BLOCKED: rm -rf is disabled by claude-kit. Move to trash or delete specific paths explicitly.' >&2; exit 2; fi"
|
|
29
|
+
"command": "command -v jq >/dev/null 2>&1 || exit 0; CMD=$(jq -r '.tool_input.command' 2>/dev/null || true); if echo \"$CMD\" | grep -qE 'rm[[:space:]]+-[^[:space:]]*r[^[:space:]]*f'; then echo 'BLOCKED: rm -rf is disabled by claude-kit. Move to trash or delete specific paths explicitly.' >&2; exit 2; fi"
|
|
30
30
|
},
|
|
31
31
|
{
|
|
32
32
|
"type": "command",
|
|
33
|
-
"command": "command -v jq >/dev/null 2>&1 || exit 0; CMD=$(jq -r '.tool_input.command'); if echo \"$CMD\" | grep -qE 'git[[:space:]]+push.*[[:space:]:](main|master)([[:space:]]|$)'; then echo 'BLOCKED: refusing to push to main/master — use a feature branch and a PR.' >&2; exit 2; fi"
|
|
33
|
+
"command": "command -v jq >/dev/null 2>&1 || exit 0; CMD=$(jq -r '.tool_input.command' 2>/dev/null || true); if echo \"$CMD\" | grep -qE 'git[[:space:]]+push.*[[:space:]:](main|master)([[:space:]]|$)'; then echo 'BLOCKED: refusing to push to main/master — use a feature branch and a PR.' >&2; exit 2; fi"
|
|
34
34
|
}
|
|
35
35
|
]
|
|
36
36
|
},
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|