timsquad 3.5.0 → 3.7.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 (454) hide show
  1. package/README.ko.md +103 -107
  2. package/README.md +100 -104
  3. package/dist/commands/daemon.d.ts.map +1 -1
  4. package/dist/commands/daemon.js +48 -2
  5. package/dist/commands/daemon.js.map +1 -1
  6. package/dist/commands/init.js +46 -14
  7. package/dist/commands/init.js.map +1 -1
  8. package/dist/commands/{upgrade.d.ts → update.d.ts} +3 -3
  9. package/dist/commands/update.d.ts.map +1 -0
  10. package/dist/commands/{upgrade.js → update.js} +12 -17
  11. package/dist/commands/update.js.map +1 -0
  12. package/dist/daemon/context-writer.d.ts +14 -0
  13. package/dist/daemon/context-writer.d.ts.map +1 -1
  14. package/dist/daemon/context-writer.js +29 -0
  15. package/dist/daemon/context-writer.js.map +1 -1
  16. package/dist/daemon/event-queue.d.ts +7 -11
  17. package/dist/daemon/event-queue.d.ts.map +1 -1
  18. package/dist/daemon/event-queue.js +78 -118
  19. package/dist/daemon/event-queue.js.map +1 -1
  20. package/dist/daemon/file-watcher.d.ts +14 -8
  21. package/dist/daemon/file-watcher.d.ts.map +1 -1
  22. package/dist/daemon/file-watcher.js +78 -41
  23. package/dist/daemon/file-watcher.js.map +1 -1
  24. package/dist/daemon/index.d.ts +1 -1
  25. package/dist/daemon/index.d.ts.map +1 -1
  26. package/dist/daemon/index.js +54 -47
  27. package/dist/daemon/index.js.map +1 -1
  28. package/dist/index.js +3 -41
  29. package/dist/index.js.map +1 -1
  30. package/dist/lib/agent-generator.d.ts.map +1 -1
  31. package/dist/lib/agent-generator.js +21 -10
  32. package/dist/lib/agent-generator.js.map +1 -1
  33. package/dist/lib/compile-rules.d.ts +2 -0
  34. package/dist/lib/compile-rules.d.ts.map +1 -1
  35. package/dist/lib/compile-rules.js +39 -4
  36. package/dist/lib/compile-rules.js.map +1 -1
  37. package/dist/lib/compiler.d.ts +22 -1
  38. package/dist/lib/compiler.d.ts.map +1 -1
  39. package/dist/lib/compiler.js +178 -12
  40. package/dist/lib/compiler.js.map +1 -1
  41. package/dist/lib/config.d.ts +3 -0
  42. package/dist/lib/config.d.ts.map +1 -1
  43. package/dist/lib/config.js +17 -2
  44. package/dist/lib/config.js.map +1 -1
  45. package/dist/{commands/log.d.ts → lib/log-utils.d.ts} +7 -15
  46. package/dist/lib/log-utils.d.ts.map +1 -0
  47. package/dist/lib/log-utils.js +347 -0
  48. package/dist/lib/log-utils.js.map +1 -0
  49. package/dist/lib/skill-generator.d.ts +1 -1
  50. package/dist/lib/skill-generator.d.ts.map +1 -1
  51. package/dist/lib/skill-generator.js +19 -44
  52. package/dist/lib/skill-generator.js.map +1 -1
  53. package/dist/lib/ssot-map.d.ts +31 -0
  54. package/dist/lib/ssot-map.d.ts.map +1 -0
  55. package/dist/lib/ssot-map.js +79 -0
  56. package/dist/lib/ssot-map.js.map +1 -0
  57. package/dist/lib/template.d.ts +10 -3
  58. package/dist/lib/template.d.ts.map +1 -1
  59. package/dist/lib/template.js +137 -22
  60. package/dist/lib/template.js.map +1 -1
  61. package/dist/lib/upgrade-backup.js +1 -1
  62. package/dist/lib/upgrade-backup.js.map +1 -1
  63. package/dist/lib/workflow-state.d.ts +1 -1
  64. package/dist/lib/workflow-state.d.ts.map +1 -1
  65. package/dist/lib/workflow-state.js +1 -1
  66. package/dist/lib/workflow-state.js.map +1 -1
  67. package/dist/types/config.d.ts +10 -1
  68. package/dist/types/config.d.ts.map +1 -1
  69. package/dist/types/config.js +46 -41
  70. package/dist/types/config.js.map +1 -1
  71. package/dist/types/feedback.d.ts +1 -54
  72. package/dist/types/feedback.d.ts.map +1 -1
  73. package/dist/types/feedback.js +1 -22
  74. package/dist/types/feedback.js.map +1 -1
  75. package/dist/types/index.d.ts +1 -0
  76. package/dist/types/index.d.ts.map +1 -1
  77. package/dist/types/index.js +1 -0
  78. package/dist/types/index.js.map +1 -1
  79. package/dist/types/meta-index.d.ts +8 -0
  80. package/dist/types/meta-index.d.ts.map +1 -1
  81. package/dist/types/project.d.ts +6 -1
  82. package/dist/types/project.d.ts.map +1 -1
  83. package/dist/types/project.js +15 -0
  84. package/dist/types/project.js.map +1 -1
  85. package/dist/types/ssot-map.d.ts +30 -0
  86. package/dist/types/ssot-map.d.ts.map +1 -0
  87. package/dist/types/ssot-map.js +6 -0
  88. package/dist/types/ssot-map.js.map +1 -0
  89. package/package.json +1 -1
  90. package/templates/base/agents/base/tsq-architect.md +1 -1
  91. package/templates/base/agents/base/tsq-dba.md +3 -1
  92. package/templates/base/agents/base/tsq-designer.md +3 -1
  93. package/templates/base/agents/base/tsq-developer.md +3 -1
  94. package/templates/base/agents/base/tsq-librarian.md +45 -0
  95. package/templates/base/agents/base/tsq-qa.md +3 -1
  96. package/templates/base/agents/base/tsq-security.md +3 -1
  97. package/templates/base/agents/overlays/platform/claude-code.md +2 -2
  98. package/templates/base/config.template.yaml +17 -28
  99. package/templates/base/knowledge/templates/task-result.md +5 -10
  100. package/templates/base/skills/_shared/naming-conventions.md +49 -0
  101. package/templates/base/skills/_template/SKILL.md +31 -17
  102. package/templates/base/skills/{architecture → tsq-architecture}/SKILL.md +2 -2
  103. package/templates/base/skills/tsq-audit/SKILL.md +74 -0
  104. package/templates/base/skills/{methodology/bdd → tsq-bdd}/SKILL.md +14 -9
  105. package/templates/base/skills/tsq-coding/SKILL.md +65 -0
  106. package/templates/base/skills/tsq-coding/rules/async-patterns.md +81 -0
  107. package/templates/base/skills/tsq-coding/rules/code-organization.md +80 -0
  108. package/templates/base/skills/tsq-coding/rules/error-handling.md +76 -0
  109. package/templates/base/skills/tsq-coding/rules/type-safety.md +85 -0
  110. package/templates/base/skills/tsq-controller/SKILL.md +81 -0
  111. package/templates/base/skills/tsq-controller/memory/.gitkeep +0 -0
  112. package/templates/base/skills/{mobile/dart → tsq-dart}/SKILL.md +5 -3
  113. package/templates/base/skills/{database → tsq-database}/SKILL.md +13 -27
  114. package/templates/base/skills/tsq-database/rules/query-optimization.md +32 -0
  115. package/templates/base/skills/tsq-database/rules/supabase-patterns.md +94 -0
  116. package/templates/base/skills/{methodology/ddd → tsq-ddd}/SKILL.md +15 -10
  117. package/templates/base/skills/{methodology/debugging → tsq-debugging}/SKILL.md +2 -2
  118. package/templates/base/skills/tsq-decompose/SKILL.md +117 -0
  119. package/templates/base/skills/tsq-delete/SKILL.md +72 -0
  120. package/templates/base/skills/{mobile/flutter → tsq-flutter}/SKILL.md +6 -3
  121. package/templates/base/skills/tsq-grill/SKILL.md +86 -0
  122. package/templates/base/skills/{backend/node → tsq-hono}/SKILL.md +6 -4
  123. package/templates/base/skills/tsq-librarian/SKILL.md +78 -0
  124. package/templates/base/skills/tsq-log/SKILL.md +30 -0
  125. package/templates/base/skills/{frontend/nextjs → tsq-nextjs}/SKILL.md +14 -9
  126. package/templates/base/skills/{planning → tsq-planning}/SKILL.md +2 -2
  127. package/templates/base/skills/{database/prisma → tsq-prisma}/SKILL.md +15 -9
  128. package/templates/base/skills/tsq-product-audit/SKILL.md +113 -0
  129. package/templates/base/skills/tsq-product-audit/checklists/01-security.md +86 -0
  130. package/templates/base/skills/tsq-product-audit/checklists/02-performance.md +67 -0
  131. package/templates/base/skills/tsq-product-audit/checklists/03-seo.md +46 -0
  132. package/templates/base/skills/tsq-product-audit/checklists/04-accessibility.md +66 -0
  133. package/templates/base/skills/tsq-product-audit/checklists/05-ui-ux.md +50 -0
  134. package/templates/base/skills/tsq-product-audit/checklists/06-architecture.md +53 -0
  135. package/templates/base/skills/tsq-product-audit/checklists/07-functional-requirements.md +55 -0
  136. package/templates/base/skills/tsq-product-audit/rules/audit-protocol.md +136 -0
  137. package/templates/base/skills/tsq-product-audit/rules/false-positive-guard.md +81 -0
  138. package/templates/base/skills/tsq-product-audit/rules/scoring-criteria.md +113 -0
  139. package/templates/base/skills/tsq-product-audit/templates/improvement-plan-template.md +60 -0
  140. package/templates/base/skills/tsq-product-audit/templates/report-template.md +88 -0
  141. package/templates/base/skills/tsq-prompt/SKILL.md +86 -0
  142. package/templates/base/skills/tsq-protocol/SKILL.md +101 -33
  143. package/templates/base/skills/{frontend/react → tsq-react}/SKILL.md +6 -3
  144. package/templates/base/skills/tsq-retro/SKILL.md +86 -0
  145. package/templates/base/skills/tsq-retro/references/feedback-guide.md +58 -0
  146. package/templates/base/skills/tsq-retro/references/improve-protocol.md +87 -0
  147. package/templates/base/skills/tsq-retro/references/improvement-template.md +26 -0
  148. package/templates/base/skills/tsq-security/SKILL.md +66 -0
  149. package/templates/base/skills/tsq-security/rules/auth-patterns.md +62 -0
  150. package/templates/base/skills/tsq-security/rules/dependency-security.md +69 -0
  151. package/templates/base/skills/tsq-security/rules/input-validation.md +68 -0
  152. package/templates/base/skills/tsq-security/rules/secrets-management.md +65 -0
  153. package/templates/base/skills/tsq-spec/SKILL.md +58 -0
  154. package/templates/base/skills/{stability-verification → tsq-stability}/SKILL.md +3 -3
  155. package/templates/base/skills/tsq-start/SKILL.md +90 -0
  156. package/templates/base/skills/tsq-start/references/onboarding-questions.md +177 -0
  157. package/templates/base/skills/tsq-status/SKILL.md +32 -0
  158. package/templates/base/skills/{methodology/tdd → tsq-tdd}/SKILL.md +12 -3
  159. package/templates/base/skills/tsq-testing/SKILL.md +69 -0
  160. package/templates/base/skills/tsq-testing/references/e2e-stability.md +33 -0
  161. package/templates/base/skills/{typescript → tsq-typescript}/SKILL.md +5 -11
  162. package/templates/base/skills/{ui-design → tsq-ui}/SKILL.md +2 -2
  163. package/templates/base/skills/tsq-update/SKILL.md +48 -0
  164. package/templates/base/timsquad/constraints/competency-framework.xml +2 -2
  165. package/templates/base/timsquad/constraints/ssot-schema.xml +2 -2
  166. package/templates/base/timsquad/process/phase-checklist.yaml +1 -1
  167. package/templates/base/timsquad/process/state-machine.xml +2 -2
  168. package/templates/base/timsquad/process/validation-rules.xml +8 -8
  169. package/templates/base/timsquad/process/workflow-base.xml +8 -8
  170. package/templates/base/timsquad/retrospective/cycle-report.template.md +2 -2
  171. package/templates/base/timsquad/retrospective/patterns/failure-patterns.md +1 -1
  172. package/templates/base/timsquad/retrospective/patterns/success-patterns.md +2 -2
  173. package/templates/base/timsquad/retrospective/retrospective-state.xml +2 -2
  174. package/templates/base/timsquad/ssot/audit-trail-spec.template.md +155 -0
  175. package/templates/base/timsquad/ssot/compliance-matrix.template.md +105 -0
  176. package/templates/base/timsquad/ssot/component-map.template.md +181 -0
  177. package/templates/base/timsquad/ssot/data-design.template.md +4 -4
  178. package/templates/base/timsquad/ssot/deployment-spec.template.md +29 -22
  179. package/templates/base/timsquad/ssot/env-config.template.md +4 -2
  180. package/templates/base/timsquad/ssot/error-codes.template.md +3 -3
  181. package/templates/base/timsquad/ssot/functional-spec.template.md +40 -3
  182. package/templates/base/timsquad/ssot/glossary.template.md +2 -2
  183. package/templates/base/timsquad/ssot/infra-topology.template.md +191 -0
  184. package/templates/base/timsquad/ssot/integration-spec.template.md +2 -2
  185. package/templates/base/timsquad/ssot/monitoring-spec.template.md +185 -0
  186. package/templates/base/timsquad/ssot/navigation-map.template.md +154 -0
  187. package/templates/base/timsquad/ssot/performance-budget.template.md +132 -0
  188. package/templates/base/timsquad/ssot/planning.template.md +3 -3
  189. package/templates/base/timsquad/ssot/prd/_template.md +73 -0
  190. package/templates/base/timsquad/ssot/prd.template.md +10 -21
  191. package/templates/base/timsquad/ssot/requirements.template.md +3 -3
  192. package/templates/base/timsquad/ssot/sdk-spec.template.md +223 -0
  193. package/templates/base/timsquad/ssot/service-spec.template.md +3 -3
  194. package/templates/base/timsquad/ssot/state-machine.template.md +127 -0
  195. package/templates/base/timsquad/ssot/test-spec.template.md +11 -1
  196. package/templates/base/timsquad/ssot/ui-ux-spec.template.md +43 -3
  197. package/templates/base/timsquad/ssot-map.template.yaml +69 -0
  198. package/templates/base/timsquad/state/workspace.xml +11 -11
  199. package/templates/platforms/claude-code/rules/adr-rules.md +1 -1
  200. package/templates/platforms/claude-code/rules/api-conventions.md +12 -0
  201. package/templates/platforms/claude-code/rules/build-gate.md +1 -1
  202. package/templates/platforms/claude-code/rules/completion-verification.md +0 -2
  203. package/templates/platforms/claude-code/rules/context-monitor.md +1 -1
  204. package/templates/platforms/claude-code/rules/feedback-routing.md +2 -2
  205. package/templates/platforms/claude-code/rules/librarian-constraints.md +11 -0
  206. package/templates/platforms/claude-code/rules/phase-management.md +2 -2
  207. package/templates/platforms/claude-code/rules/plan-review.md +2 -2
  208. package/templates/platforms/claude-code/rules/quality-guards.md +0 -2
  209. package/templates/platforms/claude-code/rules/sequence-management.md +15 -15
  210. package/templates/platforms/claude-code/rules/session-notes.md +1 -1
  211. package/templates/platforms/claude-code/rules/test-conventions.md +13 -0
  212. package/templates/platforms/claude-code/rules/workspace-sync.md +1 -1
  213. package/templates/platforms/claude-code/scripts/build-gate.sh +6 -1
  214. package/templates/platforms/claude-code/scripts/change-scope-guard.sh +110 -0
  215. package/templates/platforms/claude-code/scripts/check-capability.sh +68 -0
  216. package/templates/platforms/claude-code/scripts/completion-guard.sh +134 -14
  217. package/templates/platforms/claude-code/scripts/context-restore.sh +95 -0
  218. package/templates/platforms/claude-code/scripts/e2e-commit-gate.sh +70 -0
  219. package/templates/platforms/claude-code/scripts/e2e-marker.sh +51 -0
  220. package/templates/platforms/claude-code/scripts/phase-guard.sh +3 -6
  221. package/templates/platforms/claude-code/scripts/pre-compact.sh +70 -0
  222. package/templates/platforms/claude-code/scripts/safe-guard.sh +2 -5
  223. package/templates/platforms/claude-code/scripts/subagent-start.sh +11 -0
  224. package/templates/platforms/claude-code/scripts/subagent-stop.sh +11 -0
  225. package/templates/platforms/claude-code/settings.json +28 -56
  226. package/templates/project-types/api-backend/config.yaml +9 -5
  227. package/templates/project-types/api-backend/process/workflow.xml +2 -2
  228. package/templates/project-types/fintech/config.yaml +13 -19
  229. package/templates/project-types/fintech/ssot/audit-trail-spec.template.md +207 -0
  230. package/templates/project-types/fintech/ssot/compliance-matrix.template.md +187 -0
  231. package/templates/project-types/infra/config.yaml +7 -4
  232. package/templates/project-types/infra/process/workflow.xml +3 -3
  233. package/templates/project-types/mobile-app/config.yaml +8 -14
  234. package/templates/project-types/mobile-app/process/workflow.xml +4 -4
  235. package/templates/project-types/platform/config.yaml +8 -5
  236. package/templates/project-types/platform/process/workflow.xml +3 -3
  237. package/templates/project-types/web-app/config.yaml +9 -15
  238. package/templates/project-types/web-app/process/workflow.xml +6 -6
  239. package/templates/project-types/web-service/config.yaml +10 -19
  240. package/templates/project-types/web-service/process/workflow.xml +6 -6
  241. package/dist/commands/compile.d.ts +0 -3
  242. package/dist/commands/compile.d.ts.map +0 -1
  243. package/dist/commands/compile.js +0 -170
  244. package/dist/commands/compile.js.map +0 -1
  245. package/dist/commands/feedback.d.ts +0 -12
  246. package/dist/commands/feedback.d.ts.map +0 -1
  247. package/dist/commands/feedback.js +0 -382
  248. package/dist/commands/feedback.js.map +0 -1
  249. package/dist/commands/full.d.ts +0 -3
  250. package/dist/commands/full.d.ts.map +0 -1
  251. package/dist/commands/full.js +0 -88
  252. package/dist/commands/full.js.map +0 -1
  253. package/dist/commands/git/commit.d.ts +0 -3
  254. package/dist/commands/git/commit.d.ts.map +0 -1
  255. package/dist/commands/git/commit.js +0 -85
  256. package/dist/commands/git/commit.js.map +0 -1
  257. package/dist/commands/git/index.d.ts +0 -5
  258. package/dist/commands/git/index.d.ts.map +0 -1
  259. package/dist/commands/git/index.js +0 -5
  260. package/dist/commands/git/index.js.map +0 -1
  261. package/dist/commands/git/pr.d.ts +0 -3
  262. package/dist/commands/git/pr.d.ts.map +0 -1
  263. package/dist/commands/git/pr.js +0 -139
  264. package/dist/commands/git/pr.js.map +0 -1
  265. package/dist/commands/git/release.d.ts +0 -3
  266. package/dist/commands/git/release.d.ts.map +0 -1
  267. package/dist/commands/git/release.js +0 -153
  268. package/dist/commands/git/release.js.map +0 -1
  269. package/dist/commands/git/sync.d.ts +0 -3
  270. package/dist/commands/git/sync.d.ts.map +0 -1
  271. package/dist/commands/git/sync.js +0 -132
  272. package/dist/commands/git/sync.js.map +0 -1
  273. package/dist/commands/improve.d.ts +0 -3
  274. package/dist/commands/improve.d.ts.map +0 -1
  275. package/dist/commands/improve.js +0 -286
  276. package/dist/commands/improve.js.map +0 -1
  277. package/dist/commands/knowledge.d.ts +0 -3
  278. package/dist/commands/knowledge.d.ts.map +0 -1
  279. package/dist/commands/knowledge.js +0 -316
  280. package/dist/commands/knowledge.js.map +0 -1
  281. package/dist/commands/log.d.ts.map +0 -1
  282. package/dist/commands/log.js +0 -1436
  283. package/dist/commands/log.js.map +0 -1
  284. package/dist/commands/meta-index.d.ts +0 -3
  285. package/dist/commands/meta-index.d.ts.map +0 -1
  286. package/dist/commands/meta-index.js +0 -401
  287. package/dist/commands/meta-index.js.map +0 -1
  288. package/dist/commands/metrics.d.ts +0 -3
  289. package/dist/commands/metrics.d.ts.map +0 -1
  290. package/dist/commands/metrics.js +0 -843
  291. package/dist/commands/metrics.js.map +0 -1
  292. package/dist/commands/quick.d.ts +0 -3
  293. package/dist/commands/quick.d.ts.map +0 -1
  294. package/dist/commands/quick.js +0 -136
  295. package/dist/commands/quick.js.map +0 -1
  296. package/dist/commands/retro.d.ts +0 -3
  297. package/dist/commands/retro.d.ts.map +0 -1
  298. package/dist/commands/retro.js +0 -828
  299. package/dist/commands/retro.js.map +0 -1
  300. package/dist/commands/session.d.ts +0 -3
  301. package/dist/commands/session.d.ts.map +0 -1
  302. package/dist/commands/session.js +0 -346
  303. package/dist/commands/session.js.map +0 -1
  304. package/dist/commands/skills.d.ts +0 -12
  305. package/dist/commands/skills.d.ts.map +0 -1
  306. package/dist/commands/skills.js +0 -228
  307. package/dist/commands/skills.js.map +0 -1
  308. package/dist/commands/status.d.ts +0 -3
  309. package/dist/commands/status.d.ts.map +0 -1
  310. package/dist/commands/status.js +0 -127
  311. package/dist/commands/status.js.map +0 -1
  312. package/dist/commands/upgrade.d.ts.map +0 -1
  313. package/dist/commands/upgrade.js.map +0 -1
  314. package/dist/commands/watch.d.ts +0 -3
  315. package/dist/commands/watch.d.ts.map +0 -1
  316. package/dist/commands/watch.js +0 -213
  317. package/dist/commands/watch.js.map +0 -1
  318. package/dist/commands/workflow.d.ts +0 -3
  319. package/dist/commands/workflow.d.ts.map +0 -1
  320. package/dist/commands/workflow.js +0 -607
  321. package/dist/commands/workflow.js.map +0 -1
  322. package/templates/base/skills/coding/SKILL.md +0 -47
  323. package/templates/base/skills/controller/SKILL.md +0 -111
  324. package/templates/base/skills/prompt-engineering/SKILL.md +0 -103
  325. package/templates/base/skills/retrospective/SKILL.md +0 -102
  326. package/templates/base/skills/security/SKILL.md +0 -55
  327. package/templates/base/skills/testing/SKILL.md +0 -63
  328. package/templates/base/timsquad/feedback/feedback-router.sh +0 -341
  329. package/templates/base/timsquad/feedback/routing-rules.yaml +0 -352
  330. package/templates/platforms/claude-code/CLAUDE.md.template +0 -89
  331. package/templates/platforms/claude-code/rules/skill-suggest.md +0 -27
  332. package/templates/platforms/claude-code/scripts/skill-rules.json +0 -85
  333. package/templates/platforms/claude-code/scripts/skill-suggest.sh +0 -105
  334. /package/templates/base/skills/{architecture → tsq-architecture}/references/adr-template.md +0 -0
  335. /package/templates/base/skills/{architecture → tsq-architecture}/references/api-design.md +0 -0
  336. /package/templates/base/skills/{methodology/bdd → tsq-bdd}/rules/gherkin-patterns.md +0 -0
  337. /package/templates/base/skills/{coding → tsq-coding}/rules/patterns.md +0 -0
  338. /package/templates/base/skills/{controller → tsq-controller}/references/README.md +0 -0
  339. /package/templates/base/skills/{controller → tsq-controller}/rules/README.md +0 -0
  340. /package/templates/base/skills/{mobile/dart → tsq-dart}/rules/async-patterns.md +0 -0
  341. /package/templates/base/skills/{mobile/dart → tsq-dart}/rules/code-style.md +0 -0
  342. /package/templates/base/skills/{mobile/dart → tsq-dart}/rules/null-safety.md +0 -0
  343. /package/templates/base/skills/{mobile/dart → tsq-dart}/rules/type-system.md +0 -0
  344. /package/templates/base/skills/{methodology/ddd → tsq-ddd}/rules/strategic-patterns.md +0 -0
  345. /package/templates/base/skills/{methodology/debugging → tsq-debugging}/references/root-cause-tracing.md +0 -0
  346. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/SKILL.md +0 -0
  347. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/references/ci-cd-pipeline.md +0 -0
  348. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/code-signing.md +0 -0
  349. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/codemagic-setup.md +0 -0
  350. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/fastlane-setup.md +0 -0
  351. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/github-actions.md +0 -0
  352. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/store-deployment.md +0 -0
  353. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/versioning.md +0 -0
  354. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/SKILL.md +0 -0
  355. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/references/i18n-architecture.md +0 -0
  356. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/arb-files.md +0 -0
  357. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/locale-switching.md +0 -0
  358. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/localization-setup.md +0 -0
  359. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/plural-gender.md +0 -0
  360. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/text-direction.md +0 -0
  361. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/SKILL.md +0 -0
  362. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/references/monitoring-architecture.md +0 -0
  363. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/analytics.md +0 -0
  364. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/crashlytics-setup.md +0 -0
  365. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/logging.md +0 -0
  366. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/performance-monitoring.md +0 -0
  367. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/sentry-integration.md +0 -0
  368. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/SKILL.md +0 -0
  369. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/references/api-client-architecture.md +0 -0
  370. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/caching.md +0 -0
  371. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/connectivity.md +0 -0
  372. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/dio-setup.md +0 -0
  373. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/error-handling.md +0 -0
  374. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/interceptors.md +0 -0
  375. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/retrofit-patterns.md +0 -0
  376. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/SKILL.md +0 -0
  377. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/references/notification-architecture.md +0 -0
  378. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/references/platform-setup.md +0 -0
  379. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/background-processing.md +0 -0
  380. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/deep-linking.md +0 -0
  381. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/fcm-setup.md +0 -0
  382. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/local-notifications.md +0 -0
  383. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/notification-handling.md +0 -0
  384. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/notification-permissions.md +0 -0
  385. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/rich-notifications.md +0 -0
  386. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/references/freezed-patterns.md +0 -0
  387. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/references/project-structure.md +0 -0
  388. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/animations.md +0 -0
  389. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/architecture.md +0 -0
  390. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/navigation-routing.md +0 -0
  391. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/performance.md +0 -0
  392. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/platform-adaptive.md +0 -0
  393. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/state-management.md +0 -0
  394. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/testing.md +0 -0
  395. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/widget-conventions.md +0 -0
  396. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/SKILL.md +0 -0
  397. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/references/mobile-security-checklist.md +0 -0
  398. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/api-key-protection.md +0 -0
  399. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/authentication.md +0 -0
  400. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/data-protection.md +0 -0
  401. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/obfuscation.md +0 -0
  402. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/secure-storage.md +0 -0
  403. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/ssl-pinning.md +0 -0
  404. /package/templates/base/skills/{backend/node → tsq-hono}/rules/async-patterns.md +0 -0
  405. /package/templates/base/skills/{backend/node → tsq-hono}/rules/deployment.md +0 -0
  406. /package/templates/base/skills/{backend/node → tsq-hono}/rules/env-config.md +0 -0
  407. /package/templates/base/skills/{backend/node → tsq-hono}/rules/error-handling.md +0 -0
  408. /package/templates/base/skills/{backend/node → tsq-hono}/rules/hono-app-setup.md +0 -0
  409. /package/templates/base/skills/{backend/node → tsq-hono}/rules/jwt-auth.md +0 -0
  410. /package/templates/base/skills/{backend/node → tsq-hono}/rules/middleware.md +0 -0
  411. /package/templates/base/skills/{backend/node → tsq-hono}/rules/testing.md +0 -0
  412. /package/templates/base/skills/{frontend/nextjs → tsq-nextjs}/rules/app-router.md +0 -0
  413. /package/templates/base/skills/{planning → tsq-planning}/references/prd-guide.md +0 -0
  414. /package/templates/base/skills/{planning → tsq-planning}/references/requirements-guide.md +0 -0
  415. /package/templates/base/skills/{database/prisma → tsq-prisma}/rules/queries.md +0 -0
  416. /package/templates/base/skills/{database/prisma → tsq-prisma}/rules/schema-design.md +0 -0
  417. /package/templates/base/skills/{frontend/react → tsq-react}/rules/_sections.md +0 -0
  418. /package/templates/base/skills/{frontend/react → tsq-react}/rules/anti-patterns.md +0 -0
  419. /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-api-routes.md +0 -0
  420. /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-defer-await.md +0 -0
  421. /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-dependencies.md +0 -0
  422. /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-parallel.md +0 -0
  423. /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-suspense-boundaries.md +0 -0
  424. /package/templates/base/skills/{frontend/react → tsq-react}/rules/bundle-barrel-imports.md +0 -0
  425. /package/templates/base/skills/{frontend/react → tsq-react}/rules/bundle-defer-third-party.md +0 -0
  426. /package/templates/base/skills/{frontend/react → tsq-react}/rules/bundle-dynamic-imports.md +0 -0
  427. /package/templates/base/skills/{frontend/react → tsq-react}/rules/component-conventions.md +0 -0
  428. /package/templates/base/skills/{frontend/react → tsq-react}/rules/js-combine-iterations.md +0 -0
  429. /package/templates/base/skills/{frontend/react → tsq-react}/rules/js-early-exit.md +0 -0
  430. /package/templates/base/skills/{frontend/react → tsq-react}/rules/js-index-maps.md +0 -0
  431. /package/templates/base/skills/{frontend/react → tsq-react}/rules/js-set-map-lookups.md +0 -0
  432. /package/templates/base/skills/{frontend/react → tsq-react}/rules/rendering-conditional-render.md +0 -0
  433. /package/templates/base/skills/{frontend/react → tsq-react}/rules/rendering-content-visibility.md +0 -0
  434. /package/templates/base/skills/{frontend/react → tsq-react}/rules/rendering-hoist-jsx.md +0 -0
  435. /package/templates/base/skills/{frontend/react → tsq-react}/rules/rerender-defer-reads.md +0 -0
  436. /package/templates/base/skills/{frontend/react → tsq-react}/rules/rerender-derived-state.md +0 -0
  437. /package/templates/base/skills/{frontend/react → tsq-react}/rules/rerender-memo.md +0 -0
  438. /package/templates/base/skills/{frontend/react → tsq-react}/rules/rerender-transitions.md +0 -0
  439. /package/templates/base/skills/{frontend/react → tsq-react}/rules/server-after-nonblocking.md +0 -0
  440. /package/templates/base/skills/{frontend/react → tsq-react}/rules/server-cache-react.md +0 -0
  441. /package/templates/base/skills/{frontend/react → tsq-react}/rules/server-parallel-fetching.md +0 -0
  442. /package/templates/base/skills/{frontend/react → tsq-react}/rules/state-location.md +0 -0
  443. /package/templates/base/skills/{security → tsq-security}/rules/owasp-examples.md +0 -0
  444. /package/templates/base/skills/{security → tsq-security}/scripts/check-secrets.sh +0 -0
  445. /package/templates/base/skills/{stability-verification → tsq-stability}/references/release-checklist.md +0 -0
  446. /package/templates/base/skills/{stability-verification → tsq-stability}/references/security-fix-patterns.md +0 -0
  447. /package/templates/base/skills/{stability-verification → tsq-stability}/rules/verification-layers.md +0 -0
  448. /package/templates/base/skills/{stability-verification → tsq-stability}/rules/verification-workflow.md +0 -0
  449. /package/templates/base/skills/{stability-verification → tsq-stability}/scripts/verify.sh +0 -0
  450. /package/templates/base/skills/{methodology/tdd → tsq-tdd}/rules/real-world-example.md +0 -0
  451. /package/templates/base/skills/{methodology/tdd → tsq-tdd}/rules/techniques.md +0 -0
  452. /package/templates/base/skills/{testing → tsq-testing}/references/testing-patterns.md +0 -0
  453. /package/templates/base/skills/{typescript → tsq-typescript}/rules/type-patterns.md +0 -0
  454. /package/templates/base/skills/{typescript → tsq-typescript}/rules/utility-types.md +0 -0
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: 계획 품질 검증 루프. Full Mode에서 구현 전 필수 수행.
3
- globs:
3
+ paths:
4
4
  - ".timsquad/ssot/**"
