claude-code-kit 0.23.0__tar.gz → 0.24.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.
Files changed (521) hide show
  1. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/.claude-plugin/marketplace.json +1 -1
  2. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/.claude-plugin/plugin.json +1 -1
  3. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/CHANGELOG.md +43 -0
  4. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/CLAUDE.md +1 -1
  5. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/CONTRIBUTING.md +10 -2
  6. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/PKG-INFO +10 -3
  7. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/README.md +6 -2
  8. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/warn-missing-tests.sh +1 -1
  9. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/warn-sensitive-files.sh +1 -1
  10. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/pyproject.toml +18 -1
  11. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/src/claude_kit/__init__.py +1 -1
  12. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/src/claude_kit/__main__.py +1 -3
  13. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/src/claude_kit/cli.py +65 -4
  14. claude_code_kit-0.24.0/src/claude_kit/pipeline.py +240 -0
  15. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/src/claude_kit/prompts.py +6 -1
  16. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/src/claude_kit/scaffold.py +73 -3
  17. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/src/claude_kit/upgrader.py +5 -4
  18. claude_code_kit-0.24.0/src/claude_kit/validator.py +574 -0
  19. claude_code_kit-0.23.0/src/claude_kit/validator.py +0 -212
  20. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/.gitignore +0 -0
  21. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/LICENSE +0 -0
  22. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/acceptance-reviewer.md +0 -0
  23. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/auditor.md +0 -0
  24. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/dependency-scanner.md +0 -0
  25. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/developer.md +0 -0
  26. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/devils-advocate.md +0 -0
  27. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/devops-engineer.md +0 -0
  28. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/e2e-tester.md +0 -0
  29. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/em-reviewer.md +0 -0
  30. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/incident-responder.md +0 -0
  31. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/merge-reviewer.md +0 -0
  32. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/observability-engineer.md +0 -0
  33. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/orchestrator.md +0 -0
  34. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/owasp-reviewer.md +0 -0
  35. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/policy-validator.md +0 -0
  36. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/pr-raiser.md +0 -0
  37. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/risk-classifier.md +0 -0
  38. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/sdlc-code-reviewer.md +0 -0
  39. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/secret-scanner.md +0 -0
  40. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/security-reviewer.md +0 -0
  41. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/senior-backend-dev.md +0 -0
  42. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/senior-frontend-dev.md +0 -0
  43. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/senior-tester.md +0 -0
  44. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/spec-doc-writer.md +0 -0
  45. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/story-planner.md +0 -0
  46. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/technical-architect.md +0 -0
  47. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/tester.md +0 -0
  48. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/ui-designer.md +0 -0
  49. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/agents/unit-tester.md +0 -0
  50. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/catalog/capture.yaml +0 -0
  51. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/catalog/mcp.yaml +0 -0
  52. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/catalog/org.yaml +0 -0
  53. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/catalog/profiles.yaml +0 -0
  54. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/catalog/stacks.yaml +0 -0
  55. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/commands/abort.md +0 -0
  56. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/commands/init.md +0 -0
  57. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/commands/sdlc.md +0 -0
  58. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/commands/status.md +0 -0
  59. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/docs/agentic-patterns.md +0 -0
  60. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/docs/agents.md +0 -0
  61. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/docs/architecture.md +0 -0
  62. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/docs/coverage-audit.md +0 -0
  63. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/docs/eval-harness.md +0 -0
  64. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/docs/org-capabilities.md +0 -0
  65. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/docs/stack-skills/GAP-ANALYSIS.md +0 -0
  66. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/docs/stack-skills/README.md +0 -0
  67. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/docs/stack-skills/REPO-INVENTORY.md +0 -0
  68. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/hooks.json +0 -0
  69. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/audit-log.sh +0 -0
  70. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/capture-learnings.sh +0 -0
  71. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/guard-destructive-git.sh +0 -0
  72. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/guard-kubectl-delete.sh +0 -0
  73. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/guard-secrets.sh +0 -0
  74. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/lint-fix.sh +0 -0
  75. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/load-autonomy.sh +0 -0
  76. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/load-continuity.sh +0 -0
  77. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/load-learnings.sh +0 -0
  78. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/type-check.sh +0 -0
  79. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/validate-frontmatter.sh +0 -0
  80. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/validate-settings.sh +0 -0
  81. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/warn-large-edits.sh +0 -0
  82. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/warn-llm-io.sh +0 -0
  83. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/hooks/scripts/warn-shared-modules.sh +0 -0
  84. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/agent-guardrails.md +0 -0
  85. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/agent-memory.md +0 -0
  86. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/agent-resilience.md +0 -0
  87. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/autonomy-levels.md +0 -0
  88. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/code-organization.md +0 -0
  89. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/continuity.md +0 -0
  90. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/design-patterns.md +0 -0
  91. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/devops-observability.md +0 -0
  92. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/documentation.md +0 -0
  93. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/evals.md +0 -0
  94. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/frontend-best-practices.md +0 -0
  95. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/goal-setting-and-monitoring.md +0 -0
  96. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/human-in-the-loop.md +0 -0
  97. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/linting-and-formatting.md +0 -0
  98. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/mandatory-workflow.md +0 -0
  99. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/model-tiers.md +0 -0
  100. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/quality-gates.md +0 -0
  101. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/rarv-cycle.md +0 -0
  102. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/reasoning-techniques.md +0 -0
  103. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/responsive-and-accessibility.md +0 -0
  104. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/risk-classification.md +0 -0
  105. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/testing.md +0 -0
  106. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/rules/tool-design.md +0 -0
  107. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/scripts/check_docs_consistency.py +0 -0
  108. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/scripts/gen_hooks.py +0 -0
  109. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/scripts/init.sh +0 -0
  110. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/_references/accessibility-checklist.md +0 -0
  111. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/_references/orchestration-patterns.md +0 -0
  112. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/_references/performance-checklist.md +0 -0
  113. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/_references/security-checklist.md +0 -0
  114. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/_references/testing-patterns.md +0 -0
  115. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/accessibility-review/SKILL.md +0 -0
  116. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/alembic-migrations/README.md +0 -0
  117. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/alembic-migrations/SKILL.md +0 -0
  118. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/alembic-migrations/references/alembic-setup-and-env.md +0 -0
  119. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/alembic-migrations/references/async-and-multitenant-migrations.md +0 -0
  120. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/alembic-migrations/references/repo-evidence.md +0 -0
  121. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/alembic-migrations/references/troubleshooting-and-debugging.md +0 -0
  122. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/alembic-migrations/references/writing-migrations.md +0 -0
  123. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/anthropic-vertex-integration/README.md +0 -0
  124. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/anthropic-vertex-integration/SKILL.md +0 -0
  125. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/anthropic-vertex-integration/references/generate-helpers-and-retry.md +0 -0
  126. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/anthropic-vertex-integration/references/repo-evidence.md +0 -0
  127. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/anthropic-vertex-integration/references/vertex-client-and-auth.md +0 -0
  128. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/api-and-interface-design/SKILL.md +0 -0
  129. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/api-integration/SKILL.md +0 -0
  130. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/api-pagination-filtering-sorting/README.md +0 -0
  131. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/api-pagination-filtering-sorting/SKILL.md +0 -0
  132. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/api-pagination-filtering-sorting/references/query-params-conventions.md +0 -0
  133. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/api-pagination-filtering-sorting/references/repo-evidence.md +0 -0
  134. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/api-pagination-filtering-sorting/references/response-metadata.md +0 -0
  135. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/archive-sprint/SKILL.md +0 -0
  136. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/async-python-patterns/README.md +0 -0
  137. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/async-python-patterns/SKILL.md +0 -0
  138. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/async-python-patterns/references/async-boundaries.md +0 -0
  139. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/async-python-patterns/references/lifecycle-and-gather.md +0 -0
  140. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/async-python-patterns/references/repo-evidence.md +0 -0
  141. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/auth-and-rbac/README.md +0 -0
  142. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/auth-and-rbac/SKILL.md +0 -0
  143. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/auth-and-rbac/references/auth-dependencies.md +0 -0
  144. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/auth-and-rbac/references/rbac-and-permissions.md +0 -0
  145. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/auth-and-rbac/references/repo-evidence.md +0 -0
  146. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/auth-and-rbac/references/security-hardening.md +0 -0
  147. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/auth-and-rbac/references/tokens-and-hashing.md +0 -0
  148. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/backend-repo-architecture/README.md +0 -0
  149. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/backend-repo-architecture/SKILL.md +0 -0
  150. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/backend-repo-architecture/references/deployment-patterns.md +0 -0
  151. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/backend-repo-architecture/references/entrypoint-and-config.md +0 -0
  152. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/backend-repo-architecture/references/repo-evidence.md +0 -0
  153. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/backend-repo-architecture/references/structure-patterns.md +0 -0
  154. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/backend-repo-architecture/references/troubleshooting.md +0 -0
  155. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/backlog/SKILL.md +0 -0
  156. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/backlog/item-template.md +0 -0
  157. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/browser-testing-with-devtools/SKILL.md +0 -0
  158. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/bug-hunt/SKILL.md +0 -0
  159. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/ci-cd-and-automation/SKILL.md +0 -0
  160. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/code-review-and-quality/SKILL.md +0 -0
  161. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/code-simplification/SKILL.md +0 -0
  162. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/component-design/SKILL.md +0 -0
  163. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/configargparse-yaml-env-layering/README.md +0 -0
  164. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/configargparse-yaml-env-layering/SKILL.md +0 -0
  165. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/configargparse-yaml-env-layering/references/config-layering-anatomy.md +0 -0
  166. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/configargparse-yaml-env-layering/references/mode-dispatch-and-precedence.md +0 -0
  167. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/configargparse-yaml-env-layering/references/repo-evidence.md +0 -0
  168. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/consolidate-learnings/SKILL.md +0 -0
  169. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/containerization-and-deployment/README.md +0 -0
  170. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/containerization-and-deployment/SKILL.md +0 -0
  171. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/containerization-and-deployment/references/deployment-and-secrets.md +0 -0
  172. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/containerization-and-deployment/references/dockerfile-and-compose.md +0 -0
  173. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/containerization-and-deployment/references/entrypoint-and-modes.md +0 -0
  174. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/containerization-and-deployment/references/kerberos-kinit-bootstrap.md +0 -0
  175. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/containerization-and-deployment/references/makefile-dev-workflow.md +0 -0
  176. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/containerization-and-deployment/references/repo-evidence.md +0 -0
  177. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/context-engineering/SKILL.md +0 -0
  178. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/cron-and-scheduled-jobs/README.md +0 -0
  179. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/cron-and-scheduled-jobs/SKILL.md +0 -0
  180. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/cron-and-scheduled-jobs/references/choosing-and-operations.md +0 -0
  181. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/cron-and-scheduled-jobs/references/kubernetes-cronjob.md +0 -0
  182. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/cron-and-scheduled-jobs/references/repo-evidence.md +0 -0
  183. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/cron-and-scheduled-jobs/references/temporal-schedules.md +0 -0
  184. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/data-engineering-bigquery-gcs/README.md +0 -0
  185. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/data-engineering-bigquery-gcs/SKILL.md +0 -0
  186. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/data-engineering-bigquery-gcs/references/bigquery-advanced-patterns.md +0 -0
  187. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/data-engineering-bigquery-gcs/references/bigquery-gcs-io.md +0 -0
  188. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/data-engineering-bigquery-gcs/references/medallion-architecture.md +0 -0
  189. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/data-engineering-bigquery-gcs/references/repo-evidence.md +0 -0
  190. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/data-engineering-bigquery-gcs/references/temp-table-merge-pattern.md +0 -0
  191. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/debugging-and-error-recovery/SKILL.md +0 -0
  192. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/decision/SKILL.md +0 -0
  193. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/decision/adr-template.md +0 -0
  194. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/deprecation-and-migration/SKILL.md +0 -0
  195. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/design-patterns-and-conventions/README.md +0 -0
  196. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/design-patterns-and-conventions/SKILL.md +0 -0
  197. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/design-patterns-and-conventions/references/anti-patterns.md +0 -0
  198. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/design-patterns-and-conventions/references/naming-and-layout.md +0 -0
  199. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/design-patterns-and-conventions/references/patterns-catalog.md +0 -0
  200. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/design-patterns-and-conventions/references/repo-evidence.md +0 -0
  201. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/design-patterns-and-conventions/references/testing-patterns.md +0 -0
  202. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/design-patterns-and-conventions/references/troubleshooting.md +0 -0
  203. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/docker-compose/README.md +0 -0
  204. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/docker-compose/SKILL.md +0 -0
  205. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/docker-compose/references/compose-services-and-healthchecks.md +0 -0
  206. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/docker-compose/references/dev-vs-prod-variants.md +0 -0
  207. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/docker-compose/references/repo-evidence.md +0 -0
  208. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/docker-shared/README.md +0 -0
  209. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/docker-shared/SKILL.md +0 -0
  210. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/docker-shared/references/dockerignore-and-build-secrets.md +0 -0
  211. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/docker-shared/references/repo-evidence.md +0 -0
  212. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/docker-shared/references/shared-base-images.md +0 -0
  213. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/docker-shared/references/shared-compose-fragments.md +0 -0
  214. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/dockerfile-backend/README.md +0 -0
  215. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/dockerfile-backend/SKILL.md +0 -0
  216. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/dockerfile-backend/references/backend-dockerfile-anatomy.md +0 -0
  217. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/dockerfile-backend/references/repo-evidence.md +0 -0
  218. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/dockerfile-backend/references/system-deps-and-caching.md +0 -0
  219. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/dockerfile-frontend/README.md +0 -0
  220. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/dockerfile-frontend/SKILL.md +0 -0
  221. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/dockerfile-frontend/references/build-args-and-nginx.md +0 -0
  222. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/dockerfile-frontend/references/frontend-dockerfile-anatomy.md +0 -0
  223. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/dockerfile-frontend/references/repo-evidence.md +0 -0
  224. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/documentation-and-adrs/SKILL.md +0 -0
  225. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/doubt-driven-development/SKILL.md +0 -0
  226. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/edge-to-service-trust-boundary/README.md +0 -0
  227. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/edge-to-service-trust-boundary/SKILL.md +0 -0
  228. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/edge-to-service-trust-boundary/references/repo-evidence.md +0 -0
  229. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/edge-to-service-trust-boundary/references/trust-contract.md +0 -0
  230. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/execute/SKILL.md +0 -0
  231. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/fastapi-service-patterns/README.md +0 -0
  232. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/fastapi-service-patterns/SKILL.md +0 -0
  233. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/fastapi-service-patterns/references/api-versioning.md +0 -0
  234. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/fastapi-service-patterns/references/app-factory-and-lifespan.md +0 -0
  235. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/fastapi-service-patterns/references/custom-route-and-middleware.md +0 -0
  236. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/fastapi-service-patterns/references/dependency-injection.md +0 -0
  237. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/fastapi-service-patterns/references/model-and-serialization-patterns.md +0 -0
  238. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/fastapi-service-patterns/references/repo-evidence.md +0 -0
  239. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/file-export-and-reporting/README.md +0 -0
  240. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/file-export-and-reporting/SKILL.md +0 -0
  241. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/file-export-and-reporting/references/excel-generation.md +0 -0
  242. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/file-export-and-reporting/references/repo-evidence.md +0 -0
  243. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/file-export-and-reporting/references/streaming-and-downloads.md +0 -0
  244. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/frontend-repo-architecture/README.md +0 -0
  245. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/frontend-repo-architecture/SKILL.md +0 -0
  246. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/frontend-repo-architecture/references/api-layer-and-types.md +0 -0
  247. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/frontend-repo-architecture/references/divergences.md +0 -0
  248. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/frontend-repo-architecture/references/repo-evidence.md +0 -0
  249. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/frontend-repo-architecture/references/structure-and-state.md +0 -0
  250. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/frontend-repo-architecture/references/testing-patterns.md +0 -0
  251. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/frontend-ui-engineering/SKILL.md +0 -0
  252. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/gcp-cloud-run-github-actions/README.md +0 -0
  253. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/gcp-cloud-run-github-actions/SKILL.md +0 -0
  254. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/gcp-cloud-run-github-actions/references/cloud-run-deploy.md +0 -0
  255. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/gcp-cloud-run-github-actions/references/repo-evidence.md +0 -0
  256. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/gcp-cloud-run-github-actions/references/workflow-structure.md +0 -0
  257. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/gcs-file-storage-patterns/README.md +0 -0
  258. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/gcs-file-storage-patterns/SKILL.md +0 -0
  259. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/gcs-file-storage-patterns/references/client-and-uploads.md +0 -0
  260. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/gcs-file-storage-patterns/references/repo-evidence.md +0 -0
  261. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/gcs-file-storage-patterns/references/signed-urls-and-reads.md +0 -0
  262. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/git-workflow-and-versioning/SKILL.md +0 -0
  263. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/grafana-dashboards-and-alerts/README.md +0 -0
  264. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/grafana-dashboards-and-alerts/SKILL.md +0 -0
  265. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/grafana-dashboards-and-alerts/references/dashboard-json-and-templating.md +0 -0
  266. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/grafana-dashboards-and-alerts/references/provisioning-and-organization.md +0 -0
  267. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/grafana-dashboards-and-alerts/references/red-metrics-queries.md +0 -0
  268. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/grafana-dashboards-and-alerts/references/repo-evidence.md +0 -0
  269. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/grafana-dashboards-and-alerts/references/unified-alerting.md +0 -0
  270. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/graphql-patterns/README.md +0 -0
  271. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/graphql-patterns/SKILL.md +0 -0
  272. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/graphql-patterns/references/apollo-client-frontend.md +0 -0
  273. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/graphql-patterns/references/apollo-client-setup.md +0 -0
  274. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/graphql-patterns/references/repo-evidence.md +0 -0
  275. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/graphql-patterns/references/strawberry-backend.md +0 -0
  276. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/graphql-patterns/references/when-to-use-graphql.md +0 -0
  277. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/idea-refine/SKILL.md +0 -0
  278. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/idea-refine/examples.md +0 -0
  279. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/idea-refine/frameworks.md +0 -0
  280. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/idea-refine/refinement-criteria.md +0 -0
  281. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/idea-refine/scripts/idea-refine.sh +0 -0
  282. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/incident-postmortem/SKILL.md +0 -0
  283. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/incremental-implementation/SKILL.md +0 -0
  284. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/interview-me/SKILL.md +0 -0
  285. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kafka-config-driven/README.md +0 -0
  286. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kafka-config-driven/SKILL.md +0 -0
  287. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kafka-config-driven/references/config-and-sasl-kerberos.md +0 -0
  288. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kafka-config-driven/references/consumer-producer-patterns.md +0 -0
  289. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kafka-config-driven/references/repo-evidence.md +0 -0
  290. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kafka-config-driven/references/troubleshooting-and-patterns.md +0 -0
  291. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kubectl-operations/README.md +0 -0
  292. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kubectl-operations/SKILL.md +0 -0
  293. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kubectl-operations/references/command-reference.md +0 -0
  294. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kubectl-operations/references/context-namespace-rbac.md +0 -0
  295. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kubectl-operations/references/debugging-playbooks.md +0 -0
  296. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kubectl-operations/references/output-formats-and-selectors.md +0 -0
  297. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kubectl-operations/references/repo-evidence.md +0 -0
  298. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kubernetes-workload-hardening/README.md +0 -0
  299. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kubernetes-workload-hardening/SKILL.md +0 -0
  300. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kubernetes-workload-hardening/references/networkpolicy-and-rbac.md +0 -0
  301. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kubernetes-workload-hardening/references/repo-evidence.md +0 -0
  302. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/kubernetes-workload-hardening/references/securitycontext-and-podsecurity.md +0 -0
  303. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/langfuse-llm-tracing/README.md +0 -0
  304. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/langfuse-llm-tracing/SKILL.md +0 -0
  305. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/langfuse-llm-tracing/references/langfuse-client-and-tracing.md +0 -0
  306. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/langfuse-llm-tracing/references/python-and-typescript.md +0 -0
  307. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/langfuse-llm-tracing/references/repo-evidence.md +0 -0
  308. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/load-testing/SKILL.md +0 -0
  309. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/manual-test/SKILL.md +0 -0
  310. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/modernization-and-migration/README.md +0 -0
  311. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/modernization-and-migration/SKILL.md +0 -0
  312. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/modernization-and-migration/references/migration-best-practices.md +0 -0
  313. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/modernization-and-migration/references/pydantic-v1-to-v2.md +0 -0
  314. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/modernization-and-migration/references/repo-evidence.md +0 -0
  315. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/modernization-and-migration/references/shared-internal-library.md +0 -0
  316. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/modernization-and-migration/references/sqlalchemy-14-to-20.md +0 -0
  317. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/multi-tenancy-patterns/README.md +0 -0
  318. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/multi-tenancy-patterns/SKILL.md +0 -0
  319. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/multi-tenancy-patterns/references/caching-patterns.md +0 -0
  320. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/multi-tenancy-patterns/references/isolation-strategies.md +0 -0
  321. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/multi-tenancy-patterns/references/repo-evidence.md +0 -0
  322. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/multi-tenancy-patterns/references/tenant-resolution.md +0 -0
  323. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/node-express-service/README.md +0 -0
  324. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/node-express-service/SKILL.md +0 -0
  325. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/node-express-service/references/app-factory-and-mode-dispatch.md +0 -0
  326. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/node-express-service/references/config-and-module-alias.md +0 -0
  327. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/node-express-service/references/middleware-patterns.md +0 -0
  328. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/node-express-service/references/repo-evidence.md +0 -0
  329. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/node-objection-knex/README.md +0 -0
  330. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/node-objection-knex/SKILL.md +0 -0
  331. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/node-objection-knex/references/migrations-and-validation.md +0 -0
  332. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/node-objection-knex/references/objection-model-and-knex.md +0 -0
  333. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/node-objection-knex/references/repo-evidence.md +0 -0
  334. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/notifications-and-messaging/README.md +0 -0
  335. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/notifications-and-messaging/SKILL.md +0 -0
  336. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/notifications-and-messaging/references/provider-abstraction.md +0 -0
  337. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/notifications-and-messaging/references/repo-evidence.md +0 -0
  338. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/notifications-and-messaging/references/templates-and-fallback.md +0 -0
  339. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/observability-and-logging/README.md +0 -0
  340. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/observability-and-logging/SKILL.md +0 -0
  341. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/observability-and-logging/references/health-and-readiness.md +0 -0
  342. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/observability-and-logging/references/logging-and-structlog.md +0 -0
  343. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/observability-and-logging/references/outbound-metrics-and-multi-mode.md +0 -0
  344. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/observability-and-logging/references/pii-redaction.md +0 -0
  345. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/observability-and-logging/references/repo-evidence.md +0 -0
  346. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/observability-and-logging/references/tracing-and-metrics.md +0 -0
  347. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/over-engineering-review/SKILL.md +0 -0
  348. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/performance-optimization/SKILL.md +0 -0
  349. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/planning-and-task-breakdown/SKILL.md +0 -0
  350. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/playwright-verification/SKILL.md +0 -0
  351. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/pydantic-schema-patterns/README.md +0 -0
  352. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/pydantic-schema-patterns/SKILL.md +0 -0
  353. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/pydantic-schema-patterns/references/repo-evidence.md +0 -0
  354. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/pydantic-schema-patterns/references/settings-and-validation.md +0 -0
  355. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/pydantic-schema-patterns/references/troubleshooting-and-common-errors.md +0 -0
  356. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/pydantic-schema-patterns/references/v1-vs-v2.md +0 -0
  357. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/python-dao-and-database/README.md +0 -0
  358. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/python-dao-and-database/SKILL.md +0 -0
  359. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/python-dao-and-database/references/advanced-query-patterns.md +0 -0
  360. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/python-dao-and-database/references/basedao-and-sessions.md +0 -0
  361. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/python-dao-and-database/references/mongodb-advanced.md +0 -0
  362. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/python-dao-and-database/references/other-db-mongodb.md +0 -0
  363. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/python-dao-and-database/references/repo-evidence.md +0 -0
  364. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/python-dao-and-database/references/sqlalchemy-1x-vs-2x.md +0 -0
  365. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/radix-tailwind-component-patterns/README.md +0 -0
  366. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/radix-tailwind-component-patterns/SKILL.md +0 -0
  367. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/radix-tailwind-component-patterns/references/radix-primitives-and-variants.md +0 -0
  368. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/radix-tailwind-component-patterns/references/repo-evidence.md +0 -0
  369. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/radix-tailwind-component-patterns/references/tailwind-theme-and-cn.md +0 -0
  370. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/react-hook-form-zod-patterns/README.md +0 -0
  371. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/react-hook-form-zod-patterns/SKILL.md +0 -0
  372. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/react-hook-form-zod-patterns/references/form-setup-and-zod.md +0 -0
  373. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/react-hook-form-zod-patterns/references/multi-step-and-modes.md +0 -0
  374. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/react-hook-form-zod-patterns/references/repo-evidence.md +0 -0
  375. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/redis-caching-patterns/README.md +0 -0
  376. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/redis-caching-patterns/SKILL.md +0 -0
  377. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/redis-caching-patterns/references/cache-manager-and-fallback.md +0 -0
  378. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/redis-caching-patterns/references/namespacing-and-invalidation.md +0 -0
  379. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/redis-caching-patterns/references/repo-evidence.md +0 -0
  380. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/refresh-docs/SKILL.md +0 -0
  381. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/remember/SKILL.md +0 -0
  382. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/scope/SKILL.md +0 -0
  383. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/scope/scope-template.md +0 -0
  384. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/sdlc/SKILL.md +0 -0
  385. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/security-and-hardening/SKILL.md +0 -0
  386. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/security-verification/SKILL.md +0 -0
  387. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/shannon-ai-pentest/README.md +0 -0
  388. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/shannon-ai-pentest/SKILL.md +0 -0
  389. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/shannon-ai-pentest/references/operating-guide.md +0 -0
  390. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/shipping-and-launch/SKILL.md +0 -0
  391. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/simplification-debt/SKILL.md +0 -0
  392. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/smoke-test/SKILL.md +0 -0
  393. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/source-driven-development/SKILL.md +0 -0
  394. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/spec-driven-development/SKILL.md +0 -0
  395. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/sprint/SKILL.md +0 -0
  396. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/sprint/sprint-template.md +0 -0
  397. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/tanstack-react-query-patterns/README.md +0 -0
  398. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/tanstack-react-query-patterns/SKILL.md +0 -0
  399. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/tanstack-react-query-patterns/references/mutations-and-cache.md +0 -0
  400. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/tanstack-react-query-patterns/references/query-keys-and-hooks.md +0 -0
  401. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/tanstack-react-query-patterns/references/repo-evidence.md +0 -0
  402. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/task-tracker-sync/SKILL.md +0 -0
  403. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/temporal-config-driven/README.md +0 -0
  404. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/temporal-config-driven/SKILL.md +0 -0
  405. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/temporal-config-driven/references/config-and-retry-idempotency.md +0 -0
  406. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/temporal-config-driven/references/dag-dsl-interpreter.md +0 -0
  407. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/temporal-config-driven/references/repo-evidence.md +0 -0
  408. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/temporal-config-driven/references/schedule-registration.md +0 -0
  409. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/temporal-config-driven/references/schedules-and-cron.md +0 -0
  410. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/temporal-config-driven/references/worker-workflow-activity-patterns.md +0 -0
  411. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/test-driven-development/SKILL.md +0 -0
  412. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/test-plan-review/SKILL.md +0 -0
  413. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/testing-conventions/README.md +0 -0
  414. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/testing-conventions/SKILL.md +0 -0
  415. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/testing-conventions/references/async-and-mocking.md +0 -0
  416. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/testing-conventions/references/coverage-gap-and-recommendations.md +0 -0
  417. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/testing-conventions/references/github-actions-test-orchestration.md +0 -0
  418. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/testing-conventions/references/pytest-and-fixtures.md +0 -0
  419. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/testing-conventions/references/pytest-asyncio-modes.md +0 -0
  420. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/testing-conventions/references/repo-evidence.md +0 -0
  421. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/testing-conventions/references/security-regression-tests.md +0 -0
  422. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/testing-conventions/references/vitest-frontend-testing.md +0 -0
  423. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/threat-model/SKILL.md +0 -0
  424. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/triage/SKILL.md +0 -0
  425. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/ui-ux-design/SKILL.md +0 -0
  426. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/unit-test/SKILL.md +0 -0
  427. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/using-agent-skills/SKILL.md +0 -0
  428. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/vitest-rtl-msw-patterns/README.md +0 -0
  429. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/vitest-rtl-msw-patterns/SKILL.md +0 -0
  430. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/vitest-rtl-msw-patterns/references/msw-and-contract-tests.md +0 -0
  431. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/vitest-rtl-msw-patterns/references/repo-evidence.md +0 -0
  432. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/vitest-rtl-msw-patterns/references/vitest-rtl-setup.md +0 -0
  433. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/zap-vapt-scanning/README.md +0 -0
  434. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/zap-vapt-scanning/SKILL.md +0 -0
  435. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/zap-vapt-scanning/references/operating-guide.md +0 -0
  436. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/zap-vapt-scanning/scripts/endpoints.example.txt +0 -0
  437. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/zap-vapt-scanning/scripts/requirements.txt +0 -0
  438. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/zap-vapt-scanning/scripts/zap_vapt.py +0 -0
  439. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/zustand-state-patterns/README.md +0 -0
  440. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/zustand-state-patterns/SKILL.md +0 -0
  441. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/zustand-state-patterns/references/async-polling-and-persistence.md +0 -0
  442. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/zustand-state-patterns/references/repo-evidence.md +0 -0
  443. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/skills/zustand-state-patterns/references/store-structure-and-selectors.md +0 -0
  444. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/src/claude_kit/catalog.py +0 -0
  445. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/src/claude_kit/hooks.py +0 -0
  446. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/src/claude_kit/models.py +0 -0
  447. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/src/claude_kit/render.py +0 -0
  448. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/CLAUDE.md +0 -0
  449. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/CLAUDE.stack.md.tmpl +0 -0
  450. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/CONTINUITY.template.md +0 -0
  451. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/README.claude-sdlc.md.tmpl +0 -0
  452. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/agent-memory/MEMORY.md +0 -0
  453. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/agent-memory/api/.gitkeep +0 -0
  454. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/agent-memory/architecture/.gitkeep +0 -0
  455. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/agent-memory/debugging/.gitkeep +0 -0
  456. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/agent-memory/gotchas/.gitkeep +0 -0
  457. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/agent-memory/patterns/.gitkeep +0 -0
  458. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/agent-memory/performance/.gitkeep +0 -0
  459. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/artifacts/adr.md +0 -0
  460. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/artifacts/api-change-report.md +0 -0
  461. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/artifacts/feature-spec.md +0 -0
  462. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/artifacts/release-plan.md +0 -0
  463. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/artifacts/runbook.md +0 -0
  464. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/artifacts/security-review.md +0 -0
  465. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/artifacts/test-plan.md +0 -0
  466. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/README.md +0 -0
  467. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/agents/data-workflow-agent.md +0 -0
  468. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/agents/founder-prototype-agent.md +0 -0
  469. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/agents/internal-tools-builder.md +0 -0
  470. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/agents/pm-copilot.md +0 -0
  471. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/agents/staff-pm-reviewer.md +0 -0
  472. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/agents/support-ticket-engineer.md +0 -0
  473. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/packs/devops-and-release/README.md +0 -0
  474. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/packs/devops-and-release/pack.yaml +0 -0
  475. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/packs/engineering-core/README.md +0 -0
  476. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/packs/engineering-core/pack.yaml +0 -0
  477. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/packs/non-engineer-builder/README.md +0 -0
  478. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/packs/non-engineer-builder/pack.yaml +0 -0
  479. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/packs/onboarding-and-docs/README.md +0 -0
  480. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/packs/onboarding-and-docs/pack.yaml +0 -0
  481. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/packs/product-to-code/README.md +0 -0
  482. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/packs/product-to-code/pack.yaml +0 -0
  483. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/packs/quality-and-review/README.md +0 -0
  484. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/packs/quality-and-review/pack.yaml +0 -0
  485. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/packs/security-and-compliance/README.md +0 -0
  486. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/packs/security-and-compliance/pack.yaml +0 -0
  487. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/rules/ai-working-agreement.md +0 -0
  488. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/rules/ambiguity-resolution.md +0 -0
  489. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/rules/branch-and-pr-policy.md +0 -0
  490. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/rules/compliance-policy.md +0 -0
  491. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/rules/non-engineer-safe-coding.md +0 -0
  492. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/rules/pii-policy.md +0 -0
  493. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/rules/production-data-policy.md +0 -0
  494. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/rules/prompt-to-task-conversion.md +0 -0
  495. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/rules/prototype-boundaries.md +0 -0
  496. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/rules/secrets-policy.md +0 -0
  497. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/skills/customer-issue-to-fix/SKILL.md +0 -0
  498. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/skills/feature-from-idea/SKILL.md +0 -0
  499. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/skills/prompt-to-safe-task/SKILL.md +0 -0
  500. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/skills/prototype-to-production/SKILL.md +0 -0
  501. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/skills/repo-onboarding/SKILL.md +0 -0
  502. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/skills/review-scope/SKILL.md +0 -0
  503. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/skills/review-sprint/SKILL.md +0 -0
  504. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/skills/review-sprint-plan/SKILL.md +0 -0
  505. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/org/skills/review-ux-flow/SKILL.md +0 -0
  506. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/settings.json +0 -0
  507. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/stacks/backend/go/net-http/rules/go-patterns.md +0 -0
  508. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/stacks/backend/python/fastapi/rules/fastapi-patterns.md +0 -0
  509. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/stacks/db/mongodb/agents/migration-specialist.md +0 -0
  510. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/stacks/db/mongodb/agents/mongodb-specialist.md +0 -0
  511. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/stacks/db/mongodb/rules/mongodb-patterns.md +0 -0
  512. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/stacks/db/postgres/agents/db-performance-reviewer.md +0 -0
  513. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/stacks/db/postgres/agents/migration-specialist.md +0 -0
  514. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/stacks/db/postgres/agents/postgres-specialist.md +0 -0
  515. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/stacks/db/postgres/rules/database-performance.md +0 -0
  516. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/stacks/db/postgres/rules/postgres-patterns.md +0 -0
  517. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/stacks/frontend/react/rules/design-system-compliance.md +0 -0
  518. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/stacks/frontend/react/rules/mobile-design-guidelines.md +0 -0
  519. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/stacks/frontend/react/rules/react-patterns.md +0 -0
  520. {claude_code_kit-0.23.0 → claude_code_kit-0.24.0}/templates/stacks/frontend/react/rules/ui-design-system.md +0 -0
  521. {claude_code_kit-0.23.0 → claude_code_kit-0.24.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.23.0",
13
+ "version": "0.24.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.23.0",
3
+ "version": "0.24.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,49 @@ 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.24.0] — 2026-06-24
8
+
9
+ **PR3 of the phased hardening review: deeper validation, a deterministic pipeline CLI, an MCP
10
+ lockfile, and a CI matrix that brings every distribution channel and quality dimension under test.**
11
+
12
+ ### Added
13
+
14
+ - **`claude-kit validate --strict`** — beyond the structural checks, strict mode verifies that every
15
+ `settings.json` hook fires on a known event and runs an **installed, executable** script; that
16
+ `.mcp.json` has a sane `{mcpServers: {id: {command|url}}}` shape; that the resolved
17
+ `stack-catalog.snapshot.yaml` agrees with the agents/skills/overlays actually on disk; and that the
18
+ **bundled catalog is referentially consistent** (`validator.check_catalog`: every profile resolves to
19
+ existing agents/skills/registered hooks, every stack overlay rule/agent file is present, and the org
20
+ overlay's new skills/agents/rules/packs exist). `doctor` now runs the strict validate by default.
21
+ - **`claude-kit pipeline` command group** (`src/claude_kit/pipeline.py`) — deterministic,
22
+ **non-executing** operations on the `/sdlc` state files: `pipeline validate` (snapshot shape +
23
+ profile/scope/mode/lane/findings coherence, with `last_gate_passed` checked against the installed
24
+ gate set), `pipeline status` (human-readable run summary), `pipeline close-gate <gate> --evidence
25
+ <file>` (records a passed gate, requiring the evidence artifact and a gate name the profile defines),
26
+ and `pipeline abort`. These validate/mutate `.claude/state/pipeline-snapshot.json` — they do **not**
27
+ run the pipeline.
28
+ - **`.mcp.lock.json`** — when `.mcp.json` is written, a deterministic lockfile captures the resolved
29
+ package + pinned version (parsed from the `npx -y <pkg>@<ver>` args) or hosted URL per server, so a
30
+ reviewer can see exactly what would run. It is a kit-owned, derived artifact (refreshed on upgrade,
31
+ never a user sidecar). **`claude-kit doctor --mcp`** checks each server's command is on PATH, warns on
32
+ unset `${ENV}` vars, and flags a lockfile that has drifted from `.mcp.json` (warnings only).
33
+ - **Expanded CI** (`.github/workflows/ci.yml`) — new jobs alongside the test matrix: `lint`
34
+ (`ruff check` + `ruff format --check` + `mypy`), `shell` (`shellcheck -S warning` over all hook + repo
35
+ scripts), `static` (`gen_hooks.py --check`, the docs-consistency guard, catalog referential
36
+ integrity, and JSON validity of the plugin manifests + `hooks.json`), and `wheel-smoke` (build → install
37
+ into a clean venv → `init --defaults` → `validate --strict` → `doctor`). `ruff`/`mypy`/`shellcheck-py`
38
+ are added to the `dev` extra, with conservative `[tool.ruff.lint]` (no E501) and `[tool.mypy]` config.
39
+
40
+ ### Fixed
41
+
42
+ - **Latent type/lint bugs surfaced by the new CI** — `upgrader.py` used `ResolvedPlan` in annotations
43
+ without importing it (harmless under `from __future__ import annotations`, but undefined) and passed
44
+ `str | Path` to a `Path`-typed `_compare`; `_format_preview` could dereference `None`;
45
+ `prompts._choose_many` and `__main__` used None-returning calls in value position. All fixed; the
46
+ codebase is now `ruff` + `mypy --ignore-missing-imports` clean. Two hook scripts had redundant,
47
+ shellcheck-flagged glob alternatives (`*__tests__*` under `*test*`; `*oauth*`/`*authoriz*` under
48
+ `*auth*`) — removed with no behavior change.
49
+
7
50
  ## [0.23.0] — 2026-06-23
8
51
 
9
52
  **PR2 of the phased hardening review: structural single-source-of-truth for hooks, and plugin/CLI
@@ -28,7 +28,7 @@ distributed two ways from one source of truth:
28
28
  | `templates/stacks/<kind>/<id>/` | Per-stack **overlay** content: `rules/` (+ `agents/` for DB stacks). **No application code, no Docker** — the only place stack-specific content lives. |
29
29
  | `templates/org/` | **Org overlay** content (scope-gated, organization only): `skills/`, `agents/` (personas), `rules/` (policy/vibe), `packs/<pack>/{pack.yaml,README.md}`, `README.md`. Wired via `catalog/org.yaml`. The only place org-specific content lives. |
30
30
  | `scripts/init.sh` | Thin no-pip fallback scaffolder (copies the full payload; no catalog resolution) |
31
- | `src/claude_kit/` | The pip CLI (Typer): `cli.py`, `catalog.py` (resolver), `prompts.py`, `models.py`, `scaffold.py` (installer), `render.py` (Jinja2), `hooks.py`, `validator.py`, `upgrader.py` |
31
+ | `src/claude_kit/` | The pip CLI (Typer): `cli.py`, `catalog.py` (resolver), `prompts.py`, `models.py`, `scaffold.py` (installer), `render.py` (Jinja2), `hooks.py`, `validator.py` (incl. `validate --strict` + `check_catalog`), `upgrader.py`, `pipeline.py` (deterministic `/sdlc` state-file ops) |
32
32
  | `tests/` | pytest suite (catalog, render, scaffold, validator, upgrader, CLI; incl. the profile×stack×scope self-test matrix) |
33
33
  | `examples/` | Synthetic end-to-end `/sdlc` worked example (repo reference; **not** bundled into the wheel) |
34
34
  | `docs/architecture.md` · `docs/agents.md` · `docs/coverage-audit.md` · `docs/eval-harness.md` | Architecture diagrams · agent guide · the GATED-vs-RULE-vs-SKILL enforcement audit · the with/without eval template |
@@ -71,6 +71,13 @@ claude-kit diff /tmp/ck-demo
71
71
  # Tests:
72
72
  pytest
73
73
 
74
+ # Lint / type / shell / drift checks (all run in CI — keep them green locally):
75
+ ruff check src scripts tests && ruff format --check src scripts tests
76
+ mypy
77
+ shellcheck -S warning hooks/scripts/*.sh scripts/*.sh
78
+ python scripts/gen_hooks.py --check
79
+ python scripts/check_docs_consistency.py
80
+
74
81
  # Build + validate the package:
75
82
  python3 -m build
76
83
  python3 -m twine check dist/*
@@ -88,8 +95,9 @@ a specific stack — `pytest` enforces the no-Docker invariant on a scaffolded p
88
95
 
89
96
  ## Releasing
90
97
 
91
- 1. Bump the version in **all four** places: `pyproject.toml`, `.claude-plugin/plugin.json`, the
92
- `.claude-plugin/marketplace.json` entry, and `src/claude_kit/__init__.py`.
98
+ 1. Bump the version in **all five** places: `pyproject.toml`, `.claude-plugin/plugin.json`, the
99
+ `.claude-plugin/marketplace.json` entry, `src/claude_kit/__init__.py`, and `SECURITY.md`
100
+ (`check_docs_consistency.py` enforces parity across all of them + the latest `CHANGELOG.md` heading).
93
101
  2. Add a `CHANGELOG.md` entry, including a **"Not adopted (deliberately)"** block stating what you
94
102
  chose *not* to add and why — this is a marketed feature of the changelog (the README links to it),
95
103
  so keep it. If those blocks ever grow unwieldy they may later split into `docs/decision-log.md`,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: claude-code-kit
3
- Version: 0.23.0
3
+ Version: 0.24.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
@@ -21,7 +21,10 @@ Requires-Dist: pyyaml>=6.0
21
21
  Requires-Dist: typer>=0.12
22
22
  Provides-Extra: dev
23
23
  Requires-Dist: build>=1.2; extra == 'dev'
24
+ Requires-Dist: mypy>=1.10; extra == 'dev'
24
25
  Requires-Dist: pytest>=8.0; extra == 'dev'
26
+ Requires-Dist: ruff>=0.6; extra == 'dev'
27
+ Requires-Dist: shellcheck-py>=0.10; extra == 'dev'
25
28
  Requires-Dist: twine>=5.0; extra == 'dev'
26
29
  Description-Content-Type: text/markdown
27
30
 
@@ -613,10 +616,11 @@ everything available.
613
616
  | Command | Description |
614
617
  |---------|-------------|
615
618
  | `init [path] [--defaults] [--config FILE] [--force]` | Scaffold `CLAUDE.md` + `.claude/` (interactive or non-interactive) |
616
- | `validate [path]` | Structurally validate an installed config |
617
- | `doctor [path]` | Validate + environment/health checks with fix hints |
619
+ | `validate [path] [--strict]` | Structurally validate an installed config; `--strict` adds hooks→script, `.mcp.json`-shape, snapshot, and catalog-integrity checks |
620
+ | `doctor [path] [--mcp]` | Strict validate + environment/health checks; `--mcp` checks MCP commands, `${ENV}` vars, and lockfile drift |
618
621
  | `diff [path]` | Preview what an `upgrade` would change (no writes) |
619
622
  | `upgrade [path] [--force]` | Refresh kit/overlay files; protect your edits; prune orphans |
623
+ | `pipeline validate · status · close-gate · abort` | Inspect/mutate the `/sdlc` state files (gate/lane/evidence coherence); **does not run** the pipeline |
620
624
  | `list-options` | List available frontend/backend/database/profile/MCP options |
621
625
  | `status [path]` | Show what's installed, the selection, and working memory |
622
626
  | `version` | Print the version |
@@ -625,6 +629,9 @@ everything available.
625
629
  Plugin slash commands: `/claude-kit:init`, `/claude-kit:sdlc <task>`, `/claude-kit:status`; and the
626
630
  `/sdlc` skill inside any scaffolded project.
627
631
 
632
+ > When MCP servers are selected, `init` also writes a derived **`.mcp.lock.json`** pinning each
633
+ > server's resolved package version — inspect it (or run `doctor --mcp`) to see exactly what would run.
634
+
628
635
  </details>
629
636
 
630
637
  <details>
@@ -586,10 +586,11 @@ everything available.
586
586
  | Command | Description |
587
587
  |---------|-------------|
588
588
  | `init [path] [--defaults] [--config FILE] [--force]` | Scaffold `CLAUDE.md` + `.claude/` (interactive or non-interactive) |
589
- | `validate [path]` | Structurally validate an installed config |
590
- | `doctor [path]` | Validate + environment/health checks with fix hints |
589
+ | `validate [path] [--strict]` | Structurally validate an installed config; `--strict` adds hooks→script, `.mcp.json`-shape, snapshot, and catalog-integrity checks |
590
+ | `doctor [path] [--mcp]` | Strict validate + environment/health checks; `--mcp` checks MCP commands, `${ENV}` vars, and lockfile drift |
591
591
  | `diff [path]` | Preview what an `upgrade` would change (no writes) |
592
592
  | `upgrade [path] [--force]` | Refresh kit/overlay files; protect your edits; prune orphans |
593
+ | `pipeline validate · status · close-gate · abort` | Inspect/mutate the `/sdlc` state files (gate/lane/evidence coherence); **does not run** the pipeline |
593
594
  | `list-options` | List available frontend/backend/database/profile/MCP options |
594
595
  | `status [path]` | Show what's installed, the selection, and working memory |
595
596
  | `version` | Print the version |
@@ -598,6 +599,9 @@ everything available.
598
599
  Plugin slash commands: `/claude-kit:init`, `/claude-kit:sdlc <task>`, `/claude-kit:status`; and the
599
600
  `/sdlc` skill inside any scaffolded project.
600
601
 
602
+ > When MCP servers are selected, `init` also writes a derived **`.mcp.lock.json`** pinning each
603
+ > server's resolved package version — inspect it (or run `doctor --mcp`) to see exactly what would run.
604
+
601
605
  </details>
602
606
 
603
607
  <details>
@@ -12,7 +12,7 @@ low="$(printf '%s' "$FILE_PATH" | tr '[:upper:]' '[:lower:]')"
12
12
 
13
13
  # Skip non-source: tests, docs, config, markdown, and the kit's own config.
14
14
  case "$low" in
15
- *test*|*spec*|*__tests__*|*.md|*.markdown|*.json|*.ya?ml|*.toml|*.ini|*.cfg|*.txt|*.lock|*/.claude/*)
15
+ *test*|*spec*|*.md|*.markdown|*.json|*.ya?ml|*.toml|*.ini|*.cfg|*.txt|*.lock|*/.claude/*)
16
16
  exit 0 ;;
17
17
  esac
18
18
 
@@ -11,7 +11,7 @@ FILE_PATH="$(echo "$INPUT" | jq -r '.tool_input.file_path // .tool_response.file
11
11
  low="$(printf '%s' "$FILE_PATH" | tr '[:upper:]' '[:lower:]')"
12
12
 
13
13
  case "$low" in
14
- *auth*|*login*|*session*|*oauth*|*jwt*|*password*|*permission*|*rbac*|*authoriz*)
14
+ *auth*|*login*|*session*|*jwt*|*password*|*permission*|*rbac*)
15
15
  echo "WARN: editing an AUTH / authorization surface ($FILE_PATH). High-risk: get review + security check before completion (.claude/rules/risk-classification.md)." >&2 ;;
16
16
  esac
17
17
  case "$low" in
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "claude-code-kit"
7
- version = "0.23.0"
7
+ version = "0.24.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"
@@ -46,6 +46,9 @@ dev = [
46
46
  "pytest>=8.0",
47
47
  "build>=1.2",
48
48
  "twine>=5.0",
49
+ "ruff>=0.6",
50
+ "mypy>=1.10",
51
+ "shellcheck-py>=0.10",
49
52
  ]
50
53
 
51
54
  [project.urls]
@@ -62,6 +65,20 @@ claude-sdlc = "claude_kit.cli:main"
62
65
  testpaths = ["tests"]
63
66
  pythonpath = ["."]
64
67
 
68
+ [tool.ruff]
69
+ target-version = "py39"
70
+
71
+ [tool.ruff.lint]
72
+ # Deliberately conservative: pyflakes (F) + the actionable pycodestyle subsets (E4/E7/E9, W) +
73
+ # import sorting (I) + bugbear (B). Line length (E501) is intentionally NOT enforced — docstrings and
74
+ # pinned-version comments run long on purpose and `ruff format` owns layout.
75
+ select = ["E4", "E7", "E9", "F", "W", "I", "B"]
76
+
77
+ [tool.mypy]
78
+ files = ["src/claude_kit"]
79
+ ignore_missing_imports = true
80
+ # typer/yaml ship without type stubs; we check our own code, not third-party signatures.
81
+
65
82
  [tool.hatch.build.targets.wheel]
66
83
  packages = ["src/claude_kit"]
67
84
 
@@ -7,4 +7,4 @@ Docker): ``claude-kit init`` asks ordered questions and lays down ``CLAUDE.md``
7
7
  as a plugin. Extensibility is data-driven via the ``catalog/`` (stacks, profiles, MCP).
8
8
  """
9
9
 
10
- __version__ = "0.23.0"
10
+ __version__ = "0.24.0"
@@ -1,8 +1,6 @@
1
1
  """Enable ``python -m claude_kit`` as an alias for the CLI."""
2
2
 
3
- import sys
4
-
5
3
  from claude_kit.cli import main
6
4
 
7
5
  if __name__ == "__main__":
8
- sys.exit(main())
6
+ main() # Typer's app() raises SystemExit with the right code itself.
@@ -14,7 +14,15 @@ from typing import Optional
14
14
 
15
15
  import typer
16
16
 
17
- from claude_kit import __version__, catalog, prompts, scaffold, upgrader, validator
17
+ from claude_kit import (
18
+ __version__,
19
+ catalog,
20
+ pipeline,
21
+ prompts,
22
+ scaffold,
23
+ upgrader,
24
+ validator,
25
+ )
18
26
 
19
27
  BANNER = r"""
20
28
  ___ _ _ _ ___ ___ _ _____ _____
@@ -32,6 +40,11 @@ research_app = typer.Typer(
32
40
  no_args_is_help=True, help="Research helpers (license-respecting)."
33
41
  )
34
42
  app.add_typer(research_app, name="research")
43
+ pipeline_app = typer.Typer(
44
+ no_args_is_help=True,
45
+ help="Inspect/mutate the /sdlc pipeline state files (does not run the pipeline).",
46
+ )
47
+ app.add_typer(pipeline_app, name="pipeline")
35
48
 
36
49
 
37
50
  def _version_callback(value: bool) -> None:
@@ -168,17 +181,27 @@ def init(
168
181
  @app.command()
169
182
  def validate(
170
183
  path: str = typer.Argument(".", help="target project dir (default: .)"),
184
+ strict: bool = typer.Option(
185
+ False,
186
+ "--strict",
187
+ help="deep checks: hooks→installed scripts, .mcp.json shape, snapshot + catalog integrity",
188
+ ),
171
189
  ) -> None:
172
190
  """Structurally validate a scaffolded .claude/ configuration."""
173
- _print_report(*validator.validate(path))
191
+ _print_report(*validator.validate(path, strict=strict))
174
192
 
175
193
 
176
194
  @app.command()
177
195
  def doctor(
178
196
  path: str = typer.Argument(".", help="target project dir (default: .)"),
197
+ mcp: bool = typer.Option(
198
+ False,
199
+ "--mcp",
200
+ help="also check MCP servers: command on PATH, ${ENV} vars set, lockfile in sync",
201
+ ),
179
202
  ) -> None:
180
- """Run validation plus environment/health checks with fix hints."""
181
- _print_report(*validator.doctor(path))
203
+ """Run strict validation plus environment/health checks with fix hints."""
204
+ _print_report(*validator.doctor(path, mcp=mcp))
182
205
 
183
206
 
184
207
  @app.command()
@@ -333,6 +356,44 @@ def research_import_sources(
333
356
  raise typer.Exit(2) # not a successful no-op — signal "unimplemented" to scripts/CI
334
357
 
335
358
 
359
+ @pipeline_app.command("validate")
360
+ def pipeline_validate(
361
+ path: str = typer.Argument(".", help="target project dir (default: .)"),
362
+ ) -> None:
363
+ """Check the pipeline snapshot's shape and gate/lane coherence (no writes)."""
364
+ _print_report(*pipeline.validate(path))
365
+
366
+
367
+ @pipeline_app.command("status")
368
+ def pipeline_status(
369
+ path: str = typer.Argument(".", help="target project dir (default: .)"),
370
+ ) -> None:
371
+ """Print a summary of the current pipeline run (stage, lanes, gate, findings, next)."""
372
+ _print_report(*pipeline.status(path))
373
+
374
+
375
+ @pipeline_app.command("close-gate")
376
+ def pipeline_close_gate(
377
+ gate: str = typer.Argument(
378
+ ..., help="gate token to mark passed (e.g. code-review)"
379
+ ),
380
+ evidence: str = typer.Option(
381
+ ..., "--evidence", help="path to the evidence artifact for this gate"
382
+ ),
383
+ path: str = typer.Argument(".", help="target project dir (default: .)"),
384
+ ) -> None:
385
+ """Record a quality gate as passed, with an evidence file, in the pipeline snapshot."""
386
+ _print_report(*pipeline.close_gate(path, gate, evidence))
387
+
388
+
389
+ @pipeline_app.command("abort")
390
+ def pipeline_abort(
391
+ path: str = typer.Argument(".", help="target project dir (default: .)"),
392
+ ) -> None:
393
+ """Mark the current pipeline run aborted."""
394
+ _print_report(*pipeline.abort(path))
395
+
396
+
336
397
  def main() -> None:
337
398
  """Console-script entry point."""
338
399
  app()
@@ -0,0 +1,240 @@
1
+ """Deterministic, non-executing operations on the ``/sdlc`` pipeline state files.
2
+
3
+ The ``/sdlc`` skill drives the actual pipeline; this module only **validates and mutates the state
4
+ files** it leaves behind, so a human or CI can inspect a run, record a passed gate with evidence, or
5
+ abort — without an LLM in the loop. It reads the runtime snapshot ``.claude/state/pipeline-snapshot.json``
6
+ (schema in ``rules/continuity.md``) and cross-checks gate names against the resolved gate set recorded
7
+ in ``.claude/config/stack-catalog.snapshot.yaml``. Every function returns the ``(ok, messages)``
8
+ contract used by :mod:`claude_kit.validator`.
9
+ """
10
+
11
+ from __future__ import annotations
12
+
13
+ import json
14
+ from pathlib import Path
15
+ from typing import Any
16
+
17
+ import yaml
18
+
19
+ #: Runtime pipeline snapshot, relative to the project root (gitignored state).
20
+ SNAPSHOT_REL = ".claude/state/pipeline-snapshot.json"
21
+ #: Resolved install snapshot (records the profile's gate set + selection).
22
+ STACK_SNAPSHOT_REL = ".claude/config/stack-catalog.snapshot.yaml"
23
+
24
+ #: Closed value-sets the snapshot fields must draw from (see rules/continuity.md).
25
+ PROFILES = frozenset({"lean", "standard", "enterprise"})
26
+ SCOPES = frozenset({"individual", "team", "organization"})
27
+ MODES = frozenset({"A", "B", "C", "D"})
28
+ LANE_STATES = frozenset({"not-started", "in-progress", "passed", "failed"})
29
+ FINDING_KEYS = frozenset({"critical", "high", "medium", "low"})
30
+
31
+
32
+ def _snapshot_path(target: str | Path) -> Path:
33
+ return Path(target).expanduser().resolve() / SNAPSHOT_REL
34
+
35
+
36
+ def _load_snapshot(target: str | Path) -> tuple[dict[str, Any] | None, str | None]:
37
+ """Return ``(snapshot, error)`` — ``error`` set if the file exists but won't parse."""
38
+ path = _snapshot_path(target)
39
+ if not path.is_file():
40
+ return None, None
41
+ try:
42
+ data = json.loads(path.read_text(encoding="utf-8"))
43
+ except json.JSONDecodeError as exc:
44
+ return None, f"pipeline snapshot is invalid JSON: {exc}"
45
+ if not isinstance(data, dict):
46
+ return None, "pipeline snapshot is not a JSON object"
47
+ return data, None
48
+
49
+
50
+ def _installed_gates(target: str | Path) -> list[str]:
51
+ """Read the resolved gate set from the install snapshot ([] if absent/unreadable)."""
52
+ path = Path(target).expanduser().resolve() / STACK_SNAPSHOT_REL
53
+ if not path.is_file():
54
+ return []
55
+ try:
56
+ data = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
57
+ except yaml.YAMLError:
58
+ return []
59
+ gates = data.get("gates")
60
+ return list(gates) if isinstance(gates, list) else []
61
+
62
+
63
+ def _selection(target: str | Path) -> dict[str, Any]:
64
+ """Read the recorded selection from the install snapshot ({} if absent)."""
65
+ path = Path(target).expanduser().resolve() / STACK_SNAPSHOT_REL
66
+ if not path.is_file():
67
+ return {}
68
+ try:
69
+ data = yaml.safe_load(path.read_text(encoding="utf-8")) or {}
70
+ except yaml.YAMLError:
71
+ return {}
72
+ sel = data.get("selection")
73
+ return sel if isinstance(sel, dict) else {}
74
+
75
+
76
+ def validate(target: str | Path) -> tuple[bool, list[str]]:
77
+ """Validate the pipeline snapshot's shape and coherence (no writes).
78
+
79
+ Absence is not an error — a repo with no active run is valid. When a snapshot is present, every
80
+ field that *is* set must hold a legal value (the schema lets fields be omitted, not malformed),
81
+ and ``last_gate_passed`` must name a gate the installed profile actually defines.
82
+ """
83
+ msgs: list[str] = []
84
+ ok = True
85
+
86
+ def fail(m: str) -> None:
87
+ nonlocal ok
88
+ ok = False
89
+ msgs.append(f"FAIL {m}")
90
+
91
+ snap, err = _load_snapshot(target)
92
+ if err:
93
+ fail(err)
94
+ return ok, msgs
95
+ if snap is None:
96
+ msgs.append("OK no pipeline snapshot — no run in progress")
97
+ return ok, msgs
98
+
99
+ schema = snap.get("schema")
100
+ if schema not in (None, 1):
101
+ msgs.append(f"WARN unexpected snapshot schema {schema!r} (expected 1)")
102
+
103
+ for field, allowed in (
104
+ ("profile", PROFILES),
105
+ ("scope", SCOPES),
106
+ ("mode", MODES),
107
+ ):
108
+ val = snap.get(field)
109
+ if val is not None and val not in allowed:
110
+ fail(f"{field} {val!r} is not one of {sorted(allowed)}")
111
+
112
+ lanes = snap.get("lanes")
113
+ if lanes is not None:
114
+ if not isinstance(lanes, dict):
115
+ fail("lanes must be an object of {lane: state}")
116
+ else:
117
+ for lane, state in lanes.items():
118
+ if state not in LANE_STATES:
119
+ fail(
120
+ f"lane {lane!r} has invalid state {state!r} ({sorted(LANE_STATES)})"
121
+ )
122
+
123
+ findings = snap.get("open_findings")
124
+ if findings is not None:
125
+ if not isinstance(findings, dict):
126
+ fail("open_findings must be an object of {severity: count}")
127
+ else:
128
+ for sev, count in findings.items():
129
+ if sev not in FINDING_KEYS:
130
+ msgs.append(f"WARN open_findings has unknown severity {sev!r}")
131
+ if not isinstance(count, int) or isinstance(count, bool):
132
+ fail(f"open_findings[{sev!r}] must be an integer, got {count!r}")
133
+
134
+ gate = snap.get("last_gate_passed")
135
+ gates = _installed_gates(target)
136
+ if gate is not None and gates and gate not in gates:
137
+ fail(f"last_gate_passed {gate!r} is not a gate of this profile ({gates})")
138
+
139
+ for field in ("task", "stage", "next"):
140
+ if field not in snap or snap[field] is None:
141
+ msgs.append(f"WARN snapshot has no {field!r} (resume context is weaker)")
142
+
143
+ if ok:
144
+ msgs.append(
145
+ f"OK pipeline snapshot is coherent (stage: {snap.get('stage', '?')})"
146
+ )
147
+ return ok, msgs
148
+
149
+
150
+ def status(target: str | Path) -> tuple[bool, list[str]]:
151
+ """Print a human-readable summary of the current pipeline snapshot (no writes)."""
152
+ snap, err = _load_snapshot(target)
153
+ if err:
154
+ return False, [f"FAIL {err}"]
155
+ if snap is None:
156
+ return True, ["no pipeline run in progress (no snapshot)"]
157
+
158
+ msgs = [f"task: {snap.get('task', '(none)')}"]
159
+ profile = snap.get("profile", "?")
160
+ scope = snap.get("scope", "?")
161
+ mode = snap.get("mode", "?")
162
+ msgs.append(f"profile: {profile} scope: {scope} mode: {mode}")
163
+ msgs.append(f"stage: {snap.get('stage', '(none)')}")
164
+ lanes = snap.get("lanes") or {}
165
+ if lanes:
166
+ msgs.append("lanes:")
167
+ for lane, state in lanes.items():
168
+ msgs.append(f" - {lane}: {state}")
169
+ msgs.append(f"last gate passed: {snap.get('last_gate_passed', '(none)')}")
170
+ findings = snap.get("open_findings") or {}
171
+ if findings:
172
+ rendered = ", ".join(f"{k}={v}" for k, v in findings.items())
173
+ msgs.append(f"open findings: {rendered}")
174
+ msgs.append(f"next: {snap.get('next', '(none)')}")
175
+ return True, msgs
176
+
177
+
178
+ def close_gate(
179
+ target: str | Path, gate: str, evidence: str | Path
180
+ ) -> tuple[bool, list[str]]:
181
+ """Record ``gate`` as passed (with an evidence artifact) in the snapshot.
182
+
183
+ Validates that the evidence file exists and that ``gate`` is a real gate for the installed
184
+ profile, then sets ``last_gate_passed`` and stores the evidence path. Seeds a minimal snapshot
185
+ (profile/scope from the install snapshot) if no run snapshot exists yet.
186
+ """
187
+ msgs: list[str] = []
188
+ evidence_path = Path(evidence).expanduser().resolve()
189
+ if not evidence_path.is_file():
190
+ return False, [f"FAIL evidence file not found: {evidence}"]
191
+
192
+ gates = _installed_gates(target)
193
+ if gates and gate not in gates:
194
+ return False, [
195
+ f"FAIL {gate!r} is not a gate of this profile (choices: {', '.join(gates)})"
196
+ ]
197
+ if not gates:
198
+ msgs.append(
199
+ "WARN no install snapshot — cannot confirm the gate name against the profile"
200
+ )
201
+
202
+ snap, err = _load_snapshot(target)
203
+ if err:
204
+ return False, [f"FAIL {err}"]
205
+ if snap is None:
206
+ sel = _selection(target)
207
+ snap = {
208
+ "schema": 1,
209
+ "task": "(recorded via claude-kit pipeline close-gate)",
210
+ "profile": sel.get("profile"),
211
+ "scope": sel.get("scope"),
212
+ "stage": gate,
213
+ }
214
+
215
+ snap["last_gate_passed"] = gate
216
+ evidence_map = snap.get("gate_evidence")
217
+ if not isinstance(evidence_map, dict):
218
+ evidence_map = {}
219
+ evidence_map[gate] = str(evidence_path)
220
+ snap["gate_evidence"] = evidence_map
221
+
222
+ path = _snapshot_path(target)
223
+ path.parent.mkdir(parents=True, exist_ok=True)
224
+ path.write_text(json.dumps(snap, indent=2) + "\n", encoding="utf-8")
225
+ msgs.append(f"OK gate {gate!r} recorded passed (evidence: {evidence_path})")
226
+ return True, msgs
227
+
228
+
229
+ def abort(target: str | Path) -> tuple[bool, list[str]]:
230
+ """Mark the current pipeline run aborted (stage=aborted); no run is not an error."""
231
+ snap, err = _load_snapshot(target)
232
+ if err:
233
+ return False, [f"FAIL {err}"]
234
+ if snap is None:
235
+ return True, ["OK no pipeline run in progress — nothing to abort"]
236
+ snap["stage"] = "aborted"
237
+ snap["next"] = "(run aborted via claude-kit pipeline abort)"
238
+ path = _snapshot_path(target)
239
+ path.write_text(json.dumps(snap, indent=2) + "\n", encoding="utf-8")
240
+ return True, ["OK pipeline run marked aborted"]
@@ -132,7 +132,12 @@ def _choose_many(title: str, options: list[dict[str, Any]]) -> list[str]:
132
132
  print(f" (ignoring unknown selection: {tok})")
133
133
  # de-dup, preserve order
134
134
  seen: set[str] = set()
135
- return [c for c in chosen if not (c in seen or seen.add(c))]
135
+ deduped: list[str] = []
136
+ for c in chosen:
137
+ if c not in seen:
138
+ seen.add(c)
139
+ deduped.append(c)
140
+ return deduped
136
141
 
137
142
 
138
143
  def interactive(payload_root: str | Path) -> Selection: