xtrm-tools 0.5.0

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 (333) hide show
  1. package/CHANGELOG.md +504 -0
  2. package/README.md +201 -0
  3. package/cli/dist/index.cjs +57378 -0
  4. package/cli/dist/index.cjs.map +1 -0
  5. package/cli/dist/index.d.cts +2 -0
  6. package/cli/package.json +47 -0
  7. package/config/.env.example +40 -0
  8. package/config/hooks.json +72 -0
  9. package/config/instructions/agents-top.md +30 -0
  10. package/config/instructions/claude-top.md +30 -0
  11. package/config/mcp_servers.json +57 -0
  12. package/config/mcp_servers_optional.json +53 -0
  13. package/config/pi/auth.json.template +14 -0
  14. package/config/pi/extensions/auto-session-name/index.ts +29 -0
  15. package/config/pi/extensions/auto-session-name/package.json +16 -0
  16. package/config/pi/extensions/auto-update/index.ts +71 -0
  17. package/config/pi/extensions/auto-update/package.json +16 -0
  18. package/config/pi/extensions/beads/index.ts +166 -0
  19. package/config/pi/extensions/beads/package.json +16 -0
  20. package/config/pi/extensions/bg-process/index.ts +230 -0
  21. package/config/pi/extensions/bg-process/package.json +16 -0
  22. package/config/pi/extensions/compact-header/index.ts +69 -0
  23. package/config/pi/extensions/compact-header/package.json +16 -0
  24. package/config/pi/extensions/core/adapter.ts +52 -0
  25. package/config/pi/extensions/core/guard-rules.ts +102 -0
  26. package/config/pi/extensions/core/lib.ts +3 -0
  27. package/config/pi/extensions/core/logger.ts +45 -0
  28. package/config/pi/extensions/core/runner.ts +71 -0
  29. package/config/pi/extensions/core/session-state.ts +59 -0
  30. package/config/pi/extensions/custom-footer/index.ts +160 -0
  31. package/config/pi/extensions/custom-footer/package.json +16 -0
  32. package/config/pi/extensions/custom-provider-qwen-cli/index.ts +363 -0
  33. package/config/pi/extensions/custom-provider-qwen-cli/package.json +1 -0
  34. package/config/pi/extensions/git-checkpoint/index.ts +53 -0
  35. package/config/pi/extensions/git-checkpoint/package.json +16 -0
  36. package/config/pi/extensions/minimal-mode/index.ts +201 -0
  37. package/config/pi/extensions/minimal-mode/package.json +16 -0
  38. package/config/pi/extensions/plan-mode/README.md +65 -0
  39. package/config/pi/extensions/plan-mode/index.ts +417 -0
  40. package/config/pi/extensions/plan-mode/package.json +12 -0
  41. package/config/pi/extensions/plan-mode/utils.ts +324 -0
  42. package/config/pi/extensions/quality-gates/index.ts +67 -0
  43. package/config/pi/extensions/quality-gates/package.json +16 -0
  44. package/config/pi/extensions/service-skills/index.ts +108 -0
  45. package/config/pi/extensions/service-skills/package.json +16 -0
  46. package/config/pi/extensions/session-flow/index.ts +131 -0
  47. package/config/pi/extensions/session-flow/package.json +16 -0
  48. package/config/pi/extensions/todo/index.ts +299 -0
  49. package/config/pi/extensions/todo/package.json +16 -0
  50. package/config/pi/extensions/xtrm-loader/index.ts +89 -0
  51. package/config/pi/extensions/xtrm-loader/package.json +16 -0
  52. package/config/pi/install-schema.json +44 -0
  53. package/config/pi/models.json.template +76 -0
  54. package/config/pi/pi-worktrees-settings.json +6 -0
  55. package/config/pi/settings.json.template +16 -0
  56. package/config/settings.json +70 -0
  57. package/hooks/README.md +75 -0
  58. package/hooks/agent_context.py +105 -0
  59. package/hooks/beads-claim-sync.mjs +166 -0
  60. package/hooks/beads-commit-gate.mjs +55 -0
  61. package/hooks/beads-compact-restore.mjs +69 -0
  62. package/hooks/beads-compact-save.mjs +51 -0
  63. package/hooks/beads-edit-gate.mjs +45 -0
  64. package/hooks/beads-gate-core.mjs +215 -0
  65. package/hooks/beads-gate-messages.mjs +87 -0
  66. package/hooks/beads-gate-utils.mjs +185 -0
  67. package/hooks/beads-memory-gate.mjs +61 -0
  68. package/hooks/beads-stop-gate.mjs +32 -0
  69. package/hooks/branch-state.mjs +39 -0
  70. package/hooks/gitnexus/gitnexus-hook.cjs +222 -0
  71. package/hooks/guard-rules.mjs +118 -0
  72. package/hooks/hooks.json +116 -0
  73. package/hooks/main-guard-post-push.mjs +71 -0
  74. package/hooks/main-guard.mjs +119 -0
  75. package/hooks/quality-check.cjs +1286 -0
  76. package/hooks/quality-check.py +345 -0
  77. package/hooks/serena-workflow-reminder.py +74 -0
  78. package/package.json +77 -0
  79. package/project-skills/quality-gates/.claude/hooks/hook-config.json +66 -0
  80. package/project-skills/quality-gates/.claude/hooks/quality-check.cjs +1286 -0
  81. package/project-skills/quality-gates/.claude/hooks/quality-check.py +334 -0
  82. package/project-skills/quality-gates/.claude/settings.json +3 -0
  83. package/project-skills/quality-gates/.claude/skills/using-quality-gates/SKILL.md +254 -0
  84. package/project-skills/quality-gates/README.md +109 -0
  85. package/project-skills/quality-gates/evals/evals.json +181 -0
  86. package/project-skills/quality-gates/workspace/iteration-1/FINAL-EVAL-SUMMARY.md +75 -0
  87. package/project-skills/quality-gates/workspace/iteration-1/edge-case-auto-fix-verification/with_skill/outputs/response.md +59 -0
  88. package/project-skills/quality-gates/workspace/iteration-1/edge-case-mixed-language-project/with_skill/outputs/response.md +60 -0
  89. package/project-skills/quality-gates/workspace/iteration-1/eval-summary.md +105 -0
  90. package/project-skills/quality-gates/workspace/iteration-1/partial-install-python-only/with_skill/outputs/response.md +93 -0
  91. package/project-skills/quality-gates/workspace/iteration-1/python-refactor-request/with_skill/outputs/response.md +104 -0
  92. package/project-skills/quality-gates/workspace/iteration-1/quality-gate-error-fix/with_skill/outputs/response.md +74 -0
  93. package/project-skills/quality-gates/workspace/iteration-1/should-not-trigger-general-chat/with_skill/outputs/response.md +18 -0
  94. package/project-skills/quality-gates/workspace/iteration-1/should-not-trigger-math-question/with_skill/outputs/response.md +18 -0
  95. package/project-skills/quality-gates/workspace/iteration-1/should-not-trigger-unrelated-coding/with_skill/outputs/response.md +56 -0
  96. package/project-skills/quality-gates/workspace/iteration-1/tdd-guard-blocking-confusion/with_skill/outputs/response.md +67 -0
  97. package/project-skills/quality-gates/workspace/iteration-1/typescript-feature-with-tests/with_skill/outputs/response.md +97 -0
  98. package/project-skills/service-skills-set/.claude/git-hooks/doc_reminder.py +67 -0
  99. package/project-skills/service-skills-set/.claude/git-hooks/skill_staleness.py +194 -0
  100. package/project-skills/service-skills-set/.claude/service-registry.json +4 -0
  101. package/project-skills/service-skills-set/.claude/settings.json +37 -0
  102. package/project-skills/service-skills-set/.claude/skills/creating-service-skills/SKILL.md +433 -0
  103. package/project-skills/service-skills-set/.claude/skills/creating-service-skills/references/script_quality_standards.md +425 -0
  104. package/project-skills/service-skills-set/.claude/skills/creating-service-skills/references/service_skill_system_guide.md +278 -0
  105. package/project-skills/service-skills-set/.claude/skills/creating-service-skills/scripts/bootstrap.py +308 -0
  106. package/project-skills/service-skills-set/.claude/skills/creating-service-skills/scripts/deep_dive.py +304 -0
  107. package/project-skills/service-skills-set/.claude/skills/creating-service-skills/scripts/scaffolder.py +482 -0
  108. package/project-skills/service-skills-set/.claude/skills/scoping-service-skills/SKILL.md +231 -0
  109. package/project-skills/service-skills-set/.claude/skills/scoping-service-skills/scripts/scope.py +74 -0
  110. package/project-skills/service-skills-set/.claude/skills/updating-service-skills/SKILL.md +136 -0
  111. package/project-skills/service-skills-set/.claude/skills/updating-service-skills/scripts/drift_detector.py +222 -0
  112. package/project-skills/service-skills-set/.claude/skills/using-service-skills/SKILL.md +108 -0
  113. package/project-skills/service-skills-set/.claude/skills/using-service-skills/scripts/cataloger.py +74 -0
  114. package/project-skills/service-skills-set/.claude/skills/using-service-skills/scripts/skill_activator.py +152 -0
  115. package/project-skills/service-skills-set/README.md +93 -0
  116. package/project-skills/service-skills-set/install-service-skills.py +193 -0
  117. package/project-skills/service-skills-set/service-skills-readme.md +236 -0
  118. package/skills/README.txt +31 -0
  119. package/skills/clean-code/SKILL.md +201 -0
  120. package/skills/creating-service-skills/SKILL.md +433 -0
  121. package/skills/creating-service-skills/references/script_quality_standards.md +425 -0
  122. package/skills/creating-service-skills/references/service_skill_system_guide.md +278 -0
  123. package/skills/creating-service-skills/scripts/bootstrap.py +326 -0
  124. package/skills/creating-service-skills/scripts/deep_dive.py +304 -0
  125. package/skills/creating-service-skills/scripts/scaffolder.py +482 -0
  126. package/skills/delegating/SKILL.md +196 -0
  127. package/skills/delegating/config.yaml +210 -0
  128. package/skills/delegating/references/orchestration-protocols.md +41 -0
  129. package/skills/docker-expert/SKILL.md +409 -0
  130. package/skills/documenting/CHANGELOG.md +23 -0
  131. package/skills/documenting/README.md +148 -0
  132. package/skills/documenting/SKILL.md +113 -0
  133. package/skills/documenting/examples/example_pattern.md +70 -0
  134. package/skills/documenting/examples/example_reference.md +70 -0
  135. package/skills/documenting/examples/example_ssot_analytics.md +64 -0
  136. package/skills/documenting/examples/example_workflow.md +141 -0
  137. package/skills/documenting/references/changelog-format.md +97 -0
  138. package/skills/documenting/references/metadata-schema.md +136 -0
  139. package/skills/documenting/references/taxonomy.md +81 -0
  140. package/skills/documenting/references/versioning-rules.md +78 -0
  141. package/skills/documenting/scripts/bump_version.sh +60 -0
  142. package/skills/documenting/scripts/changelog/__init__.py +0 -0
  143. package/skills/documenting/scripts/changelog/add_entry.py +216 -0
  144. package/skills/documenting/scripts/changelog/bump_release.py +117 -0
  145. package/skills/documenting/scripts/changelog/init_changelog.py +54 -0
  146. package/skills/documenting/scripts/changelog/validate_changelog.py +128 -0
  147. package/skills/documenting/scripts/drift_detector.py +266 -0
  148. package/skills/documenting/scripts/generate_template.py +311 -0
  149. package/skills/documenting/scripts/list_by_category.sh +84 -0
  150. package/skills/documenting/scripts/orchestrator.py +255 -0
  151. package/skills/documenting/scripts/validate_metadata.py +242 -0
  152. package/skills/documenting/templates/CHANGELOG.md.template +13 -0
  153. package/skills/find-skills/SKILL.md +133 -0
  154. package/skills/gitnexus-debugging/SKILL.md +85 -0
  155. package/skills/gitnexus-exploring/SKILL.md +75 -0
  156. package/skills/gitnexus-impact-analysis/SKILL.md +94 -0
  157. package/skills/gitnexus-refactoring/SKILL.md +113 -0
  158. package/skills/hook-development/SKILL.md +797 -0
  159. package/skills/hook-development/examples/load-context.sh +55 -0
  160. package/skills/hook-development/examples/quality-check.js +1168 -0
  161. package/skills/hook-development/examples/validate-bash.sh +43 -0
  162. package/skills/hook-development/examples/validate-write.sh +38 -0
  163. package/skills/hook-development/references/advanced.md +527 -0
  164. package/skills/hook-development/references/migration.md +369 -0
  165. package/skills/hook-development/references/patterns.md +412 -0
  166. package/skills/hook-development/scripts/README.md +164 -0
  167. package/skills/hook-development/scripts/hook-linter.sh +153 -0
  168. package/skills/hook-development/scripts/test-hook.sh +252 -0
  169. package/skills/hook-development/scripts/validate-hook-schema.sh +159 -0
  170. package/skills/obsidian-cli/SKILL.md +106 -0
  171. package/skills/orchestrating-agents/SKILL.md +135 -0
  172. package/skills/orchestrating-agents/config.yaml +45 -0
  173. package/skills/orchestrating-agents/references/agent-context-integration.md +37 -0
  174. package/skills/orchestrating-agents/references/examples.md +45 -0
  175. package/skills/orchestrating-agents/references/handover-protocol.md +31 -0
  176. package/skills/orchestrating-agents/references/workflows.md +42 -0
  177. package/skills/orchestrating-agents/scripts/detect_neighbors.py +23 -0
  178. package/skills/prompt-improving/README.md +162 -0
  179. package/skills/prompt-improving/SKILL.md +74 -0
  180. package/skills/prompt-improving/references/analysis_commands.md +24 -0
  181. package/skills/prompt-improving/references/chain_of_thought.md +24 -0
  182. package/skills/prompt-improving/references/mcp_definitions.md +20 -0
  183. package/skills/prompt-improving/references/multishot.md +23 -0
  184. package/skills/prompt-improving/references/xml_core.md +60 -0
  185. package/skills/python-testing/SKILL.md +815 -0
  186. package/skills/scoping-service-skills/SKILL.md +231 -0
  187. package/skills/scoping-service-skills/scripts/scope.py +74 -0
  188. package/skills/senior-backend/SKILL.md +209 -0
  189. package/skills/senior-backend/references/api_design_patterns.md +103 -0
  190. package/skills/senior-backend/references/backend_security_practices.md +103 -0
  191. package/skills/senior-backend/references/database_optimization_guide.md +103 -0
  192. package/skills/senior-backend/scripts/api_load_tester.py +114 -0
  193. package/skills/senior-backend/scripts/api_scaffolder.py +114 -0
  194. package/skills/senior-backend/scripts/database_migration_tool.py +114 -0
  195. package/skills/senior-data-scientist/SKILL.md +226 -0
  196. package/skills/senior-data-scientist/references/experiment_design_frameworks.md +80 -0
  197. package/skills/senior-data-scientist/references/feature_engineering_patterns.md +80 -0
  198. package/skills/senior-data-scientist/references/statistical_methods_advanced.md +80 -0
  199. package/skills/senior-data-scientist/scripts/experiment_designer.py +100 -0
  200. package/skills/senior-data-scientist/scripts/feature_engineering_pipeline.py +100 -0
  201. package/skills/senior-data-scientist/scripts/model_evaluation_suite.py +100 -0
  202. package/skills/senior-devops/SKILL.md +209 -0
  203. package/skills/senior-devops/references/cicd_pipeline_guide.md +103 -0
  204. package/skills/senior-devops/references/deployment_strategies.md +103 -0
  205. package/skills/senior-devops/references/infrastructure_as_code.md +103 -0
  206. package/skills/senior-devops/scripts/deployment_manager.py +114 -0
  207. package/skills/senior-devops/scripts/pipeline_generator.py +114 -0
  208. package/skills/senior-devops/scripts/terraform_scaffolder.py +114 -0
  209. package/skills/senior-security/SKILL.md +209 -0
  210. package/skills/senior-security/references/cryptography_implementation.md +103 -0
  211. package/skills/senior-security/references/penetration_testing_guide.md +103 -0
  212. package/skills/senior-security/references/security_architecture_patterns.md +103 -0
  213. package/skills/senior-security/scripts/pentest_automator.py +114 -0
  214. package/skills/senior-security/scripts/security_auditor.py +114 -0
  215. package/skills/senior-security/scripts/threat_modeler.py +114 -0
  216. package/skills/skill-creator/LICENSE.txt +202 -0
  217. package/skills/skill-creator/SKILL.md +479 -0
  218. package/skills/skill-creator/agents/analyzer.md +274 -0
  219. package/skills/skill-creator/agents/comparator.md +202 -0
  220. package/skills/skill-creator/agents/grader.md +223 -0
  221. package/skills/skill-creator/assets/eval_review.html +146 -0
  222. package/skills/skill-creator/eval-viewer/generate_review.py +471 -0
  223. package/skills/skill-creator/eval-viewer/viewer.html +1325 -0
  224. package/skills/skill-creator/references/schemas.md +430 -0
  225. package/skills/skill-creator/scripts/__init__.py +0 -0
  226. package/skills/skill-creator/scripts/aggregate_benchmark.py +401 -0
  227. package/skills/skill-creator/scripts/generate_report.py +326 -0
  228. package/skills/skill-creator/scripts/improve_description.py +248 -0
  229. package/skills/skill-creator/scripts/package_skill.py +136 -0
  230. package/skills/skill-creator/scripts/quick_validate.py +103 -0
  231. package/skills/skill-creator/scripts/run_eval.py +310 -0
  232. package/skills/skill-creator/scripts/run_loop.py +332 -0
  233. package/skills/skill-creator/scripts/utils.py +47 -0
  234. package/skills/sync-docs/SKILL.md +132 -0
  235. package/skills/sync-docs/evals/evals.json +89 -0
  236. package/skills/sync-docs/references/doc-structure.md +99 -0
  237. package/skills/sync-docs/references/schema.md +103 -0
  238. package/skills/sync-docs/scripts/changelog/add_entry.py +216 -0
  239. package/skills/sync-docs/scripts/context_gatherer.py +240 -0
  240. package/skills/sync-docs/scripts/doc_structure_analyzer.py +495 -0
  241. package/skills/sync-docs/scripts/drift_detector.py +327 -0
  242. package/skills/sync-docs/scripts/validate_doc.py +365 -0
  243. package/skills/sync-docs/scripts/validate_metadata.py +185 -0
  244. package/skills/sync-docs-workspace/iteration-1/benchmark.json +293 -0
  245. package/skills/sync-docs-workspace/iteration-1/benchmark.md +13 -0
  246. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/eval_metadata.json +27 -0
  247. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/outputs/result.md +210 -0
  248. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/run-1/grading.json +28 -0
  249. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/with_skill/run-1/timing.json +1 -0
  250. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/outputs/result.md +101 -0
  251. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/run-1/grading.json +28 -0
  252. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/run-1/timing.json +5 -0
  253. package/skills/sync-docs-workspace/iteration-1/eval-doc-audit/without_skill/timing.json +5 -0
  254. package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/eval_metadata.json +27 -0
  255. package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/outputs/result.md +198 -0
  256. package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/run-1/grading.json +28 -0
  257. package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/with_skill/run-1/timing.json +1 -0
  258. package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/outputs/result.md +94 -0
  259. package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/run-1/grading.json +28 -0
  260. package/skills/sync-docs-workspace/iteration-1/eval-fix-mode/without_skill/run-1/timing.json +1 -0
  261. package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/eval_metadata.json +27 -0
  262. package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/outputs/result.md +237 -0
  263. package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/run-1/grading.json +28 -0
  264. package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/with_skill/run-1/timing.json +1 -0
  265. package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/outputs/result.md +134 -0
  266. package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/run-1/grading.json +28 -0
  267. package/skills/sync-docs-workspace/iteration-1/eval-sprint-closeout/without_skill/run-1/timing.json +1 -0
  268. package/skills/sync-docs-workspace/iteration-2/benchmark.json +297 -0
  269. package/skills/sync-docs-workspace/iteration-2/benchmark.md +13 -0
  270. package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/eval_metadata.json +27 -0
  271. package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/outputs/result.md +137 -0
  272. package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/run-1/grading.json +92 -0
  273. package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/with_skill/run-1/timing.json +1 -0
  274. package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/outputs/result.md +134 -0
  275. package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/run-1/grading.json +86 -0
  276. package/skills/sync-docs-workspace/iteration-2/eval-doc-audit/without_skill/run-1/timing.json +1 -0
  277. package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/eval_metadata.json +27 -0
  278. package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/outputs/result.md +193 -0
  279. package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/run-1/grading.json +72 -0
  280. package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/with_skill/run-1/timing.json +1 -0
  281. package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/outputs/result.md +211 -0
  282. package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/run-1/grading.json +91 -0
  283. package/skills/sync-docs-workspace/iteration-2/eval-fix-mode/without_skill/run-1/timing.json +5 -0
  284. package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/eval_metadata.json +27 -0
  285. package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/outputs/result.md +182 -0
  286. package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/run-1/grading.json +95 -0
  287. package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/with_skill/run-1/timing.json +1 -0
  288. package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/outputs/result.md +222 -0
  289. package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/run-1/grading.json +88 -0
  290. package/skills/sync-docs-workspace/iteration-2/eval-sprint-closeout/without_skill/run-1/timing.json +5 -0
  291. package/skills/sync-docs-workspace/iteration-3/benchmark.json +298 -0
  292. package/skills/sync-docs-workspace/iteration-3/benchmark.md +13 -0
  293. package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/eval_metadata.json +27 -0
  294. package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/outputs/result.md +125 -0
  295. package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/run-1/grading.json +97 -0
  296. package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/with_skill/run-1/timing.json +5 -0
  297. package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/outputs/result.md +144 -0
  298. package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/run-1/grading.json +78 -0
  299. package/skills/sync-docs-workspace/iteration-3/eval-doc-audit/without_skill/run-1/timing.json +5 -0
  300. package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/eval_metadata.json +27 -0
  301. package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/outputs/result.md +104 -0
  302. package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/run-1/grading.json +91 -0
  303. package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/with_skill/run-1/timing.json +5 -0
  304. package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/outputs/result.md +79 -0
  305. package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/run-1/grading.json +82 -0
  306. package/skills/sync-docs-workspace/iteration-3/eval-fix-mode/without_skill/run-1/timing.json +5 -0
  307. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/eval_metadata.json +27 -0
  308. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase1_context.json +302 -0
  309. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase2_drift.txt +33 -0
  310. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase3_analysis.json +114 -0
  311. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase4_fix.txt +118 -0
  312. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/phase5_validate.txt +38 -0
  313. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/outputs/result.md +158 -0
  314. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/run-1/grading.json +95 -0
  315. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/with_skill/run-1/timing.json +5 -0
  316. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/outputs/result.md +71 -0
  317. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/run-1/grading.json +90 -0
  318. package/skills/sync-docs-workspace/iteration-3/eval-sprint-closeout/without_skill/run-1/timing.json +5 -0
  319. package/skills/test-planning/SKILL.md +208 -0
  320. package/skills/test-planning/evals/evals.json +23 -0
  321. package/skills/updating-service-skills/SKILL.md +136 -0
  322. package/skills/updating-service-skills/scripts/drift_detector.py +222 -0
  323. package/skills/using-TDD/SKILL.md +410 -0
  324. package/skills/using-quality-gates/SKILL.md +254 -0
  325. package/skills/using-serena-lsp/README.md +8 -0
  326. package/skills/using-serena-lsp/REFERENCE.md +194 -0
  327. package/skills/using-serena-lsp/SKILL.md +82 -0
  328. package/skills/using-service-skills/SKILL.md +108 -0
  329. package/skills/using-service-skills/scripts/cataloger.py +74 -0
  330. package/skills/using-service-skills/scripts/skill_activator.py +152 -0
  331. package/skills/using-service-skills/scripts/test_skill_activator.py +58 -0
  332. package/skills/using-xtrm/SKILL.md +245 -0
  333. package/skills/xt-end/SKILL.md +128 -0