5
5
  - ".timsquad/state/**"
6
6
  ---
@@ -8,7 +8,7 @@ globs:
8
8
  # 계획 품질 검증 (Plan Review Protocol)
9
9
 
10
10
  ## 언제 수행하나
11
- `tsq f`로 Full Mode 진입 시, SSOT 체크 후 / 에이전트 위임 전.
11
+ Controller를 통한 위임 시, SSOT 체크 후 / 에이전트 위임 전.
12
12
 
13
13
  ## 검증 축 (3-Axis Plan Review)
14
14
 
@@ -1,7 +1,5 @@
1
1
  ---
2
2
  description: 품질 가드 시스템. 파괴적 명령 차단, 페이즈 제한, 완료 검증.
3
- globs:
4
- - "**/*"
5
3
  ---
6
4
 
7
5
  # 품질 가드 시스템 (Quality Guards)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: 시퀀스 관리 규칙. 네이밍, 자동화 파이프라인, 수동 모드.
3
- globs:
3
+ paths:
4
4
  - ".timsquad/logs/**"
5
5
  - ".timsquad/state/workspace.xml"
6
6
  ---
@@ -18,16 +18,16 @@ Phase/Sequence/Task ID를 **자동 생성**하여 등록하세요. 사용자에
18
18
  - Phase ID: `P{N}` — planning=P1, design=P2, implementation=P3, review=P4, security=P5, deployment=P6
