claude-code-kit 0.20.0__tar.gz → 0.22.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.20.0 → claude_code_kit-0.22.0}/.claude-plugin/marketplace.json +1 -1
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/.claude-plugin/plugin.json +1 -1
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/CHANGELOG.md +98 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/PKG-INFO +7 -3
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/README.md +6 -2
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/catalog/mcp.yaml +19 -6
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/docs/stack-skills/README.md +6 -2
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/hooks.json +4 -3
- claude_code_kit-0.22.0/hooks/scripts/guard-kubectl-delete.sh +37 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/pyproject.toml +1 -1
- claude_code_kit-0.22.0/scripts/check_docs_consistency.py +257 -0
- claude_code_kit-0.22.0/skills/cron-and-scheduled-jobs/README.md +45 -0
- claude_code_kit-0.22.0/skills/cron-and-scheduled-jobs/SKILL.md +238 -0
- claude_code_kit-0.22.0/skills/cron-and-scheduled-jobs/references/choosing-and-operations.md +86 -0
- claude_code_kit-0.22.0/skills/cron-and-scheduled-jobs/references/kubernetes-cronjob.md +184 -0
- claude_code_kit-0.22.0/skills/cron-and-scheduled-jobs/references/repo-evidence.md +51 -0
- claude_code_kit-0.22.0/skills/cron-and-scheduled-jobs/references/temporal-schedules.md +112 -0
- claude_code_kit-0.22.0/skills/kubectl-operations/README.md +43 -0
- claude_code_kit-0.22.0/skills/kubectl-operations/SKILL.md +226 -0
- claude_code_kit-0.22.0/skills/kubectl-operations/references/command-reference.md +137 -0
- claude_code_kit-0.22.0/skills/kubectl-operations/references/context-namespace-rbac.md +91 -0
- claude_code_kit-0.22.0/skills/kubectl-operations/references/debugging-playbooks.md +122 -0
- claude_code_kit-0.22.0/skills/kubectl-operations/references/output-formats-and-selectors.md +125 -0
- claude_code_kit-0.22.0/skills/kubectl-operations/references/repo-evidence.md +59 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/sdlc/SKILL.md +1 -1
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/src/claude_kit/__init__.py +1 -1
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/src/claude_kit/catalog.py +12 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/src/claude_kit/cli.py +19 -4
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/src/claude_kit/hooks.py +3 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/src/claude_kit/models.py +27 -2
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/src/claude_kit/prompts.py +59 -3
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/src/claude_kit/scaffold.py +4 -1
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/src/claude_kit/upgrader.py +94 -28
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/.gitignore +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/CLAUDE.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/CONTRIBUTING.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/LICENSE +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/acceptance-reviewer.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/auditor.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/dependency-scanner.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/developer.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/devils-advocate.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/devops-engineer.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/e2e-tester.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/em-reviewer.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/incident-responder.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/merge-reviewer.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/observability-engineer.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/orchestrator.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/owasp-reviewer.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/policy-validator.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/pr-raiser.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/risk-classifier.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/sdlc-code-reviewer.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/secret-scanner.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/security-reviewer.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/senior-backend-dev.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/senior-frontend-dev.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/senior-tester.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/spec-doc-writer.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/story-planner.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/technical-architect.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/tester.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/ui-designer.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/agents/unit-tester.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/catalog/capture.yaml +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/catalog/org.yaml +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/catalog/profiles.yaml +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/catalog/stacks.yaml +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/commands/abort.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/commands/init.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/commands/sdlc.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/commands/status.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/docs/agentic-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/docs/agents.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/docs/architecture.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/docs/coverage-audit.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/docs/eval-harness.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/docs/org-capabilities.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/docs/stack-skills/GAP-ANALYSIS.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/docs/stack-skills/REPO-INVENTORY.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/audit-log.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/capture-learnings.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/guard-destructive-git.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/guard-secrets.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/lint-fix.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/load-autonomy.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/load-continuity.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/load-learnings.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/type-check.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/validate-frontmatter.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/validate-settings.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/warn-large-edits.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/warn-llm-io.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/warn-missing-tests.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/warn-sensitive-files.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/hooks/scripts/warn-shared-modules.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/agent-guardrails.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/agent-memory.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/agent-resilience.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/autonomy-levels.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/code-organization.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/continuity.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/design-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/devops-observability.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/documentation.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/evals.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/frontend-best-practices.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/goal-setting-and-monitoring.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/human-in-the-loop.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/linting-and-formatting.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/mandatory-workflow.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/model-tiers.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/quality-gates.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/rarv-cycle.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/reasoning-techniques.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/responsive-and-accessibility.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/risk-classification.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/testing.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/rules/tool-design.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/scripts/init.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/_references/accessibility-checklist.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/_references/orchestration-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/_references/performance-checklist.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/_references/security-checklist.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/_references/testing-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/accessibility-review/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/alembic-migrations/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/alembic-migrations/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/alembic-migrations/references/alembic-setup-and-env.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/alembic-migrations/references/async-and-multitenant-migrations.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/alembic-migrations/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/alembic-migrations/references/troubleshooting-and-debugging.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/alembic-migrations/references/writing-migrations.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/anthropic-vertex-integration/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/anthropic-vertex-integration/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/anthropic-vertex-integration/references/generate-helpers-and-retry.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/anthropic-vertex-integration/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/anthropic-vertex-integration/references/vertex-client-and-auth.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/api-and-interface-design/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/api-integration/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/api-pagination-filtering-sorting/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/api-pagination-filtering-sorting/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/api-pagination-filtering-sorting/references/query-params-conventions.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/api-pagination-filtering-sorting/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/api-pagination-filtering-sorting/references/response-metadata.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/archive-sprint/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/async-python-patterns/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/async-python-patterns/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/async-python-patterns/references/async-boundaries.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/async-python-patterns/references/lifecycle-and-gather.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/async-python-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/auth-and-rbac/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/auth-and-rbac/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/auth-and-rbac/references/auth-dependencies.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/auth-and-rbac/references/rbac-and-permissions.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/auth-and-rbac/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/auth-and-rbac/references/security-hardening.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/auth-and-rbac/references/tokens-and-hashing.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/backend-repo-architecture/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/backend-repo-architecture/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/backend-repo-architecture/references/deployment-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/backend-repo-architecture/references/entrypoint-and-config.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/backend-repo-architecture/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/backend-repo-architecture/references/structure-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/backend-repo-architecture/references/troubleshooting.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/backlog/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/backlog/item-template.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/browser-testing-with-devtools/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/bug-hunt/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/ci-cd-and-automation/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/code-review-and-quality/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/code-simplification/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/component-design/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/configargparse-yaml-env-layering/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/configargparse-yaml-env-layering/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/configargparse-yaml-env-layering/references/config-layering-anatomy.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/configargparse-yaml-env-layering/references/mode-dispatch-and-precedence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/configargparse-yaml-env-layering/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/consolidate-learnings/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/containerization-and-deployment/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/containerization-and-deployment/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/containerization-and-deployment/references/deployment-and-secrets.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/containerization-and-deployment/references/dockerfile-and-compose.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/containerization-and-deployment/references/entrypoint-and-modes.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/containerization-and-deployment/references/kerberos-kinit-bootstrap.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/containerization-and-deployment/references/makefile-dev-workflow.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/containerization-and-deployment/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/context-engineering/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/data-engineering-bigquery-gcs/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/data-engineering-bigquery-gcs/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/data-engineering-bigquery-gcs/references/bigquery-advanced-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/data-engineering-bigquery-gcs/references/bigquery-gcs-io.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/data-engineering-bigquery-gcs/references/medallion-architecture.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/data-engineering-bigquery-gcs/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/data-engineering-bigquery-gcs/references/temp-table-merge-pattern.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/debugging-and-error-recovery/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/decision/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/decision/adr-template.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/deprecation-and-migration/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/design-patterns-and-conventions/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/design-patterns-and-conventions/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/design-patterns-and-conventions/references/anti-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/design-patterns-and-conventions/references/naming-and-layout.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/design-patterns-and-conventions/references/patterns-catalog.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/design-patterns-and-conventions/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/design-patterns-and-conventions/references/testing-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/design-patterns-and-conventions/references/troubleshooting.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/docker-compose/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/docker-compose/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/docker-compose/references/compose-services-and-healthchecks.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/docker-compose/references/dev-vs-prod-variants.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/docker-compose/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/docker-shared/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/docker-shared/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/docker-shared/references/dockerignore-and-build-secrets.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/docker-shared/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/docker-shared/references/shared-base-images.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/docker-shared/references/shared-compose-fragments.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/dockerfile-backend/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/dockerfile-backend/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/dockerfile-backend/references/backend-dockerfile-anatomy.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/dockerfile-backend/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/dockerfile-backend/references/system-deps-and-caching.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/dockerfile-frontend/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/dockerfile-frontend/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/dockerfile-frontend/references/build-args-and-nginx.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/dockerfile-frontend/references/frontend-dockerfile-anatomy.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/dockerfile-frontend/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/documentation-and-adrs/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/doubt-driven-development/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/edge-to-service-trust-boundary/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/edge-to-service-trust-boundary/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/edge-to-service-trust-boundary/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/edge-to-service-trust-boundary/references/trust-contract.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/execute/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/fastapi-service-patterns/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/fastapi-service-patterns/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/fastapi-service-patterns/references/api-versioning.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/fastapi-service-patterns/references/app-factory-and-lifespan.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/fastapi-service-patterns/references/custom-route-and-middleware.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/fastapi-service-patterns/references/dependency-injection.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/fastapi-service-patterns/references/model-and-serialization-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/fastapi-service-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/file-export-and-reporting/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/file-export-and-reporting/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/file-export-and-reporting/references/excel-generation.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/file-export-and-reporting/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/file-export-and-reporting/references/streaming-and-downloads.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/frontend-repo-architecture/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/frontend-repo-architecture/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/frontend-repo-architecture/references/api-layer-and-types.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/frontend-repo-architecture/references/divergences.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/frontend-repo-architecture/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/frontend-repo-architecture/references/structure-and-state.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/frontend-repo-architecture/references/testing-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/frontend-ui-engineering/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/gcp-cloud-run-github-actions/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/gcp-cloud-run-github-actions/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/gcp-cloud-run-github-actions/references/cloud-run-deploy.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/gcp-cloud-run-github-actions/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/gcp-cloud-run-github-actions/references/workflow-structure.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/gcs-file-storage-patterns/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/gcs-file-storage-patterns/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/gcs-file-storage-patterns/references/client-and-uploads.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/gcs-file-storage-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/gcs-file-storage-patterns/references/signed-urls-and-reads.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/git-workflow-and-versioning/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/grafana-dashboards-and-alerts/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/grafana-dashboards-and-alerts/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/grafana-dashboards-and-alerts/references/dashboard-json-and-templating.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/grafana-dashboards-and-alerts/references/provisioning-and-organization.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/grafana-dashboards-and-alerts/references/red-metrics-queries.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/grafana-dashboards-and-alerts/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/grafana-dashboards-and-alerts/references/unified-alerting.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/graphql-patterns/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/graphql-patterns/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/graphql-patterns/references/apollo-client-frontend.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/graphql-patterns/references/apollo-client-setup.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/graphql-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/graphql-patterns/references/strawberry-backend.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/graphql-patterns/references/when-to-use-graphql.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/idea-refine/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/idea-refine/examples.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/idea-refine/frameworks.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/idea-refine/refinement-criteria.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/idea-refine/scripts/idea-refine.sh +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/incident-postmortem/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/incremental-implementation/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/interview-me/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/kafka-config-driven/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/kafka-config-driven/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/kafka-config-driven/references/config-and-sasl-kerberos.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/kafka-config-driven/references/consumer-producer-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/kafka-config-driven/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/kafka-config-driven/references/troubleshooting-and-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/kubernetes-workload-hardening/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/kubernetes-workload-hardening/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/kubernetes-workload-hardening/references/networkpolicy-and-rbac.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/kubernetes-workload-hardening/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/kubernetes-workload-hardening/references/securitycontext-and-podsecurity.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/langfuse-llm-tracing/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/langfuse-llm-tracing/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/langfuse-llm-tracing/references/langfuse-client-and-tracing.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/langfuse-llm-tracing/references/python-and-typescript.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/langfuse-llm-tracing/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/load-testing/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/manual-test/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/modernization-and-migration/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/modernization-and-migration/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/modernization-and-migration/references/migration-best-practices.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/modernization-and-migration/references/pydantic-v1-to-v2.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/modernization-and-migration/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/modernization-and-migration/references/shared-internal-library.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/modernization-and-migration/references/sqlalchemy-14-to-20.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/multi-tenancy-patterns/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/multi-tenancy-patterns/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/multi-tenancy-patterns/references/caching-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/multi-tenancy-patterns/references/isolation-strategies.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/multi-tenancy-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/multi-tenancy-patterns/references/tenant-resolution.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/node-express-service/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/node-express-service/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/node-express-service/references/app-factory-and-mode-dispatch.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/node-express-service/references/config-and-module-alias.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/node-express-service/references/middleware-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/node-express-service/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/node-objection-knex/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/node-objection-knex/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/node-objection-knex/references/migrations-and-validation.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/node-objection-knex/references/objection-model-and-knex.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/node-objection-knex/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/notifications-and-messaging/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/notifications-and-messaging/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/notifications-and-messaging/references/provider-abstraction.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/notifications-and-messaging/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/notifications-and-messaging/references/templates-and-fallback.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/observability-and-logging/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/observability-and-logging/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/observability-and-logging/references/health-and-readiness.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/observability-and-logging/references/logging-and-structlog.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/observability-and-logging/references/outbound-metrics-and-multi-mode.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/observability-and-logging/references/pii-redaction.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/observability-and-logging/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/observability-and-logging/references/tracing-and-metrics.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/over-engineering-review/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/performance-optimization/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/planning-and-task-breakdown/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/playwright-verification/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/pydantic-schema-patterns/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/pydantic-schema-patterns/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/pydantic-schema-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/pydantic-schema-patterns/references/settings-and-validation.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/pydantic-schema-patterns/references/troubleshooting-and-common-errors.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/pydantic-schema-patterns/references/v1-vs-v2.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/python-dao-and-database/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/python-dao-and-database/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/python-dao-and-database/references/advanced-query-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/python-dao-and-database/references/basedao-and-sessions.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/python-dao-and-database/references/mongodb-advanced.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/python-dao-and-database/references/other-db-mongodb.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/python-dao-and-database/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/python-dao-and-database/references/sqlalchemy-1x-vs-2x.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/radix-tailwind-component-patterns/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/radix-tailwind-component-patterns/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/radix-tailwind-component-patterns/references/radix-primitives-and-variants.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/radix-tailwind-component-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/radix-tailwind-component-patterns/references/tailwind-theme-and-cn.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/react-hook-form-zod-patterns/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/react-hook-form-zod-patterns/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/react-hook-form-zod-patterns/references/form-setup-and-zod.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/react-hook-form-zod-patterns/references/multi-step-and-modes.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/react-hook-form-zod-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/redis-caching-patterns/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/redis-caching-patterns/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/redis-caching-patterns/references/cache-manager-and-fallback.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/redis-caching-patterns/references/namespacing-and-invalidation.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/redis-caching-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/refresh-docs/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/remember/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/scope/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/scope/scope-template.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/security-and-hardening/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/security-verification/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/shannon-ai-pentest/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/shannon-ai-pentest/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/shannon-ai-pentest/references/operating-guide.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/shipping-and-launch/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/simplification-debt/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/smoke-test/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/source-driven-development/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/spec-driven-development/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/sprint/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/sprint/sprint-template.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/tanstack-react-query-patterns/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/tanstack-react-query-patterns/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/tanstack-react-query-patterns/references/mutations-and-cache.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/tanstack-react-query-patterns/references/query-keys-and-hooks.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/tanstack-react-query-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/task-tracker-sync/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/temporal-config-driven/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/temporal-config-driven/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/temporal-config-driven/references/config-and-retry-idempotency.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/temporal-config-driven/references/dag-dsl-interpreter.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/temporal-config-driven/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/temporal-config-driven/references/schedule-registration.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/temporal-config-driven/references/schedules-and-cron.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/temporal-config-driven/references/worker-workflow-activity-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/test-driven-development/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/test-plan-review/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/testing-conventions/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/testing-conventions/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/testing-conventions/references/async-and-mocking.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/testing-conventions/references/coverage-gap-and-recommendations.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/testing-conventions/references/github-actions-test-orchestration.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/testing-conventions/references/pytest-and-fixtures.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/testing-conventions/references/pytest-asyncio-modes.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/testing-conventions/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/testing-conventions/references/security-regression-tests.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/testing-conventions/references/vitest-frontend-testing.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/threat-model/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/triage/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/ui-ux-design/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/unit-test/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/using-agent-skills/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/vitest-rtl-msw-patterns/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/vitest-rtl-msw-patterns/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/vitest-rtl-msw-patterns/references/msw-and-contract-tests.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/vitest-rtl-msw-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/vitest-rtl-msw-patterns/references/vitest-rtl-setup.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/zap-vapt-scanning/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/zap-vapt-scanning/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/zap-vapt-scanning/references/operating-guide.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/zap-vapt-scanning/scripts/endpoints.example.txt +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/zap-vapt-scanning/scripts/requirements.txt +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/zap-vapt-scanning/scripts/zap_vapt.py +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/zustand-state-patterns/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/zustand-state-patterns/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/zustand-state-patterns/references/async-polling-and-persistence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/zustand-state-patterns/references/repo-evidence.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/skills/zustand-state-patterns/references/store-structure-and-selectors.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/src/claude_kit/__main__.py +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/src/claude_kit/render.py +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/src/claude_kit/validator.py +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/CLAUDE.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/CLAUDE.stack.md.tmpl +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/CONTINUITY.template.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/README.claude-sdlc.md.tmpl +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/agent-memory/MEMORY.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/agent-memory/api/.gitkeep +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/agent-memory/architecture/.gitkeep +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/agent-memory/debugging/.gitkeep +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/agent-memory/gotchas/.gitkeep +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/agent-memory/patterns/.gitkeep +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/agent-memory/performance/.gitkeep +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/artifacts/adr.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/artifacts/api-change-report.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/artifacts/feature-spec.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/artifacts/release-plan.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/artifacts/runbook.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/artifacts/security-review.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/artifacts/test-plan.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/agents/data-workflow-agent.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/agents/founder-prototype-agent.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/agents/internal-tools-builder.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/agents/pm-copilot.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/agents/staff-pm-reviewer.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/agents/support-ticket-engineer.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/packs/devops-and-release/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/packs/devops-and-release/pack.yaml +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/packs/engineering-core/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/packs/engineering-core/pack.yaml +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/packs/non-engineer-builder/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/packs/non-engineer-builder/pack.yaml +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/packs/onboarding-and-docs/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/packs/onboarding-and-docs/pack.yaml +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/packs/product-to-code/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/packs/product-to-code/pack.yaml +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/packs/quality-and-review/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/packs/quality-and-review/pack.yaml +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/packs/security-and-compliance/README.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/packs/security-and-compliance/pack.yaml +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/rules/ai-working-agreement.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/rules/ambiguity-resolution.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/rules/branch-and-pr-policy.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/rules/compliance-policy.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/rules/non-engineer-safe-coding.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/rules/pii-policy.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/rules/production-data-policy.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/rules/prompt-to-task-conversion.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/rules/prototype-boundaries.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/rules/secrets-policy.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/skills/customer-issue-to-fix/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/skills/feature-from-idea/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/skills/prompt-to-safe-task/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/skills/prototype-to-production/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/skills/repo-onboarding/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/skills/review-scope/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/skills/review-sprint/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/skills/review-sprint-plan/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/org/skills/review-ux-flow/SKILL.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/settings.json +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/stacks/backend/go/net-http/rules/go-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/stacks/backend/python/fastapi/rules/fastapi-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/stacks/db/mongodb/agents/migration-specialist.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/stacks/db/mongodb/agents/mongodb-specialist.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/stacks/db/mongodb/rules/mongodb-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/stacks/db/postgres/agents/db-performance-reviewer.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/stacks/db/postgres/agents/migration-specialist.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/stacks/db/postgres/agents/postgres-specialist.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/stacks/db/postgres/rules/database-performance.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/stacks/db/postgres/rules/postgres-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/stacks/frontend/react/rules/design-system-compliance.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/stacks/frontend/react/rules/mobile-design-guidelines.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/stacks/frontend/react/rules/react-patterns.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.0}/templates/stacks/frontend/react/rules/ui-design-system.md +0 -0
- {claude_code_kit-0.20.0 → claude_code_kit-0.22.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.22.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.22.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,104 @@ 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.22.0] — 2026-06-23
|
|
8
|
+
|
|
9
|
+
**Critical-correctness hardening (PR1 of a phased review): a non-destructive `init` merge that no longer
|
|
10
|
+
deletes your files, a CI guard against doc/version/count drift, stricter config validation, pinned
|
|
11
|
+
third-party MCP versions, and several P2 fixes.**
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- **Data-loss bug in `init` merge mode.** Re-running `claude-kit init` over an existing `.claude/`
|
|
16
|
+
(the default `merge` mode) used to `shutil.rmtree` whole kit-managed directories (`rules/`,
|
|
17
|
+
`skills/<name>/`, `skills/_references/`), silently deleting any file you had added under them.
|
|
18
|
+
`init` now reconciles non-destructively via the new `upgrader.merge_install`, which reuses the
|
|
19
|
+
owner-aware upgrade logic: kit/overlay files are refreshed (user-modified ones backed up to
|
|
20
|
+
`.claude-kit.bak-N/` first), user-editable files are sidecar'd, kit/overlay orphans are pruned, and
|
|
21
|
+
**files the kit doesn't track are never touched**. An untracked hand-rolled `.claude/` is migrated
|
|
22
|
+
safely too (collisions are backed up). `--force` / `overwrite` remains the only destructive path.
|
|
23
|
+
- **`README.claude-sdlc.md` is now user-editable.** `init` no longer hard-overwrites it; it honours
|
|
24
|
+
`--force` and otherwise writes a `.claude-kit` sidecar, and `upgrade` protects it like `CLAUDE.md`.
|
|
25
|
+
- **Documentation/version drift.** `SECURITY.md` supported-version, the `/sdlc` skill's `standard`
|
|
26
|
+
gate row (added `contract-clear`), and the README hook count (16 → 17) corrected.
|
|
27
|
+
|
|
28
|
+
### Added
|
|
29
|
+
|
|
30
|
+
- **`scripts/check_docs_consistency.py`** — a fail-loud guard (run in tests + CI) that re-derives the
|
|
31
|
+
facts and asserts the docs agree: version parity across `pyproject.toml`, `__init__.py`, both plugin
|
|
32
|
+
manifests, the latest `CHANGELOG` heading and `SECURITY.md`; component counts (agents / rules / core
|
|
33
|
+
& collection skills / hook scripts / MCP servers) against every number the docs quote; and the
|
|
34
|
+
profile→gate tables in `README.md` + `skills/sdlc/SKILL.md` against `catalog/profiles.yaml`.
|
|
35
|
+
- **Stricter `--config` / selection validation.** A bare `mcp: github` (or `teams: …`) string is
|
|
36
|
+
normalised to a one-element list instead of being iterated character-by-character; malformed shapes,
|
|
37
|
+
unknown config keys, an unknown `frontend_language` for the chosen framework, and an unknown `scope`
|
|
38
|
+
now fail loudly with a clear message (`Selection.from_dict(strict=True)` + `catalog.resolve` checks).
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
|
|
42
|
+
- **Pinned MCP server package versions.** `catalog/mcp.yaml` replaces moving `@latest` / implicit-latest
|
|
43
|
+
`npx` tags with exact version pins (snapshot 2026-06-23) for reproducible, supply-chain-aware installs;
|
|
44
|
+
the deprecated official GitHub/Postgres reference servers are flagged. README notes that MCP servers
|
|
45
|
+
are third-party code.
|
|
46
|
+
- **Planned CLI commands exit non-zero.** `package-org-pack`, `install-org-pack`, and
|
|
47
|
+
`research import-sources` now exit `2` (still announcing "planned") instead of a silent success-`0`.
|
|
48
|
+
- **Inline guard hooks degrade without `jq`.** The `rm -rf` / push-to-main / secrets inline guards (in
|
|
49
|
+
both the plugin `hooks.json` and the CLI registry) now no-op when `jq` is absent, matching the
|
|
50
|
+
script-backed guards and the SECURITY.md promise.
|
|
51
|
+
|
|
52
|
+
## [0.21.0] — 2026-06-22
|
|
53
|
+
|
|
54
|
+
**Add two stack-collection skills — `cron-and-scheduled-jobs` (scheduled/recurring jobs across Kubernetes
|
|
55
|
+
CronJobs and Temporal Schedules) and `kubectl-operations` (the full kubectl command surface for operating
|
|
56
|
+
those workloads) — now 45 skills.**
|
|
57
|
+
|
|
58
|
+
### Added
|
|
59
|
+
|
|
60
|
+
- **`cron-and-scheduled-jobs`** — a stack-derived skill documenting how scheduled/recurring jobs are
|
|
61
|
+
configured in system config and invoked, across the two mechanisms this stack uses:
|
|
62
|
+
- **Kubernetes CronJob route** — the schedule is declared in Helm `values.yaml` under a `Crons.<job>`
|
|
63
|
+
block (`Schedule`, `Envs: {MODE: cron, CRON_JOB: <name>}`, `ConcurrencyPolicy: Forbid`, `Suspend`,
|
|
64
|
+
`TtlSecondsAfterFinished`); the chart renders one `batch/v1` CronJob per entry (`restartPolicy:
|
|
65
|
+
Never`, history limits 3/1). The shared image boots one-shot in `MODE=cron` and dispatches a single
|
|
66
|
+
named job from a Python cron registry (simple `name→callable` or rich `name→{task, description,
|
|
67
|
+
schedule}`), instrumented via `record_cron_job_executed`. Documents the chart's missing
|
|
68
|
+
`timeZone`/`startingDeadlineSeconds` and how to compensate.
|
|
69
|
+
- **Temporal Schedule route** — `cron_expressions` vs `ScheduleIntervalSpec` (interval+offset to dodge
|
|
70
|
+
the UTC-cron timezone foot-gun), `ScheduleOverlapPolicy.SKIP` + `pause_on_failure`, and the one-shot
|
|
71
|
+
k8s `Job` (not a CronJob) that registers the schedule. Cross-links `temporal-config-driven` (which
|
|
72
|
+
owns workflow/activity/worker mechanics and the create-or-update registration loop) rather than
|
|
73
|
+
duplicating it.
|
|
74
|
+
- Plus a decision matrix for choosing k8s CronJob vs Temporal Schedule, and the cross-cutting concerns
|
|
75
|
+
(concurrency, timezone, history, missed runs, suspend vs pause, observability, idempotency).
|
|
76
|
+
- Fully genericized; **not** wired into the catalog/scaffold (`claude-kit init` output is unchanged).
|
|
77
|
+
|
|
78
|
+
- **`kubectl-operations`** — a stack-derived, operations-first skill for running `kubectl` against this
|
|
79
|
+
stack's workloads:
|
|
80
|
+
- **Full command surface**, grouped by task — `get`/`describe`/`explain`/`api-resources`;
|
|
81
|
+
`apply`/`create`/`edit`/`patch`/`set`/`replace`; `logs`/`exec`/`port-forward`/`cp`/`debug`/
|
|
82
|
+
`attach`/`proxy`; `rollout`/`scale`/`autoscale`; `events`/`top`; `label`/`annotate`; `config`
|
|
83
|
+
(contexts & namespaces); `auth can-i`; `wait`/`diff`/`kustomize`; node `cordon`/`drain`/`taint`.
|
|
84
|
+
(`kubectl delete` is intentionally omitted — see the guardrail below — in favour of reversible
|
|
85
|
+
alternatives: `scale --replicas=0`, `rollout undo`, or removing the object from the Git/Helm source.)
|
|
86
|
+
- **Output formatting & selectors** — `-o wide/yaml/json/name/jsonpath/custom-columns/go-template`,
|
|
87
|
+
`--sort-by`, label (`-l`) and field selectors, `--watch`, with copy-ready JSONPath recipes.
|
|
88
|
+
- **Context/namespace/RBAC safety** (the #1 footgun) and **day-2 debugging playbooks** —
|
|
89
|
+
CrashLoopBackOff, ImagePullBackOff, Pending/unschedulable, OOMKilled, a cron that didn't fire, a
|
|
90
|
+
Service with no endpoints.
|
|
91
|
+
- Cross-links `cron-and-scheduled-jobs`, `kubernetes-workload-hardening`,
|
|
92
|
+
`containerization-and-deployment`, `temporal-config-driven`, and `observability-and-logging`. Fully
|
|
93
|
+
genericized; **not** wired into the catalog/scaffold. The collection index is updated (45 skills).
|
|
94
|
+
|
|
95
|
+
- **Plugin guardrail `guard-kubectl-delete`** — a `PreToolUse(Bash)` hook that blocks `kubectl delete`
|
|
96
|
+
from the agent's Bash tool (exit 2), joining the `rm -rf` / `push main` / `guard-destructive-git` /
|
|
97
|
+
`guard-secrets` destructive-command family. It matches the `delete` **subcommand** as a whole word —
|
|
98
|
+
sparing the safe look-alikes `config delete-context`, `drain --delete-emptydir-data`,
|
|
99
|
+
`wait --for=delete`, and the read-only `auth can-i delete …` — and splits compound commands on
|
|
100
|
+
`;`/`|`/`&` so a chained `… | xargs kubectl delete` can't slip past. It refuses with the reversible
|
|
101
|
+
alternatives (`scale --replicas=0`, `rollout undo`, GitOps reconcile) and degrades to a no-op without
|
|
102
|
+
`jq`. Wired into the **plugin** (`hooks/hooks.json`) only; intentionally **not** added to the pip-CLI
|
|
103
|
+
scaffold registry, so `claude-kit init` output is unchanged.
|
|
104
|
+
|
|
7
105
|
## [0.20.0] — 2026-06-20
|
|
8
106
|
|
|
9
107
|
**Expand the stack-specific skill collection: 21 new skills + 7 fold-in enhancements + a security pass,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: claude-code-kit
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.22.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
|
|
@@ -82,7 +82,7 @@ Quick start) for the full breakdown of any row.
|
|
|
82
82
|
| 🧱 **Stacks & overlays** | Stack-agnostic core + **10** overlay rule sets (React · FastAPI · Go · Postgres · Mongo) wired to your exact commands, incl. a full React design system |
|
|
83
83
|
| 🎚️ **Profiles, scopes & org** | **3** rigor profiles · **3** scopes · **5** autonomy levels · **7** org packs + **10** policy rules |
|
|
84
84
|
| 🧠 **Memory & learning** | Working memory across context compaction + a cost-aware learnings loop (`capture_mode`) so the same mistake isn't repeated |
|
|
85
|
-
| 🛠️ **Hooks & guards** | **
|
|
85
|
+
| 🛠️ **Hooks & guards** | **17** event hooks — blocking safety guards vs. advisory warnings — that no-op gracefully without `jq` |
|
|
86
86
|
| 📦 **Distribution & lifecycle** | Plugin **and** pip from one source, **9** ready MCP fragments, and edit-preserving `upgrade` |
|
|
87
87
|
| ♻️ **Reuse-first by design** | Adopt-only-the-new reviews, opt-in LLM/AI security (OWASP LLM Top 10), a worked example + self-test matrix |
|
|
88
88
|
|
|
@@ -306,7 +306,7 @@ need.
|
|
|
306
306
|
|
|
307
307
|
<br>
|
|
308
308
|
|
|
309
|
-
- **
|
|
309
|
+
- **17 event hook scripts** in [`hooks/`](hooks/) enforce the pipeline outside the model —
|
|
310
310
|
`guard-secrets`, `guard-destructive-git`, `lint-fix`, `type-check`, and `validate-settings` run
|
|
311
311
|
deterministically.
|
|
312
312
|
- **Advisory, never-blocking warnings** — `warn-llm-io`, `warn-large-edits`, `warn-missing-tests`, and
|
|
@@ -325,6 +325,10 @@ need.
|
|
|
325
325
|
(`claude-kit` / `ckit` / `claude-sdlc`) generate identical config.
|
|
326
326
|
- **Catalog-driven extensibility** — adding a stack, framework, database, profile, MCP server, or org
|
|
327
327
|
pack is a [`catalog/`](catalog/) YAML edit, never a code change; 9 MCP server fragments ship ready.
|
|
328
|
+
- **MCP servers are third-party** — each fragment runs an external package or hosted endpoint that
|
|
329
|
+
claude-kit references but does not vendor or audit; the `npx` commands are **pinned to an exact
|
|
330
|
+
version** (not `@latest`) for reproducible, supply-chain-aware installs. Review a server's source and
|
|
331
|
+
license before enabling it, and bump pins deliberately. See [`SECURITY.md`](SECURITY.md).
|
|
328
332
|
- **Safe, edit-preserving upgrades** — `upgrade` refreshes kit/overlay files via per-file `owner` +
|
|
329
333
|
checksum, never clobbers your edits, backs up changes, and restores deleted files (`diff` previews
|
|
330
334
|
first).
|
|
@@ -55,7 +55,7 @@ Quick start) for the full breakdown of any row.
|
|
|
55
55
|
| 🧱 **Stacks & overlays** | Stack-agnostic core + **10** overlay rule sets (React · FastAPI · Go · Postgres · Mongo) wired to your exact commands, incl. a full React design system |
|
|
56
56
|
| 🎚️ **Profiles, scopes & org** | **3** rigor profiles · **3** scopes · **5** autonomy levels · **7** org packs + **10** policy rules |
|
|
57
57
|
| 🧠 **Memory & learning** | Working memory across context compaction + a cost-aware learnings loop (`capture_mode`) so the same mistake isn't repeated |
|
|
58
|
-
| 🛠️ **Hooks & guards** | **
|
|
58
|
+
| 🛠️ **Hooks & guards** | **17** event hooks — blocking safety guards vs. advisory warnings — that no-op gracefully without `jq` |
|
|
59
59
|
| 📦 **Distribution & lifecycle** | Plugin **and** pip from one source, **9** ready MCP fragments, and edit-preserving `upgrade` |
|
|
60
60
|
| ♻️ **Reuse-first by design** | Adopt-only-the-new reviews, opt-in LLM/AI security (OWASP LLM Top 10), a worked example + self-test matrix |
|
|
61
61
|
|
|
@@ -279,7 +279,7 @@ need.
|
|
|
279
279
|
|
|
280
280
|
<br>
|
|
281
281
|
|
|
282
|
-
- **
|
|
282
|
+
- **17 event hook scripts** in [`hooks/`](hooks/) enforce the pipeline outside the model —
|
|
283
283
|
`guard-secrets`, `guard-destructive-git`, `lint-fix`, `type-check`, and `validate-settings` run
|
|
284
284
|
deterministically.
|
|
285
285
|
- **Advisory, never-blocking warnings** — `warn-llm-io`, `warn-large-edits`, `warn-missing-tests`, and
|
|
@@ -298,6 +298,10 @@ need.
|
|
|
298
298
|
(`claude-kit` / `ckit` / `claude-sdlc`) generate identical config.
|
|
299
299
|
- **Catalog-driven extensibility** — adding a stack, framework, database, profile, MCP server, or org
|
|
300
300
|
pack is a [`catalog/`](catalog/) YAML edit, never a code change; 9 MCP server fragments ship ready.
|
|
301
|
+
- **MCP servers are third-party** — each fragment runs an external package or hosted endpoint that
|
|
302
|
+
claude-kit references but does not vendor or audit; the `npx` commands are **pinned to an exact
|
|
303
|
+
version** (not `@latest`) for reproducible, supply-chain-aware installs. Review a server's source and
|
|
304
|
+
license before enabling it, and bump pins deliberately. See [`SECURITY.md`](SECURITY.md).
|
|
301
305
|
- **Safe, edit-preserving upgrades** — `upgrade` refreshes kit/overlay files via per-file `owner` +
|
|
302
306
|
checksum, never clobbers your edits, backs up changes, and restores deleted files (`diff` previews
|
|
303
307
|
first).
|
|
@@ -1,16 +1,26 @@
|
|
|
1
1
|
# claude-kit optional MCP integrations. Selected servers are written into a project-root `.mcp.json`
|
|
2
2
|
# ONLY when chosen at init (default: none). Configs use ${ENV} placeholders — no credentials are ever
|
|
3
3
|
# generated. Fill the referenced env vars (e.g. in your shell or .env) before using a server.
|
|
4
|
+
#
|
|
5
|
+
# SUPPLY CHAIN: every server below is THIRD-PARTY code (an npx package or a hosted HTTP endpoint) with
|
|
6
|
+
# its own maintainers, trust, and licensing model — claude-kit only references it, never vendors or
|
|
7
|
+
# audits it. The `npx -y <pkg>@<version>` commands are pinned to an exact version (snapshot 2026-06-23)
|
|
8
|
+
# rather than a moving `@latest`, so an install is reproducible and a fresh upstream release can't
|
|
9
|
+
# silently change what runs. Bump these deliberately (and review the changelog) — do not switch back
|
|
10
|
+
# to `@latest`. See SECURITY.md and the README "MCP integrations" note.
|
|
4
11
|
|
|
5
12
|
version: 1
|
|
6
13
|
|
|
7
14
|
servers:
|
|
8
15
|
github:
|
|
9
16
|
label: "GitHub (issues, PRs, repos)"
|
|
17
|
+
# NOTE: the official @modelcontextprotocol/server-github npm package is archived/deprecated upstream
|
|
18
|
+
# (GitHub now ships a Go `github-mcp-server`). Pinned to its last published version for a stable
|
|
19
|
+
# install; switch to the maintained server in a future kit release if you need newer features.
|
|
10
20
|
config:
|
|
11
21
|
type: stdio
|
|
12
22
|
command: npx
|
|
13
|
-
args: ["-y", "@modelcontextprotocol/server-github"]
|
|
23
|
+
args: ["-y", "@modelcontextprotocol/server-github@2025.4.8"]
|
|
14
24
|
env:
|
|
15
25
|
GITHUB_PERSONAL_ACCESS_TOKEN: "${GITHUB_PERSONAL_ACCESS_TOKEN}"
|
|
16
26
|
linear:
|
|
@@ -23,22 +33,25 @@ servers:
|
|
|
23
33
|
config:
|
|
24
34
|
type: stdio
|
|
25
35
|
command: npx
|
|
26
|
-
args: ["-y", "mcp-atlassian"]
|
|
36
|
+
args: ["-y", "mcp-atlassian@2.1.0"]
|
|
27
37
|
env:
|
|
28
38
|
JIRA_URL: "${JIRA_URL}"
|
|
29
39
|
JIRA_API_TOKEN: "${JIRA_API_TOKEN}"
|
|
30
40
|
postgres:
|
|
31
41
|
label: "PostgreSQL (query the database)"
|
|
42
|
+
# NOTE: @modelcontextprotocol/server-postgres is archived/deprecated upstream; pinned to its last
|
|
43
|
+
# published version for a stable install. Consider a maintained Postgres MCP server going forward.
|
|
32
44
|
config:
|
|
33
45
|
type: stdio
|
|
34
46
|
command: npx
|
|
35
|
-
args:
|
|
47
|
+
args:
|
|
48
|
+
["-y", "@modelcontextprotocol/server-postgres@0.6.2", "${DATABASE_URL}"]
|
|
36
49
|
mongodb:
|
|
37
50
|
label: "MongoDB (query the database)"
|
|
38
51
|
config:
|
|
39
52
|
type: stdio
|
|
40
53
|
command: npx
|
|
41
|
-
args: ["-y", "mongodb-mcp-server"]
|
|
54
|
+
args: ["-y", "mongodb-mcp-server@1.13.0"]
|
|
42
55
|
env:
|
|
43
56
|
MDB_MCP_CONNECTION_STRING: "${MONGODB_URI}"
|
|
44
57
|
playwright:
|
|
@@ -46,7 +59,7 @@ servers:
|
|
|
46
59
|
config:
|
|
47
60
|
type: stdio
|
|
48
61
|
command: npx
|
|
49
|
-
args: ["-y", "@playwright/mcp@
|
|
62
|
+
args: ["-y", "@playwright/mcp@0.0.76"]
|
|
50
63
|
docs:
|
|
51
64
|
label: "Docs / Context7 (live library docs)"
|
|
52
65
|
config:
|
|
@@ -61,7 +74,7 @@ servers:
|
|
|
61
74
|
# source is FSL-1.1-Apache-2.0 (source-available; converts to Apache-2.0 two years after each
|
|
62
75
|
# release) — flagged in the label like the repowise AGPL note; this entry references only the
|
|
63
76
|
# OAuth-hosted service, not the source. Self-hosted/token alternative (instead of the http url):
|
|
64
|
-
# command: npx, args: ["-y", "@sentry/mcp-server@
|
|
77
|
+
# command: npx, args: ["-y", "@sentry/mcp-server@0.36.0"], env: SENTRY_ACCESS_TOKEN: "${SENTRY_ACCESS_TOKEN}".
|
|
65
78
|
sentry:
|
|
66
79
|
label: "Sentry (error monitoring / issue triage; source-available FSL-1.1)"
|
|
67
80
|
config:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Production Engineering Skills Collection
|
|
2
2
|
|
|
3
|
-
These forty-
|
|
3
|
+
These forty-five Claude Code skills encode production-proven engineering conventions derived from real-world Python/FastAPI, Node/Express, and React services. Each skill was extracted from analyzing patterns across multiple production backend and frontend services, capturing canonical patterns for FastAPI microservices, async Python, Kafka/Temporal integration, multi-tenancy, database access, layered configuration, Redis caching, GCS file handling, LLM integration (Vertex AI / Langfuse), Node/Express services, React frontends (state, data-fetching, forms, design systems, testing), observability (including Grafana dashboards & unified alerting), authentication, containerization (with granular Dockerfile/compose deep-dives), testing, data pipelines, security scanning (OWASP ZAP VAPT/DAST and autonomous AI pentesting), security architecture (edge-to-service signed-identity trust boundary, Kubernetes workload hardening), scheduled & recurring jobs (Kubernetes CronJob + Temporal Schedule), kubectl day-2 operations, and modernization strategies. Use them to align new projects with established patterns, audit existing services, or onboard engineers to modern Python, Node, and React development practices.
|
|
4
4
|
|
|
5
5
|
> **Where these live in this repo:** the skill folders are under [`skills/`](../../skills/) (auto-discovered by the claude-kit plugin). The links below point there.
|
|
6
6
|
|
|
@@ -51,6 +51,8 @@ These forty-three Claude Code skills encode production-proven engineering conven
|
|
|
51
51
|
| **shannon-ai-pentest** | Drive Shannon (by Keygraph) — an autonomous **white-box** AI pentest that reads an app's source, plans attacks, runs **real proof-of-concept exploits** against the live app, and reports only proven findings. Documents the external **AGPL-3.0** `npx @keygraph/shannon` CLI (setup/start/status/logs/stop/workspaces + flags), AI-provider & model-tier config (Anthropic/Bedrock/Vertex/proxy), the YAML engagement config (auth + login-flows + TOTP, scope avoid/focus rules, report filters), output layout, and safety. Not bundled — installed separately (complements `zap-vapt-scanning`) | [SKILL.md](../../skills/shannon-ai-pentest/SKILL.md) |
|
|
52
52
|
| **edge-to-service-trust-boundary** | The cryptographic trust contract between an API gateway/edge and the services behind it — edge **HMAC-signs** forwarded identity/tenant headers (signature + timestamp), downstream services **verify with constant-time compare and fail closed**, reject replayed/skewed requests, **detect conflicts** across resolution sources, and still enforce their own authz. Anti-patterns: `verify_signature=False`-then-trust, naked-header trust, fail-open. Complements `auth-and-rbac` + `multi-tenancy-patterns` | [SKILL.md](../../skills/edge-to-service-trust-boundary/SKILL.md) |
|
|
53
53
|
| **kubernetes-workload-hardening** | Runtime/manifest-layer Kubernetes hardening — pod/container `securityContext` (runAsNonRoot, drop-ALL caps, `readOnlyRootFilesystem`, seccomp `RuntimeDefault`), **default-deny NetworkPolicy** + explicit allows, **digest-pinned** images, resource requests/limits, **restricted PodSecurity** admission, least-privilege ServiceAccount/RBAC, and secrets via `secretRef`. The runtime layer atop the `dockerfile-*`/`docker-shared` image-build skills | [SKILL.md](../../skills/kubernetes-workload-hardening/SKILL.md) |
|
|
54
|
+
| **cron-and-scheduled-jobs** | Scheduled/recurring jobs two ways — **Kubernetes CronJob** declared in Helm values (`Crons` block) firing a one-shot `MODE=cron` pod that dispatches a named job from a Python registry, and **Temporal Schedules** (cron vs interval specs, `ScheduleOverlapPolicy.SKIP`, pause-on-failure, idempotent create-or-update registration run as a one-shot k8s `Job`) — how each is configured + invoked, concurrency/timezone/history, and choosing between them | [SKILL.md](../../skills/cron-and-scheduled-jobs/SKILL.md) |
|
|
55
|
+
| **kubectl-operations** | Operating Kubernetes workloads with `kubectl` — the full command surface (get/describe/explain, apply/create/edit/patch/delete, logs/exec/port-forward/cp/debug, rollout/scale/autoscale, config contexts/namespaces, auth can-i, jobs/cronjobs, node cordon/drain) + output formatting (`-o jsonpath/custom-columns/go-template`), label/field selectors, dry-run+diff, and day-2 debugging playbooks (CrashLoopBackOff, ImagePullBackOff, Pending, OOMKilled, cron didn't fire, Service has no endpoints). Context/namespace safety first | [SKILL.md](../../skills/kubectl-operations/SKILL.md) |
|
|
54
56
|
|
|
55
57
|
> **Existing skills extended (this release):** `fastapi-service-patterns` (API versioning + conditional routes), `python-dao-and-database` (MongoDB advanced — aggregation/bulk-upsert/indexes), `temporal-config-driven` (schedule registration), `graphql-patterns` (advanced Apollo Client setup), `containerization-and-deployment` (Makefile dev workflow + Kerberos kinit bootstrap), and `testing-conventions` (GitHub Actions test orchestration) each gained a new section + reference file. A follow-on **security pass** further extended `observability-and-logging` (PII/secret redaction processor + `references/pii-redaction.md`), `testing-conventions` (security-regression tests — negative authz, cross-tenant/RLS, IDOR, lockout, signed-header trust — + `references/security-regression-tests.md`), `graphql-patterns` (a CSRF-token clarification on the Apollo preflight note), and the **core** `security-and-hardening` skill (a CSRF synchronizer-token pattern + an outbound-TLS-verification ban).
|
|
56
58
|
|
|
@@ -101,11 +103,13 @@ These forty-three Claude Code skills encode production-proven engineering conven
|
|
|
101
103
|
- "run Shannon / autonomous or white-box AI pentest / exploit-test an app from its source / set up @keygraph/shannon / proof-by-exploitation report" → **shannon-ai-pentest**
|
|
102
104
|
- "sign forwarded identity headers / verify a gateway HMAC signature / trust x-user-data behind a gateway / fail closed on forwarded identity / prevent header spoofing or direct-to-service bypass" → **edge-to-service-trust-boundary**
|
|
103
105
|
- "harden a Kubernetes Deployment / add securityContext / write a NetworkPolicy / enforce PodSecurity restricted / pin an image digest / least-privilege ServiceAccount + RBAC" → **kubernetes-workload-hardening**
|
|
106
|
+
- "add a cron job / scheduled job / recurring job / declare a CronJob in Helm values / wire a MODE=cron entrypoint / register a Temporal schedule / choose k8s CronJob vs Temporal schedule" → **cron-and-scheduled-jobs**
|
|
107
|
+
- "run kubectl / inspect a Deployment or pod / tail logs / exec into a container / port-forward / roll out or roll back / kubectl -o jsonpath / debug CrashLoopBackOff or ImagePullBackOff / switch kube context or namespace / auth can-i" → **kubectl-operations**
|
|
104
108
|
|
|
105
109
|
4. **References:** Each skill includes a `references/` subdirectory with detailed evidence files showing the exact file paths, snippets, and patterns from source repositories.
|
|
106
110
|
|
|
107
111
|
## Scope and Limitations
|
|
108
112
|
|
|
109
113
|
- **Source:** These skills are derived from real-world production Python/FastAPI and React services as of June 2026. They reflect real-world conventions, including some anti-patterns that are documented for awareness.
|
|
110
|
-
- **Stack coverage:** Python FastAPI + SQLAlchemy (1.4 and 2.0) + Kafka + Temporal + Redis (caching); layered configuration (configargparse + YAML + Pydantic); GCS file ops + Excel/CSV reporting; LLM integration (Claude on Vertex AI via AnthropicVertex + Langfuse tracing); Node/Express + Objection/Knex + Joi; React + Vite + TypeScript (Zustand, TanStack Query, react-hook-form + Zod, Radix + Tailwind, Vitest + RTL + MSW); limited MongoDB (sync pymongo + aggregation/bulk/index patterns); BigQuery/GCS data pipelines; Strawberry GraphQL (backend) + Apollo Client (frontend); Docker + docker-compose + k8s; Cloud Run + GitHub Actions CI/CD; pytest + pytest-asyncio + Playwright; OpenTelemetry + Sentry + Prometheus + NewRelic; Grafana dashboards + unified alerting (Prometheus/Tempo/Pyroscope/managed-cloud datasources); argon2 + JWT + pyotp; Alembic migrations; multi-provider email/SMS notifications; OWASP ZAP VAPT/DAST scanning with automated PDF reporting; Shannon autonomous white-box AI pentesting (an external AGPL-3.0 CLI — documented, not bundled); edge-to-service HMAC-signed forwarded-identity trust boundary; Kubernetes runtime/manifest hardening (securityContext, NetworkPolicy, PodSecurity, RBAC, digest-pinned images).
|
|
114
|
+
- **Stack coverage:** Python FastAPI + SQLAlchemy (1.4 and 2.0) + Kafka + Temporal + Redis (caching); layered configuration (configargparse + YAML + Pydantic); GCS file ops + Excel/CSV reporting; LLM integration (Claude on Vertex AI via AnthropicVertex + Langfuse tracing); Node/Express + Objection/Knex + Joi; React + Vite + TypeScript (Zustand, TanStack Query, react-hook-form + Zod, Radix + Tailwind, Vitest + RTL + MSW); limited MongoDB (sync pymongo + aggregation/bulk/index patterns); BigQuery/GCS data pipelines; Strawberry GraphQL (backend) + Apollo Client (frontend); Docker + docker-compose + k8s; Cloud Run + GitHub Actions CI/CD; pytest + pytest-asyncio + Playwright; OpenTelemetry + Sentry + Prometheus + NewRelic; Grafana dashboards + unified alerting (Prometheus/Tempo/Pyroscope/managed-cloud datasources); argon2 + JWT + pyotp; Alembic migrations; multi-provider email/SMS notifications; OWASP ZAP VAPT/DAST scanning with automated PDF reporting; Shannon autonomous white-box AI pentesting (an external AGPL-3.0 CLI — documented, not bundled); edge-to-service HMAC-signed forwarded-identity trust boundary; Kubernetes runtime/manifest hardening (securityContext, NetworkPolicy, PodSecurity, RBAC, digest-pinned images); scheduled/recurring jobs (Kubernetes CronJob declared in Helm values + Temporal Schedules); kubectl day-2 operations (full command surface, output formatting/JSONPath, contexts/RBAC, debugging playbooks).
|
|
111
115
|
- **What's NOT covered:** SQLModel, Tortoise ORM, beanie/motor (async MongoDB), Django, Flask, and non-Express Node frameworks (NestJS, Fastify). These were absent (or single-repo only) in the analyzed codebases and were deliberately not created.
|
|
@@ -15,10 +15,11 @@
|
|
|
15
15
|
{
|
|
16
16
|
"matcher": "Bash",
|
|
17
17
|
"hooks": [
|
|
18
|
-
{ "type": "command", "command": "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" },
|
|
19
|
-
{ "type": "command", "command": "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" },
|
|
18
|
+
{ "type": "command", "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" },
|
|
19
|
+
{ "type": "command", "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" },
|
|
20
20
|
{ "type": "command", "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/scripts/guard-destructive-git.sh\"" },
|
|
21
|
-
{ "type": "command", "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/scripts/guard-secrets.sh\"" }
|
|
21
|
+
{ "type": "command", "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/scripts/guard-secrets.sh\"" },
|
|
22
|
+
{ "type": "command", "command": "bash \"${CLAUDE_PLUGIN_ROOT}/hooks/scripts/guard-kubectl-delete.sh\"" }
|
|
22
23
|
]
|
|
23
24
|
},
|
|
24
25
|
{
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# PreToolUse(Bash): BLOCK `kubectl delete` — destructive deletes must not run from an agent session.
|
|
3
|
+
#
|
|
4
|
+
# Why a guard (block, exit 2) and not a warn: a delete is irreversible and trivially misfires against
|
|
5
|
+
# the wrong namespace or cluster. A PreToolUse advisory would be theatre — the resource would already
|
|
6
|
+
# be gone. So this refuses and points at the reversible alternatives (scale to 0, rollout undo, or
|
|
7
|
+
# removing the object from the Git/Helm source and letting the pipeline reconcile). It joins the
|
|
8
|
+
# guard-rm-rf / guard-push-main / guard-destructive-git destructive-command family.
|
|
9
|
+
#
|
|
10
|
+
# Scope is deliberately the `delete` SUBCOMMAND only, matched as a whole word, so it spares the safe
|
|
11
|
+
# look-alikes that merely contain the string "delete":
|
|
12
|
+
# - `kubectl config delete-context|delete-cluster|delete-user` (local kubeconfig edits, hyphenated)
|
|
13
|
+
# - `kubectl drain ... --delete-emptydir-data` (a drain flag, hyphenated)
|
|
14
|
+
# - `kubectl wait --for=delete ...` (a wait condition, after '=')
|
|
15
|
+
# - `kubectl auth can-i delete <res>` (a READ-ONLY RBAC query)
|
|
16
|
+
# Compound commands are split on ; | & first, so a chained delete (e.g. `get -o name | xargs kubectl
|
|
17
|
+
# delete`) is caught per-segment. Threat model: this prevents accidental agent deletes, not a determined
|
|
18
|
+
# operator who deliberately crafts a bypass string (they own the machine and can disable the hook).
|
|
19
|
+
#
|
|
20
|
+
# Degrades to a no-op (fail-open) without jq — consistent with the other script-backed guards.
|
|
21
|
+
command -v jq >/dev/null 2>&1 || exit 0
|
|
22
|
+
CMD="$(jq -r '.tool_input.command // empty' 2>/dev/null || true)"
|
|
23
|
+
[ -z "$CMD" ] && exit 0
|
|
24
|
+
|
|
25
|
+
# Split on shell separators → one segment per line; drop read-only `auth can-i` queries; keep only
|
|
26
|
+
# kubectl segments; then look for a bare `delete` verb (not delete-context, --delete-*, or --for=delete).
|
|
27
|
+
if printf '%s' "$CMD" | tr ';|&' '\n\n\n' \
|
|
28
|
+
| grep -vE 'auth[[:space:]]+can-i' \
|
|
29
|
+
| grep -E '(^|[[:space:]])kubectl(\.exe)?[[:space:]]' \
|
|
30
|
+
| grep -qE '(^|[[:space:]])delete([[:space:]]|$)'; then
|
|
31
|
+
echo "BLOCKED: 'kubectl delete' is disabled by claude-kit — destructive deletes must not run from an agent session." >&2
|
|
32
|
+
echo " Use a reversible alternative: 'kubectl scale --replicas=0' to stop a workload, 'kubectl rollout undo' to roll back," >&2
|
|
33
|
+
echo " or remove the resource from the Git/Helm source and let the pipeline reconcile." >&2
|
|
34
|
+
echo " Read-only checks still work ('kubectl auth can-i delete <res>', 'kubectl get/describe'). (guard-kubectl-delete.sh)" >&2
|
|
35
|
+
exit 2
|
|
36
|
+
fi
|
|
37
|
+
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.22.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"
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
"""Fail-loud guard against documentation / version / count drift in this repo.
|
|
3
|
+
|
|
4
|
+
claude-kit ships from one source of truth but advertises itself in many places — the README,
|
|
5
|
+
SECURITY.md, the CHANGELOG, the plugin manifests, and the `/sdlc` skill. Those numbers and version
|
|
6
|
+
strings drift the moment a component is added without a doc sweep (e.g. PR #25 added a 17th hook
|
|
7
|
+
script but left the README saying "16"). This script re-derives the facts from the filesystem and
|
|
8
|
+
the catalog and asserts the docs agree.
|
|
9
|
+
|
|
10
|
+
It checks three classes of drift:
|
|
11
|
+
|
|
12
|
+
1. **Version parity** — the single version string must be identical across ``pyproject.toml``,
|
|
13
|
+
``src/claude_kit/__init__.py``, both plugin manifests, the latest ``CHANGELOG.md`` heading, and
|
|
14
|
+
``SECURITY.md``.
|
|
15
|
+
2. **Component counts** — agents / core rules / core skills / collection skills / hook scripts /
|
|
16
|
+
MCP fragments, counted on disk (or in ``catalog/mcp.yaml``), must match every number the docs
|
|
17
|
+
quote for them.
|
|
18
|
+
3. **Profile → gate tables** — the gate lists in ``README.md`` and ``skills/sdlc/SKILL.md`` must
|
|
19
|
+
match the effective gate sets resolved from ``catalog/profiles.yaml`` (inheritance included).
|
|
20
|
+
|
|
21
|
+
Run directly (``python scripts/check_docs_consistency.py``) — exits 0 when consistent, 1 otherwise
|
|
22
|
+
and prints every mismatch. Also exercised by ``tests/test_docs_consistency.py`` and CI.
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
from __future__ import annotations
|
|
26
|
+
|
|
27
|
+
import json
|
|
28
|
+
import re
|
|
29
|
+
import sys
|
|
30
|
+
from pathlib import Path
|
|
31
|
+
|
|
32
|
+
import yaml
|
|
33
|
+
|
|
34
|
+
ROOT = Path(__file__).resolve().parent.parent
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
def _read(rel: str) -> str:
|
|
38
|
+
return (ROOT / rel).read_text(encoding="utf-8")
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
# --------------------------------------------------------------------------------------------------
|
|
42
|
+
# 1) Version parity
|
|
43
|
+
# --------------------------------------------------------------------------------------------------
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
def _versions() -> dict[str, str]:
|
|
47
|
+
"""Return the version string each source declares, keyed by a human label."""
|
|
48
|
+
out: dict[str, str] = {}
|
|
49
|
+
m = re.search(r'^version\s*=\s*"([^"]+)"', _read("pyproject.toml"), re.MULTILINE)
|
|
50
|
+
out["pyproject.toml"] = m.group(1) if m else "??"
|
|
51
|
+
m = re.search(r'__version__\s*=\s*"([^"]+)"', _read("src/claude_kit/__init__.py"))
|
|
52
|
+
out["src/claude_kit/__init__.py"] = m.group(1) if m else "??"
|
|
53
|
+
out[".claude-plugin/plugin.json"] = json.loads(
|
|
54
|
+
_read(".claude-plugin/plugin.json")
|
|
55
|
+
).get("version", "??")
|
|
56
|
+
market = json.loads(_read(".claude-plugin/marketplace.json"))
|
|
57
|
+
for i, p in enumerate(market.get("plugins", [])):
|
|
58
|
+
out[f".claude-plugin/marketplace.json[{i}]"] = p.get("version", "??")
|
|
59
|
+
m = re.search(r"^##\s*\[([^\]]+)\]", _read("CHANGELOG.md"), re.MULTILINE)
|
|
60
|
+
out["CHANGELOG.md (latest)"] = m.group(1) if m else "??"
|
|
61
|
+
m = re.search(r"currently\s*\*\*([^*]+)\*\*", _read("SECURITY.md"))
|
|
62
|
+
out["SECURITY.md"] = m.group(1) if m else "??"
|
|
63
|
+
return out
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
def check_versions() -> list[str]:
|
|
67
|
+
versions = _versions()
|
|
68
|
+
distinct = set(versions.values())
|
|
69
|
+
if len(distinct) == 1:
|
|
70
|
+
return []
|
|
71
|
+
canonical = versions["pyproject.toml"]
|
|
72
|
+
return [
|
|
73
|
+
f"version drift: {label} says {ver!r} (canonical pyproject.toml = {canonical!r})"
|
|
74
|
+
for label, ver in versions.items()
|
|
75
|
+
if ver != canonical
|
|
76
|
+
]
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
# --------------------------------------------------------------------------------------------------
|
|
80
|
+
# 2) Component counts
|
|
81
|
+
# --------------------------------------------------------------------------------------------------
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
def _count_skills() -> tuple[int, int]:
|
|
85
|
+
"""Return (core, collection): collection skills carry a README.md, core ones do not."""
|
|
86
|
+
core = collection = 0
|
|
87
|
+
for d in sorted((ROOT / "skills").iterdir()):
|
|
88
|
+
if not d.is_dir() or d.name.startswith("_"):
|
|
89
|
+
continue
|
|
90
|
+
if (d / "README.md").is_file():
|
|
91
|
+
collection += 1
|
|
92
|
+
else:
|
|
93
|
+
core += 1
|
|
94
|
+
return core, collection
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
def _actuals() -> dict[str, int]:
|
|
98
|
+
core, collection = _count_skills()
|
|
99
|
+
mcp = yaml.safe_load(_read("catalog/mcp.yaml")).get("servers", {})
|
|
100
|
+
return {
|
|
101
|
+
"agents": len(list((ROOT / "agents").glob("*.md"))),
|
|
102
|
+
"rules": len(list((ROOT / "rules").glob("*.md"))),
|
|
103
|
+
"core skills": core,
|
|
104
|
+
"collection skills": collection,
|
|
105
|
+
"hook scripts": len(list((ROOT / "hooks" / "scripts").glob("*.sh"))),
|
|
106
|
+
"mcp servers": len(mcp),
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
|
|
110
|
+
# Each anchor ties a component count to one regex (single capture group = the number) in one file.
|
|
111
|
+
# Every listed regex must match at least once, and every match must equal the on-disk count — so a
|
|
112
|
+
# count change forces a doc update, and a reworded sentence that drops the number trips "anchor not
|
|
113
|
+
# found". Subset counts elsewhere ("8 agent-operation rules") are deliberately NOT anchored.
|
|
114
|
+
_ANCHORS: list[tuple[str, str, str]] = [
|
|
115
|
+
("agents", "README.md", r"\*\*(\d+)\*\* tiered agents"),
|
|
116
|
+
("agents", "README.md", r"(\d+) specialized agents"),
|
|
117
|
+
("agents", "README.md", r"(\d+) specialized roles"),
|
|
118
|
+
("agents", "README.md", r"(\d+) SDLC agents"),
|
|
119
|
+
("rules", "README.md", r"\*\*(\d+)\*\* stack-agnostic core rules"),
|
|
120
|
+
("rules", "README.md", r"(\d+) stack-agnostic core rules"),
|
|
121
|
+
("rules", "README.md", r"(\d+) stack-agnostic contracts"),
|
|
122
|
+
("rules", "README.md", r"(\d+) engineering rules"),
|
|
123
|
+
("core skills", "README.md", r"\*\*(\d+)\*\* context-activated skills"),
|
|
124
|
+
("core skills", "README.md", r"(\d+) on-demand skills"),
|
|
125
|
+
("hook scripts", "README.md", r"\*\*(\d+)\*\* event hooks"),
|
|
126
|
+
("hook scripts", "README.md", r"(\d+) event hook scripts"),
|
|
127
|
+
("mcp servers", "README.md", r"\*\*(\d+)\*\* ready MCP fragments"),
|
|
128
|
+
("mcp servers", "README.md", r"(\d+) MCP server fragments"),
|
|
129
|
+
]
|
|
130
|
+
|
|
131
|
+
|
|
132
|
+
def check_counts() -> list[str]:
|
|
133
|
+
actuals = _actuals()
|
|
134
|
+
errors: list[str] = []
|
|
135
|
+
for component, relfile, pattern in _ANCHORS:
|
|
136
|
+
text = _read(relfile)
|
|
137
|
+
matches = re.findall(pattern, text)
|
|
138
|
+
if not matches:
|
|
139
|
+
errors.append(
|
|
140
|
+
f"{relfile}: anchor for {component!r} not found (pattern {pattern!r}) — "
|
|
141
|
+
"doc reworded? update check_docs_consistency.py"
|
|
142
|
+
)
|
|
143
|
+
continue
|
|
144
|
+
want = actuals[component]
|
|
145
|
+
for got in matches:
|
|
146
|
+
if int(got) != want:
|
|
147
|
+
errors.append(
|
|
148
|
+
f"{relfile}: {component} count says {got}, but there are {want} "
|
|
149
|
+
f"(pattern {pattern!r})"
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
# Collection skills also drive the living index table in docs/stack-skills/README.md.
|
|
153
|
+
idx = _read("docs/stack-skills/README.md")
|
|
154
|
+
rows = [ln for ln in idx.splitlines() if re.match(r"\|\s*\*\*", ln)]
|
|
155
|
+
if len(rows) != actuals["collection skills"]:
|
|
156
|
+
errors.append(
|
|
157
|
+
f"docs/stack-skills/README.md: {len(rows)} skill rows, but "
|
|
158
|
+
f"{actuals['collection skills']} collection skills exist on disk"
|
|
159
|
+
)
|
|
160
|
+
return errors
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
# --------------------------------------------------------------------------------------------------
|
|
164
|
+
# 3) Profile -> gate tables
|
|
165
|
+
# --------------------------------------------------------------------------------------------------
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
def _effective_gates() -> dict[str, set[str]]:
|
|
169
|
+
"""Resolve each profile's effective gate set from profiles.yaml (unioning ``inherit``)."""
|
|
170
|
+
profiles = yaml.safe_load(_read("catalog/profiles.yaml"))["profiles"]
|
|
171
|
+
cache: dict[str, set[str]] = {}
|
|
172
|
+
|
|
173
|
+
def resolve(name: str) -> set[str]:
|
|
174
|
+
if name in cache:
|
|
175
|
+
return cache[name]
|
|
176
|
+
p = profiles[name]
|
|
177
|
+
gates = set(p.get("gates") or [])
|
|
178
|
+
if p.get("inherit"):
|
|
179
|
+
gates |= resolve(p["inherit"])
|
|
180
|
+
cache[name] = gates
|
|
181
|
+
return gates
|
|
182
|
+
|
|
183
|
+
return {name: resolve(name) for name in profiles}
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
def _doc_gate_sets(relfile: str) -> dict[str, set[str]]:
|
|
187
|
+
"""Parse the lean/standard/enterprise gate rows from a doc's profile→gate table."""
|
|
188
|
+
raw: dict[str, str] = {}
|
|
189
|
+
for line in _read(relfile).splitlines():
|
|
190
|
+
m = re.match(r"\|\s*\*\*(lean|standard|enterprise)\*\*\s*\|(.+?)\|\s*$", line)
|
|
191
|
+
if m:
|
|
192
|
+
raw[m.group(1)] = m.group(2)
|
|
193
|
+
|
|
194
|
+
def tokens(cell: str) -> set[str]:
|
|
195
|
+
return {
|
|
196
|
+
t.strip().strip("*").strip("\\").strip()
|
|
197
|
+
for t in cell.split("·")
|
|
198
|
+
if t.strip().strip("*").strip("\\").strip()
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
def expand(profile: str) -> set[str]:
|
|
202
|
+
cell = raw[profile]
|
|
203
|
+
if (
|
|
204
|
+
"+" in cell
|
|
205
|
+
): # e.g. "standard + pipeline-green · observability-ready · acceptance"
|
|
206
|
+
base, extra = cell.split("+", 1)
|
|
207
|
+
return expand(base.strip().strip("*").lower()) | tokens(extra)
|
|
208
|
+
return tokens(cell)
|
|
209
|
+
|
|
210
|
+
return {p: expand(p) for p in raw}
|
|
211
|
+
|
|
212
|
+
|
|
213
|
+
def check_profile_gates() -> list[str]:
|
|
214
|
+
effective = _effective_gates()
|
|
215
|
+
errors: list[str] = []
|
|
216
|
+
for relfile in ("README.md", "skills/sdlc/SKILL.md"):
|
|
217
|
+
doc = _doc_gate_sets(relfile)
|
|
218
|
+
for profile in ("lean", "standard", "enterprise"):
|
|
219
|
+
if profile not in doc:
|
|
220
|
+
errors.append(f"{relfile}: no gate row found for profile {profile!r}")
|
|
221
|
+
continue
|
|
222
|
+
if doc[profile] != effective[profile]:
|
|
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)}")
|
|
230
|
+
errors.append(
|
|
231
|
+
f"{relfile}: {profile} gate row disagrees with profiles.yaml — "
|
|
232
|
+
+ "; ".join(detail)
|
|
233
|
+
)
|
|
234
|
+
return errors
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
# --------------------------------------------------------------------------------------------------
|
|
238
|
+
|
|
239
|
+
|
|
240
|
+
def run() -> list[str]:
|
|
241
|
+
"""Run every check and return the combined list of error messages (empty = consistent)."""
|
|
242
|
+
return check_versions() + check_counts() + check_profile_gates()
|
|
243
|
+
|
|
244
|
+
|
|
245
|
+
def main() -> int:
|
|
246
|
+
errors = run()
|
|
247
|
+
if errors:
|
|
248
|
+
print("docs consistency: FAIL")
|
|
249
|
+
for e in errors:
|
|
250
|
+
print(f" - {e}")
|
|
251
|
+
return 1
|
|
252
|
+
print("docs consistency: OK")
|
|
253
|
+
return 0
|
|
254
|
+
|
|
255
|
+
|
|
256
|
+
if __name__ == "__main__":
|
|
257
|
+
sys.exit(main())
|