@@ -0,0 +1,222 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Drift detector — PostToolUse hook for updating-service-skills.
4
+
5
+ Checks whether a modified file belongs to a registered service territory.
6
+ If so, notifies Claude to sync the skill documentation.
7
+
8
+ Configured via updating-service-skills/SKILL.md frontmatter hooks:
9
+ PostToolUse → matcher: "Write|Edit" → command: drift_detector.py check-hook
10
+
11
+ Subcommands:
12
+ check-hook Read file_path from stdin JSON (PostToolUse hook mode)
13
+ check <file> Check a specific file path from CLI
14
+ sync <service-id> Mark service as synced (update registry timestamp)
15
+ scan Scan all territories for drifted services
16
+ """
17
+
18
+ import json
19
+ import sys
20
+ from datetime import datetime, timezone
21
+ from pathlib import Path
22
+
23
+ # Bootstrap lives in creating-service-skills — shared utility
24
+ BOOTSTRAP_DIR = Path(__file__).parent.parent.parent / "creating-service-skills" / "scripts"
25
+ sys.path.insert(0, str(BOOTSTRAP_DIR))
26
+
27
+ from bootstrap import ( # noqa: E402
28
+ RootResolutionError,
29
+ find_service_for_path,
30
+ get_project_root,
31
+ get_service,
32
+ load_registry,
33
+ save_registry,
34
+ )
35
+
36
+
37
+ def check_drift(file_path: str, project_root: str | None = None) -> dict:
38
+ """Check if a file change causes drift in any registered service territory."""
39
+ if project_root is None:
40
+ try:
41
+ project_root = get_project_root()
42
+ except RootResolutionError:
43
+ return {"drift": False, "reason": "Cannot resolve project root"}
44
+
45
+ # Normalize to relative path
46
+ fp = Path(file_path)
47
+ if fp.is_absolute():
48
+ try:
49
+ fp = fp.relative_to(project_root)
50
+ file_path = str(fp)
51
+ except ValueError:
52
+ pass
53
+
54
+ service_id = find_service_for_path(file_path, project_root)
55
+ if not service_id:
56
+ return {"drift": False, "reason": "No service owns this file"}
57
+
58
+ service = get_service(service_id, project_root)
59
+ if not service:
60
+ return {"drift": False, "reason": "Service not found in registry"}
61
+
62
+ return {
63
+ "drift": True,
64
+ "service_id": service_id,
65
+ "service_name": service.get("name", service_id),
66
+ "skill_path": service.get("skill_path"),
67
+ "last_sync": service.get("last_sync", ""),
68
+ "file_path": file_path,
69
+ "message": (
70
+ f"[Skill Sync]: Implementation drift detected in '{service_id}'. "
71
+ f"File '{file_path}' was modified. "
72
+ f"Use '/updating-service-skills' to sync the {service.get('name', service_id)} documentation."
73
+ ),
74
+ }
75
+
76
+
77
+ def check_drift_from_hook_stdin() -> None:
78
+ """
79
+ PostToolUse hook mode: reads file_path from stdin JSON.
80
+
81
+ The PostToolUse hook delivers stdin JSON with shape:
82
+ {"tool_name": "Write", "tool_input": {"file_path": "/abs/path"}, ...}
83
+
84
+ Outputs drift message to stdout (shown to Claude via PostToolUse additionalContext).
85
+ Exits 0 always — drift detection is advisory, never blocking.
86
+ """
87
+ try:
88
+ data = json.load(sys.stdin)
89
+ except (json.JSONDecodeError, EOFError):
90
+ sys.exit(0)
91
+
92
+ tool_input = data.get("tool_input", {})
93
+ file_path = tool_input.get("file_path", "")
94
+
95
+ if not file_path:
96
+ sys.exit(0)
97
+
98
+ result = check_drift(file_path)
99
+
100
+ if result.get("drift"):
101
+ # Output additionalContext for Claude via PostToolUse JSON format
102
+ output = {
103
+ "hookSpecificOutput": {
104
+ "hookEventName": "PostToolUse",
105
+ "additionalContext": result["message"],
106
+ }
107
+ }
108
+ print(json.dumps(output))
109
+
110
+ sys.exit(0)
111
+
112
+
113
+ def update_sync_time(service_id: str, project_root: str | None = None) -> bool:
114
+ """Update last_sync timestamp for a service in the registry."""
115
+ try:
116
+ registry = load_registry(project_root)
117
+ except Exception:
118
+ return False
119
+
120
+ if "services" not in registry or service_id not in registry["services"]:
121
+ return False
122
+
123
+ registry["services"][service_id]["last_sync"] = (
124
+ datetime.now(timezone.utc).isoformat().replace("+00:00", "Z")
125
+ )
126
+
127
+ try:
128
+ save_registry(registry, project_root)
129
+ return True
130
+ except Exception:
131
+ return False
132
+
133
+
134
+ def scan_drift(project_root: str | None = None) -> list[dict]:
135
+ """Scan all territories and identify services with files modified since last sync."""
136
+ if project_root is None:
137
+ try:
138
+ project_root = get_project_root()
139
+ except RootResolutionError:
140
+ return []
141
+
142
+ root = Path(project_root)
143
+ registry = load_registry(project_root)
144
+ drifted: list[dict] = []
145
+
146
+ for service_id, service in registry.get("services", {}).items():
147
+ last_sync_str = service.get("last_sync", "")
148
+ if not last_sync_str:
149
+ continue
150
+ try:
151
+ sync_time = datetime.fromisoformat(last_sync_str.replace("Z", "+00:00"))
152
+ except ValueError:
153
+ continue
154
+
155
+ for pattern in service.get("territory", []):
156
+ for fp in root.glob(pattern):
157
+ if fp.is_file():
158
+ try:
159
+ mtime = datetime.fromtimestamp(fp.stat().st_mtime, tz=timezone.utc)
160
+ if mtime > sync_time:
161
+ drifted.append(
162
+ {
163
+ "service_id": service_id,
164
+ "service_name": service.get("name", service_id),
165
+ "file_path": str(fp.relative_to(root)),
166
+ "last_sync": last_sync_str,
167
+ }
168
+ )
169
+ except (OSError, ValueError):
170
+ continue
171
+
172
+ return drifted
173
+
174
+
175
+ def main() -> None:
176
+ if len(sys.argv) < 2:
177
+ print("Usage: python drift_detector.py <command> [args...]")
178
+ print(" check-hook — Read file from stdin JSON (PostToolUse hook mode)")
179
+ print(" check <file> — Check a specific file path")
180
+ print(" sync <service-id> — Mark service as synced")
181
+ print(" scan — Scan all territories for drift")
182
+ sys.exit(1)
183
+
184
+ cmd = sys.argv[1]
185
+
186
+ if cmd == "check-hook":
187
+ check_drift_from_hook_stdin()
188
+
189
+ elif cmd == "check" and len(sys.argv) > 2:
190
+ result = check_drift(sys.argv[2])
191
+ if result.get("drift"):
192
+ print(result["message"])
193
+ else:
194
+ print(f"No drift: {result.get('reason', 'OK')}")
195
+
196
+ elif cmd == "sync" and len(sys.argv) > 2:
197
+ service_id = sys.argv[2]
198
+ if update_sync_time(service_id):
199
+ print(f"✓ Synced: {service_id}")
200
+ else:
201
+ print(f"✗ Failed to sync: {service_id}")
202
+ sys.exit(1)
203
+
204
+ elif cmd == "scan":
205
+ drifted = scan_drift()
206
+ if drifted:
207
+ print(f"Found {len(drifted)} drifted service(s):")
208
+ for item in drifted:
209
+ print(
210
+ f" {item['service_id']}: {item['file_path']} "
211
+ f"(last sync: {item['last_sync']})"
212
+ )
213
+ else:
214
+ print("No drift detected.")
215
+
216
+ else:
217
+ print(f"Unknown command: {cmd}")
218
+ sys.exit(1)
219
+
220
+
221
+ if __name__ == "__main__":
222
+ main()
@@ -0,0 +1,410 @@
1
+ ---
2
+ name: tdd-workflow
3
+ description: Use this skill when writing new features, fixing bugs, or refactoring code. Enforces test-driven development with 80%+ coverage including unit, integration, and E2E tests.
4
+ origin: ECC
5
+ ---
6
+
7
+ # Test-Driven Development Workflow
8
+
9
+ This skill ensures all code development follows TDD principles with comprehensive test coverage.
10
+
11
+ ## When to Activate
12
+
13
+ - Writing new features or functionality
14
+ - Fixing bugs or issues
15
+ - Refactoring existing code
16
+ - Adding API endpoints
17
+ - Creating new components
18
+
19
+ ## Core Principles
20
+
21
+ ### 1. Tests BEFORE Code
22
+ ALWAYS write tests first, then implement code to make tests pass.
23
+
24
+ ### 2. Coverage Requirements
25
+ - Minimum 80% coverage (unit + integration + E2E)
26
+ - All edge cases covered
27
+ - Error scenarios tested
28
+ - Boundary conditions verified
29
+
30
+ ### 3. Test Types
31
+
32
+ #### Unit Tests
33
+ - Individual functions and utilities
34
+ - Component logic
35
+ - Pure functions
36
+ - Helpers and utilities
37
+
38
+ #### Integration Tests
39
+ - API endpoints
40
+ - Database operations
41
+ - Service interactions
42
+ - External API calls
43
+
44
+ #### E2E Tests (Playwright)
45
+ - Critical user flows
46
+ - Complete workflows
47
+ - Browser automation
48
+ - UI interactions
49
+
50
+ ## TDD Workflow Steps
51
+
52
+ ### Step 1: Write User Journeys
53
+ ```
54
+ As a [role], I want to [action], so that [benefit]
55
+
56
+ Example:
57
+ As a user, I want to search for markets semantically,
58
+ so that I can find relevant markets even without exact keywords.
59
+ ```
60
+
61
+ ### Step 2: Generate Test Cases
62
+ For each user journey, create comprehensive test cases:
63
+
64
+ ```typescript
65
+ describe('Semantic Search', () => {
66
+ it('returns relevant markets for query', async () => {
67
+ // Test implementation
68
+ })
69
+
70
+ it('handles empty query gracefully', async () => {
71
+ // Test edge case
72
+ })
73
+
74
+ it('falls back to substring search when Redis unavailable', async () => {
75
+ // Test fallback behavior
76
+ })
77
+
78
+ it('sorts results by similarity score', async () => {
79
+ // Test sorting logic
80
+ })
81
+ })
82
+ ```
83
+
84
+ ### Step 3: Run Tests (They Should Fail)
85
+ ```bash
86
+ npm test
87
+ # Tests should fail - we haven't implemented yet
88
+ ```
89
+
90
+ ### Step 4: Implement Code
91
+ Write minimal code to make tests pass:
92
+
93
+ ```typescript
94
+ // Implementation guided by tests
95
+ export async function searchMarkets(query: string) {
96
+ // Implementation here
97
+ }
98
+ ```
99
+
100
+ ### Step 5: Run Tests Again
101
+ ```bash
102
+ npm test
103
+ # Tests should now pass
104
+ ```
105
+
106
+ ### Step 6: Refactor
107
+ Improve code quality while keeping tests green:
108
+ - Remove duplication
109
+ - Improve naming
110
+ - Optimize performance
111
+ - Enhance readability
112
+
113
+ ### Step 7: Verify Coverage
114
+ ```bash
115
+ npm run test:coverage
116
+ # Verify 80%+ coverage achieved
117
+ ```
118
+
119
+ ## Testing Patterns
120
+
121
+ ### Unit Test Pattern (Jest/Vitest)
122
+ ```typescript
123
+ import { render, screen, fireEvent } from '@testing-library/react'
124
+ import { Button } from './Button'
125
+
126
+ describe('Button Component', () => {
127
+ it('renders with correct text', () => {
128
+ render(<Button>Click me</Button>)
129
+ expect(screen.getByText('Click me')).toBeInTheDocument()
130
+ })
131
+
132
+ it('calls onClick when clicked', () => {
133
+ const handleClick = jest.fn()
134
+ render(<Button onClick={handleClick}>Click</Button>)
135
+
136
+ fireEvent.click(screen.getByRole('button'))
137
+
138
+ expect(handleClick).toHaveBeenCalledTimes(1)
139
+ })
140
+
141
+ it('is disabled when disabled prop is true', () => {
142
+ render(<Button disabled>Click</Button>)
143
+ expect(screen.getByRole('button')).toBeDisabled()
144
+ })
145
+ })
146
+ ```
147
+
148
+ ### API Integration Test Pattern
149
+ ```typescript
150
+ import { NextRequest } from 'next/server'
151
+ import { GET } from './route'
152
+
153
+ describe('GET /api/markets', () => {
154
+ it('returns markets successfully', async () => {
155
+ const request = new NextRequest('http://localhost/api/markets')
156
+ const response = await GET(request)
157
+ const data = await response.json()
158
+
159
+ expect(response.status).toBe(200)
160
+ expect(data.success).toBe(true)
161
+ expect(Array.isArray(data.data)).toBe(true)
162
+ })
163
+
164
+ it('validates query parameters', async () => {
165
+ const request = new NextRequest('http://localhost/api/markets?limit=invalid')
166
+ const response = await GET(request)
167
+
168
+ expect(response.status).toBe(400)
169
+ })
170
+
171
+ it('handles database errors gracefully', async () => {
172
+ // Mock database failure
173
+ const request = new NextRequest('http://localhost/api/markets')
174
+ // Test error handling
175
+ })
176
+ })
177
+ ```
178
+
179
+ ### E2E Test Pattern (Playwright)
180
+ ```typescript
181
+ import { test, expect } from '@playwright/test'
182
+
183
+ test('user can search and filter markets', async ({ page }) => {
184
+ // Navigate to markets page
185
+ await page.goto('/')
186
+ await page.click('a[href="/markets"]')
187
+
188
+ // Verify page loaded
189
+ await expect(page.locator('h1')).toContainText('Markets')
190
+
191
+ // Search for markets
192
+ await page.fill('input[placeholder="Search markets"]', 'election')
193
+
194
+ // Wait for debounce and results
195
+ await page.waitForTimeout(600)
196
+
197
+ // Verify search results displayed
198
+ const results = page.locator('[data-testid="market-card"]')
199
+ await expect(results).toHaveCount(5, { timeout: 5000 })
200
+
201
+ // Verify results contain search term
202
+ const firstResult = results.first()
203
+ await expect(firstResult).toContainText('election', { ignoreCase: true })
204
+
205
+ // Filter by status
206
+ await page.click('button:has-text("Active")')
207
+
208
+ // Verify filtered results
209
+ await expect(results).toHaveCount(3)
210
+ })
211
+
212
+ test('user can create a new market', async ({ page }) => {
213
+ // Login first
214
+ await page.goto('/creator-dashboard')
215
+
216
+ // Fill market creation form
217
+ await page.fill('input[name="name"]', 'Test Market')
218
+ await page.fill('textarea[name="description"]', 'Test description')
219
+ await page.fill('input[name="endDate"]', '2025-12-31')
220
+
221
+ // Submit form
222
+ await page.click('button[type="submit"]')
223
+
224
+ // Verify success message
225
+ await expect(page.locator('text=Market created successfully')).toBeVisible()
226
+
227
+ // Verify redirect to market page
228
+ await expect(page).toHaveURL(/\/markets\/test-market/)
229
+ })
230
+ ```
231
+
232
+ ## Test File Organization
233
+
234
+ ```
235
+ src/
236
+ ├── components/
237
+ │ ├── Button/
238
+ │ │ ├── Button.tsx
239
+ │ │ ├── Button.test.tsx # Unit tests
240
+ │ │ └── Button.stories.tsx # Storybook
241
+ │ └── MarketCard/
242
+ │ ├── MarketCard.tsx
243
+ │ └── MarketCard.test.tsx
244
+ ├── app/
245
+ │ └── api/
246
+ │ └── markets/
247
+ │ ├── route.ts
248
+ │ └── route.test.ts # Integration tests
249
+ └── e2e/
250
+ ├── markets.spec.ts # E2E tests
251
+ ├── trading.spec.ts
252
+ └── auth.spec.ts
253
+ ```
254
+
255
+ ## Mocking External Services
256
+
257
+ ### Supabase Mock
258
+ ```typescript
259
+ jest.mock('@/lib/supabase', () => ({
260
+ supabase: {
261
+ from: jest.fn(() => ({
262
+ select: jest.fn(() => ({
263
+ eq: jest.fn(() => Promise.resolve({
264
+ data: [{ id: 1, name: 'Test Market' }],
265
+ error: null
266
+ }))
267
+ }))
268
+ }))
269
+ }
270
+ }))
271
+ ```
272
+
273
+ ### Redis Mock
274
+ ```typescript
275
+ jest.mock('@/lib/redis', () => ({
276
+ searchMarketsByVector: jest.fn(() => Promise.resolve([
277
+ { slug: 'test-market', similarity_score: 0.95 }
278
+ ])),
279
+ checkRedisHealth: jest.fn(() => Promise.resolve({ connected: true }))
280
+ }))
281
+ ```
282
+
283
+ ### OpenAI Mock
284
+ ```typescript
285
+ jest.mock('@/lib/openai', () => ({
286
+ generateEmbedding: jest.fn(() => Promise.resolve(
287
+ new Array(1536).fill(0.1) // Mock 1536-dim embedding
288
+ ))
289
+ }))
290
+ ```
291
+
292
+ ## Test Coverage Verification
293
+
294
+ ### Run Coverage Report
295
+ ```bash
296
+ npm run test:coverage
297
+ ```
298
+
299
+ ### Coverage Thresholds
300
+ ```json
301
+ {
302
+ "jest": {
303
+ "coverageThresholds": {
304
+ "global": {
305
+ "branches": 80,
306
+ "functions": 80,
307
+ "lines": 80,
308
+ "statements": 80
309
+ }
310
+ }
311
+ }
312
+ }
313
+ ```
314
+
315
+ ## Common Testing Mistakes to Avoid
316
+
317
+ ### ❌ WRONG: Testing Implementation Details
318
+ ```typescript
319
+ // Don't test internal state
320
+ expect(component.state.count).toBe(5)
321
+ ```
322
+
323
+ ### ✅ CORRECT: Test User-Visible Behavior
324
+ ```typescript
325
+ // Test what users see
326
+ expect(screen.getByText('Count: 5')).toBeInTheDocument()
327
+ ```
328
+
329
+ ### ❌ WRONG: Brittle Selectors
330
+ ```typescript
331
+ // Breaks easily
332
+ await page.click('.css-class-xyz')
333
+ ```
334
+
335
+ ### ✅ CORRECT: Semantic Selectors
336
+ ```typescript
337
+ // Resilient to changes
338
+ await page.click('button:has-text("Submit")')
339
+ await page.click('[data-testid="submit-button"]')
340
+ ```
341
+
342
+ ### ❌ WRONG: No Test Isolation
343
+ ```typescript
344
+ // Tests depend on each other
345
+ test('creates user', () => { /* ... */ })
346
+ test('updates same user', () => { /* depends on previous test */ })
347
+ ```
348
+
349
+ ### ✅ CORRECT: Independent Tests
350
+ ```typescript
351
+ // Each test sets up its own data
352
+ test('creates user', () => {
353
+ const user = createTestUser()
354
+ // Test logic
355
+ })
356
+
357
+ test('updates user', () => {
358
+ const user = createTestUser()
359
+ // Update logic
360
+ })
361
+ ```
362
+
363
+ ## Continuous Testing
364
+
365
+ ### Watch Mode During Development
366
+ ```bash
367
+ npm test -- --watch
368
+ # Tests run automatically on file changes
369
+ ```
370
+
371
+ ### Pre-Commit Hook
372
+ ```bash
373
+ # Runs before every commit
374
+ npm test && npm run lint
375
+ ```
376
+
377
+ ### CI/CD Integration
378
+ ```yaml
379
+ # GitHub Actions
380
+ - name: Run Tests
381
+ run: npm test -- --coverage
382
+ - name: Upload Coverage
383
+ uses: codecov/codecov-action@v3
384
+ ```
385
+
386
+ ## Best Practices
387
+
388
+ 1. **Write Tests First** - Always TDD
389
+ 2. **One Assert Per Test** - Focus on single behavior
390
+ 3. **Descriptive Test Names** - Explain what's tested
391
+ 4. **Arrange-Act-Assert** - Clear test structure
392
+ 5. **Mock External Dependencies** - Isolate unit tests
393
+ 6. **Test Edge Cases** - Null, undefined, empty, large
394
+ 7. **Test Error Paths** - Not just happy paths
395
+ 8. **Keep Tests Fast** - Unit tests < 50ms each
396
+ 9. **Clean Up After Tests** - No side effects
397
+ 10. **Review Coverage Reports** - Identify gaps
398
+
399
+ ## Success Metrics
400
+
401
+ - 80%+ code coverage achieved
402
+ - All tests passing (green)
403
+ - No skipped or disabled tests
404
+ - Fast test execution (< 30s for unit tests)
405
+ - E2E tests cover critical user flows
406
+ - Tests catch bugs before production
407
+
408
+ ---
409
+
410
+ **Remember**: Tests are not optional. They are the safety net that enables confident refactoring, rapid development, and production reliability.