19
19
  - Sequence ID: `P{N}-S{NNN}` — 페이즈 내 시퀀스 번호 (zero-padded)
20
20
  - Task ID: `P{N}-S{NNN}-T{NNN}` — 시퀀스 내 태스크 번호 (zero-padded)
21
- - 번호는 `tsq wf status`로 기존 시퀀스를 확인한 후 이어서 부여
21
+ - 번호는 `.timsquad/state/workflow.json`에서 기존 시퀀스를 확인한 후 이어서 부여
22
22
 
23
23
  **흐름 예시**:
24
24
  ```
25
25
  사용자: "인증 기능이랑 결제 API 구현해줘"
26
26
  PM 내부 처리:
27
27
  1. config.yaml → naming.phase.order → implementation = P3
28
- 2. tsq wf set-phase P3
29
- 3. tsq wf add-sequence P3-S001 --agents developer,dba
30
- 4. tsq wf add-sequence P3-S002 --agents developer,security
28
+ 2. workflow.json current_phase = P3 설정
29
+ 3. P3-S001 시퀀스 등록 (agents: developer, dba)
30
+ 4. P3-S002 시퀀스 등록 (agents: developer, security)
31
31
  5. @tsq-developer "P3-S001: 인증 구현"
32
32
  ```
33
33
 
@@ -51,11 +51,11 @@ SessionEnd → tsq daemon stop
51
51
  ```
52
52
 
53
53
  ## 자동화 토글
54
- ```bash
55
- tsq wf config sequence_log off # L2 자동 생성 끄기
56
- tsq wf config retro off # 자동 회고 끄기
57
- tsq wf status # 현재 상태 확인
58
- ```
54
+
55
+ `.timsquad/state/workflow.json` `automation` 섹션에서 직접 toggle:
56
+ - `sequence_log: false` L2 자동 생성 끄기
57
+ - `retro: false` 자동 회고 끄기
58
+ - `/status`로 현재 상태 확인
59
59
 
60
60
  ## 수동 모드 (자동화 꺼진 경우)
61
61
 
@@ -65,8 +65,8 @@ tsq wf status # 현재 상태 확인
65
65
  - 보고서 저장: `.timsquad/reports/{SEQ-ID}-report.md`
66
66
 
67
67
  ### 수동 L2/L3 생성
68
- ```bash
69
- tsq log sequence create {SEQ-ID} --phase {phase} --report {path} --verdict proceed
70
- tsq log phase create {phase-id} --sequences "SEQ-01,SEQ-02"
71
- tsq log phase gate {phase-id}
72
- ```
68
+
69
+ `/log` 스킬을 사용하여 수동 로그 생성:
70
+ - 시퀀스 로그: `.timsquad/logs/sequences/{SEQ-ID}.md`
71
+ - 페이즈 로그: `.timsquad/logs/phases/{phase-id}.md`
72
+ - 페이즈 게이트: workflow.json → completed_phases 업데이트
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: 컨텍스트 생존 메모. 세션 압축 후 작업 연속성 유지.
3
- globs:
3
+ paths:
4
4
  - ".timsquad/.daemon/**"
5
5
  ---
6
6
 
@@ -0,0 +1,13 @@
1
+ ---
2
+ paths:
3
+ - "tests/**/*.test.ts"
4
+ - "tests/**/*.spec.ts"
5
+ - "**/*.test.ts"
6
+ - "**/*.spec.ts"
7
+ ---
8
+
9
+ - describe/it 중첩 3단계 이하 유지
10
+ - 테스트 데이터는 인라인 또는 fixtures/ 디렉토리 사용
11
+ - 각 테스트는 독립적 (공유 상태 금지, beforeEach에서 초기화)
12
+ - 테스트 이름은 "should + 기대 동작" 형식
13
+ - mock은 최소 범위로 사용 (외부 의존성만 mock)
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  description: workspace.xml 실시간 상태 관리 규칙.
3
- globs:
3
+ paths:
4
4
  - ".timsquad/state/workspace.xml"
5
5
  ---
6
6
 
@@ -30,7 +30,12 @@ fi
30
30
 
31
31
  # ── 1. Get changed TypeScript files ──
32
32
  cd "$PROJECT_ROOT"
33
- CHANGED_TS=$(git diff --name-only --diff-filter=ACMR HEAD -- '*.ts' '*.tsx' 2>/dev/null || echo "")
33
+ CHANGED_TS=$(git diff --cached --name-only --diff-filter=ACMR -- '*.ts' '*.tsx' 2>/dev/null || echo "")
34
+ # Include unstaged changes too
35
+ CHANGED_TS_UNSTAGED=$(git diff --name-only --diff-filter=ACMR -- '*.ts' '*.tsx' 2>/dev/null || echo "")
36
+ if [ -n "$CHANGED_TS_UNSTAGED" ]; then
37
+ CHANGED_TS=$(printf '%s\n%s' "$CHANGED_TS" "$CHANGED_TS_UNSTAGED" | sort -u)
38
+ fi
34
39
 
35
40
  # No TypeScript files changed → pass
36
41
  if [ -z "$CHANGED_TS" ]; then
@@ -0,0 +1,110 @@
1
+ #!/usr/bin/env bash
2
+ # change-scope-guard.sh — PreToolUse Hook (Edit/Write)
3
+ # Tracks cumulative file changes and enforces SCR (Single Change Rule).
4
+ # 3 files: warning, 6 files: block, >100 lines total: warning
5
+ #
6
+ # Input: JSON via stdin (Claude Code hook protocol)
7
+ # Output: JSON with permissionDecision (allow/deny/ask)
8
+ #
9
+ # State file: /tmp/tsq-scope-guard-${SESSION_ID:-default}.json
10
+
11
+ set -euo pipefail
12
+
13
+ WARN_FILES=3
14
+ BLOCK_FILES=6
15
+ WARN_LINES=100
16
+
17
+ # Session-scoped state file
18
+ SESSION_ID="${CLAUDE_SESSION_ID:-default}"
19
+ STATE_FILE="/tmp/tsq-scope-guard-${SESSION_ID}.json"
20
+
21
+ # Read hook input from stdin
22
+ INPUT=$(cat 2>/dev/null || echo "")
23
+
24
+ # Fail-open: no input → allow
25
+ if [ -z "$INPUT" ]; then
26
+ echo '{"hookSpecificOutput":{"permissionDecision":"allow"}}'
27
+ exit 0
28
+ fi
29
+
30
+ # Extract tool name
31
+ TOOL_NAME=""
32
+ if command -v jq >/dev/null 2>&1; then
33
+ TOOL_NAME=$(echo "$INPUT" | jq -r '.toolName // empty' 2>/dev/null || true)
34
+ fi
35
+
36
+ # Only track Edit and Write tools
37
+ if [ "$TOOL_NAME" != "Edit" ] && [ "$TOOL_NAME" != "Write" ]; then
38
+ echo '{"hookSpecificOutput":{"permissionDecision":"allow"}}'
39
+ exit 0
40
+ fi
41
+
42
+ # Extract file path from tool input
43
+ FILE_PATH=""
44
+ if command -v jq >/dev/null 2>&1; then
45
+ FILE_PATH=$(echo "$INPUT" | jq -r '.toolInput.file_path // empty' 2>/dev/null || true)
46
+ fi
47
+
48
+ if [ -z "$FILE_PATH" ]; then
49
+ echo '{"hookSpecificOutput":{"permissionDecision":"allow"}}'
50
+ exit 0
51
+ fi
52
+
53
+ # Initialize state file if needed
54
+ if [ ! -f "$STATE_FILE" ]; then
55
+ echo '{"files":[],"total_lines":0}' > "$STATE_FILE"
56
+ fi
57
+
58
+ # Read current state
59
+ if command -v jq >/dev/null 2>&1; then
60
+ CURRENT_FILES=$(jq -r '.files[]' "$STATE_FILE" 2>/dev/null || true)
61
+ TOTAL_LINES=$(jq -r '.total_lines // 0' "$STATE_FILE" 2>/dev/null || echo "0")
62
+ else
63
+ echo '{"hookSpecificOutput":{"permissionDecision":"allow"}}'
64
+ exit 0
65
+ fi
66
+
67
+ # Check if file is already tracked
68
+ ALREADY_TRACKED=false
69
+ while IFS= read -r f; do
70
+ if [ "$f" = "$FILE_PATH" ]; then
71
+ ALREADY_TRACKED=true
72
+ break
73
+ fi
74
+ done <<< "$CURRENT_FILES"
75
+
76
+ # Add new file if not tracked
77
+ if [ "$ALREADY_TRACKED" = false ]; then
78
+ jq --arg fp "$FILE_PATH" '.files += [$fp]' "$STATE_FILE" > "${STATE_FILE}.tmp" && mv "${STATE_FILE}.tmp" "$STATE_FILE"
79
+ fi
80
+
81
+ # Estimate line changes (for Edit: old_string length approximation)
82
+ if [ "$TOOL_NAME" = "Edit" ]; then
83
+ NEW_LINES=$(echo "$INPUT" | jq -r '.toolInput.new_string // ""' 2>/dev/null | wc -l || echo "0")
84
+ TOTAL_LINES=$((TOTAL_LINES + NEW_LINES))
85
+ jq --argjson tl "$TOTAL_LINES" '.total_lines = $tl' "$STATE_FILE" > "${STATE_FILE}.tmp" && mv "${STATE_FILE}.tmp" "$STATE_FILE"
86
+ fi
87
+
88
+ # Count unique files
89
+ FILE_COUNT=$(jq '.files | length' "$STATE_FILE" 2>/dev/null || echo "0")
90
+
91
+ # Decision logic
92
+ if [ "$FILE_COUNT" -ge "$BLOCK_FILES" ]; then
93
+ MSG="SCR violation: ${FILE_COUNT} files modified (limit: ${BLOCK_FILES}). Split into smaller tasks."
94
+ echo "{\"hookSpecificOutput\":{\"permissionDecision\":\"deny\",\"message\":\"${MSG}\"}}"
95
+ exit 0
96
+ fi
97
+
98
+ if [ "$FILE_COUNT" -ge "$WARN_FILES" ]; then
99
+ MSG="SCR warning: ${FILE_COUNT} files modified. Consider splitting this task."
100
+ echo "{\"hookSpecificOutput\":{\"permissionDecision\":\"allow\",\"message\":\"${MSG}\"}}"
101
+ exit 0
102
+ fi
103
+
104
+ if [ "$TOTAL_LINES" -ge "$WARN_LINES" ]; then
105
+ MSG="Large change: ~${TOTAL_LINES} lines modified across ${FILE_COUNT} files."
106
+ echo "{\"hookSpecificOutput\":{\"permissionDecision\":\"allow\",\"message\":\"${MSG}\"}}"
107
+ exit 0
108
+ fi
109
+
110
+ echo '{"hookSpecificOutput":{"permissionDecision":"allow"}}'
@@ -0,0 +1,68 @@
1
+ #!/usr/bin/env bash
2
+ # Hook Gate: controller capability token 검증
3
+ # PreToolUse (Write|Edit) — controller 미경유 시 차단
4
+ #
5
+ # 동작:
6
+ # 1. controller-active 파일 없으면 → deny
7
+ # 2. allowed-paths.txt에 없는 파일이면 → deny
8
+ # 3. .timsquad/ 내부 파일은 항상 허용
9
+
10
+ set -euo pipefail
11
+
12
+ STATE_DIR=".timsquad/state"
13
+ ACTIVE_FILE="$STATE_DIR/controller-active"
14
+ ALLOWED_FILE="$STATE_DIR/allowed-paths.txt"
15
+
16
+ # Read tool input from stdin
17
+ INPUT=$(cat 2>/dev/null || echo "")
18
+ FILE_PATH=$(echo "$INPUT" | grep -o '"file_path"[[:space:]]*:[[:space:]]*"[^"]*"' | head -1 | sed 's/.*"file_path"[[:space:]]*:[[:space:]]*"//' | sed 's/"$//')
19
+
20
+ # No file path → allow (not a file operation)
21
+ if [ -z "$FILE_PATH" ]; then
22
+ exit 0
23
+ fi
24
+
25
+ # .timsquad/ internal files → always allow
26
+ if [[ "$FILE_PATH" == *".timsquad/"* ]]; then
27
+ exit 0
28
+ fi
29
+
30
+ # .claude/ internal files → always allow
31
+ if [[ "$FILE_PATH" == *".claude/"* ]]; then
32
+ exit 0
33
+ fi
34
+
35
+ # No state directory → pipeline not active, allow (no enforcement)
36
+ if [ ! -d "$STATE_DIR" ]; then
37
+ exit 0
38
+ fi
39
+
40
+ # Controller active check
41
+ if [ ! -f "$ACTIVE_FILE" ]; then
42
+ # Controller not active → allow without enforcement
43
+ # (enforcement only when pipeline is explicitly started)
44
+ exit 0
45
+ fi
46
+
47
+ # Allowed paths check
48
+ if [ -f "$ALLOWED_FILE" ]; then
49
+ MATCH=0
50
+ while IFS= read -r pattern; do
51
+ [ -z "$pattern" ] && continue
52
+ # shellcheck disable=SC2254
53
+ case "$FILE_PATH" in
54
+ $pattern) MATCH=1; break ;;
55
+ esac
56
+ done < "$ALLOWED_FILE"
57
+
58
+ if [ "$MATCH" -eq 0 ]; then
59
+ # File not in allowed paths → deny
60
+ PATTERNS=$(tr '\n' ', ' < "$ALLOWED_FILE")
61
+ jq -n --arg msg "작업 범위 밖 파일입니다. controller가 허용한 파일만 수정할 수 있습니다. 허용 패턴: $PATTERNS" \
62
+ '{"hookSpecificOutput":{"permissionDecision":"deny"},"systemMessage":$msg}'
63
+ exit 0
64
+ fi
65
+ fi
66
+
67
+ # All checks passed
68
+ exit 0
@@ -34,18 +34,65 @@ fi
34
34
 
35
35
  BLOCK_REASON=""
36
36
 
37
- # ── 1. Test execution gate (implementation phase only) ──
38
- # 자기 보고 금지: 테스트 exit code로 완료를 판정한다.
39
- # stop_hook_active=false일 때만 블로킹 (1회 기회 부여, 루프 방지는 섹션 0에서 처리)
37
+ # ── 1. Test execution gate ──
38
+ # 변경된 소스 파일에 대한 테스트 실행 여부 확인
39
+ # implementation phase에서만 block, 외에는 warning
40
40
  PHASE_FILE="$PROJECT_ROOT/.timsquad/state/current-phase.json"
41
+ PHASE="unknown"
41
42
  if [ -f "$PHASE_FILE" ]; then
42
43
  PHASE=$(jq -r '.current // .current_phase // .phase // "unknown"' "$PHASE_FILE" 2>/dev/null || echo "unknown")
43
- if [ "$PHASE" = "implementation" ]; then
44
- SESSION_STATE="$PROJECT_ROOT/.timsquad/.daemon/session-state.json"
45
- if [ -f "$SESSION_STATE" ]; then
46
- BASH_COMMANDS=$(jq -r '.metrics.bashCommands // 0' "$SESSION_STATE" 2>/dev/null || echo "0")
47
- if [ "$BASH_COMMANDS" -eq 0 ] 2>/dev/null; then
48
- BLOCK_REASON="[Completion Guard] 이번 세션에서 테스트가 실행되지 않았습니다. 프로젝트의 테스트를 실행하여 변경사항을 검증한 후 완료하세요."
44
+ fi
45
+
46
+ TEST_WARNING=""
47
+ SESSION_STATE="$PROJECT_ROOT/.timsquad/.daemon/session-state.json"
48
+ if [ -f "$SESSION_STATE" ]; then
49
+ # Check if any bash commands were executed (tests run via bash)
50
+ BASH_COMMANDS=$(jq -r '.metrics.bashCommands // 0' "$SESSION_STATE" 2>/dev/null || echo "0")
51
+
52
+ if [ "$BASH_COMMANDS" -eq 0 ] 2>/dev/null; then
53
+ # No tests or bash at all — check for changed source files
54
+ CHANGED_SRC=$(cd "$PROJECT_ROOT" && git diff --name-only --diff-filter=ACMR HEAD 2>/dev/null | grep -E '\.(ts|tsx|js|jsx)$' | grep -vE '\.(test|spec)\.' | head -5)
55
+ if [ -n "$CHANGED_SRC" ]; then
56
+ # List related test files that should have been run
57
+ RELATED_TESTS=""
58
+ while IFS= read -r SRC_FILE; do
59
+ [ -z "$SRC_FILE" ] && continue
60
+ BASE_NAME=$(basename "$SRC_FILE" | sed 's/\.[^.]*$//')
61
+ POTENTIAL=$(cd "$PROJECT_ROOT" && find . -name "${BASE_NAME}.test.*" -o -name "${BASE_NAME}.spec.*" 2>/dev/null | head -1)
62
+ if [ -n "$POTENTIAL" ]; then
63
+ RELATED_TESTS="$RELATED_TESTS $POTENTIAL"
64
+ fi
65
+ done <<< "$CHANGED_SRC"
66
+
67
+ if [ -n "$RELATED_TESTS" ]; then
68
+ TEST_WARNING="[Test Gate] 변경된 파일에 대한 테스트가 실행되지 않았습니다. 관련 테스트:$RELATED_TESTS"
69
+ else
70
+ TEST_WARNING="[Test Gate] 변경된 소스 파일이 있으나 테스트가 실행되지 않았습니다."
71
+ fi
72
+
73
+ if [ "$PHASE" = "implementation" ]; then
74
+ BLOCK_REASON="$TEST_WARNING 테스트를 실행한 후 완료하세요."
75
+ fi
76
+ fi
77
+ fi
78
+ fi
79
+
80
+ # ── 1b. TDD gate: 소스 변경 시 테스트 파일도 변경되었는지 확인 ──
81
+ if [ "$PHASE" = "implementation" ] && [ -z "$BLOCK_REASON" ]; then
82
+ ALL_CHANGED=$(cd "$PROJECT_ROOT" && {
83
+ git diff --cached --name-only --diff-filter=ACMR 2>/dev/null
84
+ git diff --name-only --diff-filter=ACMR 2>/dev/null
85
+ git ls-files --others --exclude-standard 2>/dev/null
86
+ } | sort -u | grep -E '\.(ts|tsx|js|jsx)$')
87
+
88
+ if [ -n "$ALL_CHANGED" ]; then
89
+ SRC_CHANGED=$(echo "$ALL_CHANGED" | grep -vE '\.(test|spec)\.' | grep -v '__tests__/' | head -5)
90
+ TEST_CHANGED=$(echo "$ALL_CHANGED" | grep -E '\.(test|spec)\.' | head -1)
91
+
92
+ if [ -n "$SRC_CHANGED" ] && [ -z "$TEST_CHANGED" ]; then
93
+ REFACTOR_ONLY=$(echo "$INPUT" | jq -r '.transcript // ""' 2>/dev/null | grep -ci 'refactor-only' || echo "0")
94
+ if [ "$REFACTOR_ONLY" -eq 0 ] 2>/dev/null; then
95
+ BLOCK_REASON="[TDD Gate] 소스 파일이 변경되었으나 테스트 파일(.test./.spec.)이 없습니다. 테스트를 먼저 작성하세요. (리팩토링만 한 경우 Notes에 'refactor-only' 명시)"
49
96
  fi
50
97
  fi
51
98
  fi
@@ -72,22 +119,95 @@ if [ -f "$NOTES_FILE" ]; then
72
119
 
73
120
  # ── 3. Context window monitor (85% threshold) ──
74
121
  if [ "$CTX_PCT" -ge 85 ] 2>/dev/null; then
75
- SESSION_CTX="$SESSION_CTX\\n⚠ [Context ${CTX_PCT}%] 컨텍스트 윈도우 85% 이상 사용. 중요 정보를 session-notes에 기록하고, 현재 태스크를 정리한 완료하세요."
122
+ SESSION_CTX="$SESSION_CTX\\n⚠ [Context ${CTX_PCT}%] 컨텍스트 윈도우 85% 이상. 현재 작업을 마무리하고, Phase Memory(.timsquad/state/phase-memory.md)를 갱신한 /clear로 컨텍스트를 초기화하세요. /clear 후에도 phase-memory가 자동 주입됩니다."
76
123
  elif [ "$CTX_PCT" -ge 70 ] 2>/dev/null; then
77
124
  SESSION_CTX="$SESSION_CTX | Ctx: ${CTX_PCT}%"
78
125
  fi
79
126
  fi
80
127
  fi
81
128
 
82
- # ── 4. Combine and output ──
129
+ # ── 4. SSOT readiness check ──
130
+ SSOT_WARNING=""
131
+ PRD_FILE="$PROJECT_ROOT/.timsquad/ssot/prd.md"
132
+ if [ -f "$PRD_FILE" ]; then
133
+ # Check if PRD is mostly placeholder (TBD, [Resource Name], example.com)
134
+ TOTAL_LINES=$(wc -l < "$PRD_FILE" 2>/dev/null || echo "0")
135
+ PLACEHOLDER_LINES=$(grep -ciE 'TBD|\[Resource Name\]|\[프로젝트|example\.com|placeholder' "$PRD_FILE" 2>/dev/null || echo "0")
136
+ if [ "$TOTAL_LINES" -gt 0 ] 2>/dev/null; then
137
+ PCT=$((PLACEHOLDER_LINES * 100 / TOTAL_LINES))
138
+ if [ "$PCT" -ge 50 ] 2>/dev/null; then
139
+ SSOT_WARNING="[SSOT] PRD가 아직 작성되지 않았습니다. /tsq-start로 온보딩을 진행하세요 (PRD 작성 + 기능별 /grill 인터뷰)."
140
+ fi
141
+ fi
142
+ elif [ -d "$PROJECT_ROOT/.timsquad/ssot" ]; then
143
+ SSOT_WARNING="[SSOT] PRD가 존재하지 않습니다. /tsq-start로 온보딩을 시작하세요."
144
+ fi
145
+
146
+ # Check Sub-PRD coverage (grill completeness)
147
+ if [ -z "$SSOT_WARNING" ] && [ -f "$PRD_FILE" ]; then
148
+ # Count features in PRD index that have no Sub-PRD link
149
+ FEATURE_COUNT=$(grep -cE '^\|.*\|.*\|' "$PRD_FILE" 2>/dev/null || echo "0")
150
+ SUBPRD_DIR="$PROJECT_ROOT/.timsquad/ssot/prd"
151
+ SUBPRD_COUNT=0
152
+ if [ -d "$SUBPRD_DIR" ]; then
153
+ SUBPRD_COUNT=$(find "$SUBPRD_DIR" -name "*.md" -not -name "_template.md" 2>/dev/null | wc -l | tr -d ' ')
154
+ fi
155
+ if [ "$FEATURE_COUNT" -gt 2 ] && [ "$SUBPRD_COUNT" -eq 0 ] 2>/dev/null; then
156
+ SSOT_WARNING="[SSOT] PRD에 기능이 정의되었으나 Sub-PRD가 없습니다. /tsq-grill로 각 기능을 상세화하세요."
157
+ fi
158
+ fi
159
+
160
+ # ── 5. Skill Verification reminder (max 3 skills) ──
161
+ VERIFICATION=""
162
+ SKILLS_DIR="$PROJECT_ROOT/.claude/skills"
163
+ if [ -d "$SKILLS_DIR" ]; then
164
+ SKILL_COUNT=0
165
+ for SKILL_DIR in "$SKILLS_DIR"/*/; do
166
+ [ "$SKILL_COUNT" -ge 3 ] && break
167
+ SKILL_FILE="$SKILL_DIR/SKILL.md"
168
+ [ ! -f "$SKILL_FILE" ] && continue
169
+
170
+ SKILL_NAME=$(basename "$SKILL_DIR")
171
+ # Skip non-active/template skills
172
+ case "$SKILL_NAME" in _template|tsq-cli|main-session-constraints) continue ;; esac
173
+
174
+ # Extract Verification section (2 lines max)
175
+ CHECKS=$(awk '/^## Verification/{capture=1; next} /^## /{capture=0} capture && /\|.*\|.*\|/ && !/Check.*Command/' "$SKILL_FILE" 2>/dev/null | head -2)
176
+ if [ -n "$CHECKS" ]; then
177
+ VERIFICATION="$VERIFICATION
178
+ [Skill Verification] $SKILL_NAME: $CHECKS"
179
+ SKILL_COUNT=$((SKILL_COUNT + 1))
180
+ fi
181
+ done
182
+ fi
183
+
184
+ # ── 6. Combine and output ──
83
185
  # BLOCK_REASON이 있으면 decision:block으로 강제 속행 (세션 컨텍스트 포함)
84
186
  if [ -n "$BLOCK_REASON" ]; then
85
187
  FULL_REASON="$BLOCK_REASON"
86
- [ -n "$SESSION_CTX" ] && FULL_REASON="$BLOCK_REASON
188
+ [ -n "$SESSION_CTX" ] && FULL_REASON="$FULL_REASON
87
189
  $SESSION_CTX"
190
+ [ -n "$SSOT_WARNING" ] && FULL_REASON="$FULL_REASON
191
+ $SSOT_WARNING"
192
+ [ -n "$VERIFICATION" ] && FULL_REASON="$FULL_REASON
193
+ $VERIFICATION"
88
194
  jq -n --arg reason "$FULL_REASON" '{"decision": "block", "reason": $reason}'
89
- elif [ -n "$SESSION_CTX" ]; then
90
- jq -n --arg msg "$SESSION_CTX" '{"systemMessage": $msg}'
195
+ elif [ -n "$SESSION_CTX" ] || [ -n "$VERIFICATION" ] || [ -n "$TEST_WARNING" ] || [ -n "$SSOT_WARNING" ]; then
196
+ FULL_MSG=""
197
+ [ -n "$SESSION_CTX" ] && FULL_MSG="$SESSION_CTX"
198
+ if [ -n "$SSOT_WARNING" ]; then
199
+ [ -n "$FULL_MSG" ] && FULL_MSG="$FULL_MSG
200
+ $SSOT_WARNING" || FULL_MSG="$SSOT_WARNING"
201
+ fi
202
+ if [ -n "$TEST_WARNING" ]; then
203
+ [ -n "$FULL_MSG" ] && FULL_MSG="$FULL_MSG
204
+ $TEST_WARNING" || FULL_MSG="$TEST_WARNING"
205
+ fi
206
+ if [ -n "$VERIFICATION" ]; then
207
+ [ -n "$FULL_MSG" ] && FULL_MSG="$FULL_MSG
208
+ $VERIFICATION" || FULL_MSG="$VERIFICATION"
209
+ fi
210
+ jq -n --arg msg "$FULL_MSG" '{"systemMessage": $msg}'
91
211
  else
92
212
  echo '{}'
93
213
  fi
@@ -0,0 +1,95 @@
1
+ #!/bin/bash
2
+ # Context Restore — SessionStart (compact) Hook
3
+ # 컴팩션 후 핵심 컨텍스트를 재주입하여 에이전트 맥락 유실을 방지한다.
4
+ #
5
+ # Input: JSON via stdin (Claude Code hook protocol)
6
+ # Output: JSON with systemMessage (컨텍스트 재주입)
7
+
8
+ set -e
9
+
10
+ # Find project root
11
+ PROJECT_ROOT="$(pwd)"
12
+ while [ "$PROJECT_ROOT" != "/" ]; do
13
+ if [ -d "$PROJECT_ROOT/.timsquad" ]; then
14
+ break
15
+ fi
16
+ PROJECT_ROOT="$(dirname "$PROJECT_ROOT")"
17
+ done
18
+
19
+ if [ ! -d "$PROJECT_ROOT/.timsquad" ]; then
20
+ exit 0
21
+ fi
22
+
23
+ # Build context summary
24
+ CONTEXT=""
25
+
26
+ # 1. Project name from config
27
+ PROJECT_NAME=""
28
+ CONFIG_FILE="$PROJECT_ROOT/.timsquad/config.yaml"
29
+ if [ -f "$CONFIG_FILE" ]; then
30
+ PROJECT_NAME=$(grep -m1 'name:' "$CONFIG_FILE" 2>/dev/null | awk '{print $2}' || echo "")
31
+ fi
32
+
33
+ if [ -n "$PROJECT_NAME" ]; then
34
+ CONTEXT="[Context Restore] Project: $PROJECT_NAME"
35
+ else
36
+ CONTEXT="[Context Restore] TimSquad project"
37
+ fi
38
+
39
+ # 2. Current phase
40
+ PHASE_FILE="$PROJECT_ROOT/.timsquad/state/current-phase.json"
41
+ if [ -f "$PHASE_FILE" ]; then
42
+ CURRENT_PHASE=$(jq -r '.current // .current_phase // .phase // "unknown"' "$PHASE_FILE" 2>/dev/null || echo "unknown")
43
+ CONTEXT="$CONTEXT | Phase: $CURRENT_PHASE"
44
+ fi
45
+
46
+ # 3. Read compact summary if exists (saved by pre-compact.sh)
47
+ COMPACT_SUMMARY="$PROJECT_ROOT/.timsquad/.daemon/compact-summary.md"
48
+ if [ -f "$COMPACT_SUMMARY" ]; then
49
+ SUMMARY_CONTENT=$(head -10 "$COMPACT_SUMMARY" 2>/dev/null || echo "")
50
+ if [ -n "$SUMMARY_CONTENT" ]; then
51
+ CONTEXT="$CONTEXT
52
+ $SUMMARY_CONTENT"
53
+ fi
54
+ fi
55
+
56
+ # 4. Phase Memory (이전 Phase 요약)
57
+ PHASE_MEMORY="$PROJECT_ROOT/.timsquad/state/phase-memory.md"
58
+ if [ -f "$PHASE_MEMORY" ]; then
59
+ MEMORY_CONTENT=$(head -50 "$PHASE_MEMORY" 2>/dev/null || echo "")
60
+ if [ -n "$MEMORY_CONTENT" ]; then
61
+ CONTEXT="$CONTEXT
62
+ [Phase Memory]
63
+ $MEMORY_CONTENT"
64
+ fi
65
+ fi
66
+
67
+ # 5. SSOT readiness check
68
+ PRD_FILE="$PROJECT_ROOT/.timsquad/ssot/prd.md"
69
+ if [ -f "$PRD_FILE" ]; then
70
+ TOTAL_LINES=$(wc -l < "$PRD_FILE" 2>/dev/null || echo "0")
71
+ PLACEHOLDER_LINES=$(grep -ciE 'TBD|\[Resource Name\]|\[프로젝트|example\.com|placeholder' "$PRD_FILE" 2>/dev/null || echo "0")
72
+ TOTAL_LINES=${TOTAL_LINES:-0}
73
+ PLACEHOLDER_LINES=${PLACEHOLDER_LINES:-0}
74
+ if [ "$TOTAL_LINES" -gt 0 ] && [ "$((PLACEHOLDER_LINES * 100 / TOTAL_LINES))" -ge 50 ] 2>/dev/null; then
75
+ CONTEXT="$CONTEXT
76
+ [SSOT] PRD 미작성. /tsq-start로 온보딩을 진행하세요 (PRD + /tsq-grill 인터뷰)."
77
+ fi
78
+ elif [ -d "$PROJECT_ROOT/.timsquad/ssot" ]; then
79
+ CONTEXT="$CONTEXT
80
+ [SSOT] PRD 없음. /tsq-start로 온보딩을 시작하세요."
81
+ fi
82
+
83
+ # 6. Key constraints (3 lines max)
84
+ CONTEXT="$CONTEXT
85
+ [Key Constraints] 구현 전 검증 기준 명시. 작업 지시 시 SSOT + 데몬 사전조건 확인."
86
+
87
+ # Output as systemMessage
88
+ jq -n --arg msg "$CONTEXT" '{
89
+ hookSpecificOutput: {
90
+ hookEventName: "SessionStart",
91
+ systemMessage: $msg
92
+ }
93
+ }'
94
+
95
+ exit 0
@@ -0,0 +1,70 @@
1
+ #!/usr/bin/env bash
2
+ # e2e-commit-gate.sh — Pre-commit hook: validates E2E marker before allowing commit
3
+ # Checks: JSON marker exists, valid format, source_hash matches, not expired
4
+ #
5
+ # Exit 0 = allow commit, Exit 1 = block commit
6
+
7
+ set -euo pipefail
8
+
9
+ MARKER_FILE=".e2e-passed"
10
+
11
+ # No marker = no E2E tests configured, allow
12
+ if [ ! -f "$MARKER_FILE" ]; then
13
+ exit 0
14
+ fi
15
+
16
+ # Try to parse as JSON; if not JSON, treat as bare touch (legacy fallback)
17
+ if ! command -v jq >/dev/null 2>&1; then
18
+ echo "Warning: jq not installed, skipping E2E marker validation"
19
+ exit 0
20
+ fi
21
+
22
+ # Attempt JSON parse
23
+ if ! jq empty "$MARKER_FILE" 2>/dev/null; then
24
+ # Bare touch file (legacy) — allow with warning
25
+ echo "Warning: .e2e-passed is not JSON format. Consider running E2E tests with e2e-marker.sh"
26
+ exit 0
27
+ fi
28
+
29
+ # Validate required fields
30
+ EXIT_CODE=$(jq -r '.exit_code // empty' "$MARKER_FILE")
31
+ SOURCE_HASH=$(jq -r '.source_hash // empty' "$MARKER_FILE")
32
+ EXPIRES_AT=$(jq -r '.expires_at // empty' "$MARKER_FILE")
33
+
34
+ # exit_code must be 0
35
+ if [ -n "$EXIT_CODE" ] && [ "$EXIT_CODE" -ne 0 ]; then
36
+ echo "E2E commit gate: BLOCKED — marker shows exit_code=$EXIT_CODE (tests failed)"
37
+ exit 1
38
+ fi
39
+
40
+ # source_hash check
41
+ if [ -n "$SOURCE_HASH" ] && [ "$SOURCE_HASH" != "unknown" ]; then
42
+ CURRENT_HASH=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
43
+ if [ "$SOURCE_HASH" != "$CURRENT_HASH" ]; then
44
+ echo "E2E commit gate: WARNING — marker source_hash ($SOURCE_HASH) != current HEAD ($CURRENT_HASH)"
45
+ echo " E2E tests may be stale. Consider re-running."
46
+ fi
47
+ fi
48
+
49
+ # Expiry check
50
+ if [ -n "$EXPIRES_AT" ]; then
51
+ EXPIRES_EPOCH=$(date -u -j -f "%Y-%m-%dT%H:%M:%SZ" "$EXPIRES_AT" +%s 2>/dev/null || \
52
+ date -u -d "$EXPIRES_AT" +%s 2>/dev/null || echo "0")
53
+ NOW_EPOCH=$(date -u +%s)
54
+ if [ "$EXPIRES_EPOCH" -gt 0 ] && [ "$NOW_EPOCH" -gt "$EXPIRES_EPOCH" ]; then
55
+ echo "E2E commit gate: BLOCKED — marker expired at $EXPIRES_AT"
56
+ echo " Re-run E2E tests to refresh the marker."
57
+ exit 1
58
+ fi
59
+ fi
60
+
61
+ # All checks passed
62
+ PASSED=$(jq -r '.passed // 0' "$MARKER_FILE")
63
+ FLAKY=$(jq -r '.flaky // 0' "$MARKER_FILE")
64
+ if [ "$FLAKY" -gt 0 ]; then
65
+ echo "E2E commit gate: PASSED ($PASSED tests, $FLAKY flaky — investigate flaky tests)"
66
+ else
67
+ echo "E2E commit gate: PASSED ($PASSED tests)"
68
+ fi
69
+
70
+ exit 0