timsquad 2.1.0 → 3.4.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 (438) hide show
  1. package/README.ko.md +288 -0
  2. package/README.md +170 -763
  3. package/dist/commands/compile.d.ts +3 -0
  4. package/dist/commands/compile.d.ts.map +1 -0
  5. package/dist/commands/compile.js +170 -0
  6. package/dist/commands/compile.js.map +1 -0
  7. package/dist/commands/daemon.d.ts +7 -0
  8. package/dist/commands/daemon.d.ts.map +1 -0
  9. package/dist/commands/daemon.js +229 -0
  10. package/dist/commands/daemon.js.map +1 -0
  11. package/dist/commands/feedback.d.ts +9 -0
  12. package/dist/commands/feedback.d.ts.map +1 -1
  13. package/dist/commands/feedback.js +235 -14
  14. package/dist/commands/feedback.js.map +1 -1
  15. package/dist/commands/full.js +2 -2
  16. package/dist/commands/full.js.map +1 -1
  17. package/dist/commands/init.d.ts.map +1 -1
  18. package/dist/commands/init.js +118 -22
  19. package/dist/commands/init.js.map +1 -1
  20. package/dist/commands/knowledge.d.ts +3 -0
  21. package/dist/commands/knowledge.d.ts.map +1 -0
  22. package/dist/commands/knowledge.js +316 -0
  23. package/dist/commands/knowledge.js.map +1 -0
  24. package/dist/commands/log.d.ts +27 -0
  25. package/dist/commands/log.d.ts.map +1 -1
  26. package/dist/commands/log.js +965 -0
  27. package/dist/commands/log.js.map +1 -1
  28. package/dist/commands/meta-index.d.ts +3 -0
  29. package/dist/commands/meta-index.d.ts.map +1 -0
  30. package/dist/commands/meta-index.js +401 -0
  31. package/dist/commands/meta-index.js.map +1 -0
  32. package/dist/commands/metrics.d.ts.map +1 -1
  33. package/dist/commands/metrics.js +239 -4
  34. package/dist/commands/metrics.js.map +1 -1
  35. package/dist/commands/retro.js +154 -6
  36. package/dist/commands/retro.js.map +1 -1
  37. package/dist/commands/skills.d.ts +12 -0
  38. package/dist/commands/skills.d.ts.map +1 -0
  39. package/dist/commands/skills.js +231 -0
  40. package/dist/commands/skills.js.map +1 -0
  41. package/dist/commands/upgrade.d.ts +8 -0
  42. package/dist/commands/upgrade.d.ts.map +1 -0
  43. package/dist/commands/upgrade.js +292 -0
  44. package/dist/commands/upgrade.js.map +1 -0
  45. package/dist/commands/workflow.d.ts +3 -0
  46. package/dist/commands/workflow.d.ts.map +1 -0
  47. package/dist/commands/workflow.js +607 -0
  48. package/dist/commands/workflow.js.map +1 -0
  49. package/dist/daemon/context-writer.d.ts +16 -0
  50. package/dist/daemon/context-writer.d.ts.map +1 -0
  51. package/dist/daemon/context-writer.js +35 -0
  52. package/dist/daemon/context-writer.js.map +1 -0
  53. package/dist/daemon/entry.d.ts +7 -0
  54. package/dist/daemon/entry.d.ts.map +1 -0
  55. package/dist/daemon/entry.js +17 -0
  56. package/dist/daemon/entry.js.map +1 -0
  57. package/dist/daemon/event-queue.d.ts +52 -0
  58. package/dist/daemon/event-queue.d.ts.map +1 -0
  59. package/dist/daemon/event-queue.js +255 -0
  60. package/dist/daemon/event-queue.js.map +1 -0
  61. package/dist/daemon/file-watcher.d.ts +19 -0
  62. package/dist/daemon/file-watcher.d.ts.map +1 -0
  63. package/dist/daemon/file-watcher.js +87 -0
  64. package/dist/daemon/file-watcher.js.map +1 -0
  65. package/dist/daemon/index.d.ts +29 -0
  66. package/dist/daemon/index.d.ts.map +1 -0
  67. package/dist/daemon/index.js +296 -0
  68. package/dist/daemon/index.js.map +1 -0
  69. package/dist/daemon/jsonl-watcher.d.ts +49 -0
  70. package/dist/daemon/jsonl-watcher.d.ts.map +1 -0
  71. package/dist/daemon/jsonl-watcher.js +258 -0
  72. package/dist/daemon/jsonl-watcher.js.map +1 -0
  73. package/dist/daemon/meta-cache.d.ts +63 -0
  74. package/dist/daemon/meta-cache.d.ts.map +1 -0
  75. package/dist/daemon/meta-cache.js +249 -0
  76. package/dist/daemon/meta-cache.js.map +1 -0
  77. package/dist/daemon/session-state.d.ts +19 -0
  78. package/dist/daemon/session-state.d.ts.map +1 -0
  79. package/dist/daemon/session-state.js +132 -0
  80. package/dist/daemon/session-state.js.map +1 -0
  81. package/dist/daemon/shutdown.d.ts +21 -0
  82. package/dist/daemon/shutdown.d.ts.map +1 -0
  83. package/dist/daemon/shutdown.js +164 -0
  84. package/dist/daemon/shutdown.js.map +1 -0
  85. package/dist/index.js +24 -3
  86. package/dist/index.js.map +1 -1
  87. package/dist/lib/agent-composer.d.ts +38 -0
  88. package/dist/lib/agent-composer.d.ts.map +1 -0
  89. package/dist/lib/agent-composer.js +128 -0
  90. package/dist/lib/agent-composer.js.map +1 -0
  91. package/dist/lib/agent-generator.d.ts +22 -0
  92. package/dist/lib/agent-generator.d.ts.map +1 -0
  93. package/dist/lib/agent-generator.js +150 -0
  94. package/dist/lib/agent-generator.js.map +1 -0
  95. package/dist/lib/ast-parser.d.ts +11 -0
  96. package/dist/lib/ast-parser.d.ts.map +1 -0
  97. package/dist/lib/ast-parser.js +282 -0
  98. package/dist/lib/ast-parser.js.map +1 -0
  99. package/dist/lib/compile-rules.d.ts +66 -0
  100. package/dist/lib/compile-rules.d.ts.map +1 -0
  101. package/dist/lib/compile-rules.js +114 -0
  102. package/dist/lib/compile-rules.js.map +1 -0
  103. package/dist/lib/compiler.d.ts +105 -0
  104. package/dist/lib/compiler.d.ts.map +1 -0
  105. package/dist/lib/compiler.js +368 -0
  106. package/dist/lib/compiler.js.map +1 -0
  107. package/dist/lib/config.d.ts +7 -2
  108. package/dist/lib/config.d.ts.map +1 -1
  109. package/dist/lib/config.js +34 -3
  110. package/dist/lib/config.js.map +1 -1
  111. package/dist/lib/meta-index.d.ts +19 -0
  112. package/dist/lib/meta-index.d.ts.map +1 -0
  113. package/dist/lib/meta-index.js +573 -0
  114. package/dist/lib/meta-index.js.map +1 -0
  115. package/dist/lib/project.js +1 -1
  116. package/dist/lib/project.js.map +1 -1
  117. package/dist/lib/skill-generator.d.ts +32 -0
  118. package/dist/lib/skill-generator.d.ts.map +1 -0
  119. package/dist/lib/skill-generator.js +187 -0
  120. package/dist/lib/skill-generator.js.map +1 -0
  121. package/dist/lib/template.d.ts +16 -2
  122. package/dist/lib/template.d.ts.map +1 -1
  123. package/dist/lib/template.js +115 -20
  124. package/dist/lib/template.js.map +1 -1
  125. package/dist/lib/ui-index.d.ts +12 -0
  126. package/dist/lib/ui-index.d.ts.map +1 -0
  127. package/dist/lib/ui-index.js +239 -0
  128. package/dist/lib/ui-index.js.map +1 -0
  129. package/dist/lib/ui-parser.d.ts +12 -0
  130. package/dist/lib/ui-parser.d.ts.map +1 -0
  131. package/dist/lib/ui-parser.js +472 -0
  132. package/dist/lib/ui-parser.js.map +1 -0
  133. package/dist/lib/update-check.d.ts +6 -0
  134. package/dist/lib/update-check.d.ts.map +1 -0
  135. package/dist/lib/update-check.js +121 -0
  136. package/dist/lib/update-check.js.map +1 -0
  137. package/dist/lib/upgrade-backup.d.ts +33 -0
  138. package/dist/lib/upgrade-backup.d.ts.map +1 -0
  139. package/dist/lib/upgrade-backup.js +101 -0
  140. package/dist/lib/upgrade-backup.js.map +1 -0
  141. package/dist/lib/version.d.ts +19 -0
  142. package/dist/lib/version.d.ts.map +1 -0
  143. package/dist/lib/version.js +35 -0
  144. package/dist/lib/version.js.map +1 -0
  145. package/dist/lib/workflow-state.d.ts +48 -0
  146. package/dist/lib/workflow-state.d.ts.map +1 -0
  147. package/dist/lib/workflow-state.js +67 -0
  148. package/dist/lib/workflow-state.js.map +1 -0
  149. package/dist/types/config.d.ts +103 -2
  150. package/dist/types/config.d.ts.map +1 -1
  151. package/dist/types/config.js +184 -9
  152. package/dist/types/config.js.map +1 -1
  153. package/dist/types/feedback.d.ts +7 -0
  154. package/dist/types/feedback.d.ts.map +1 -1
  155. package/dist/types/feedback.js +1 -1
  156. package/dist/types/feedback.js.map +1 -1
  157. package/dist/types/index.d.ts +3 -0
  158. package/dist/types/index.d.ts.map +1 -1
  159. package/dist/types/index.js +3 -0
  160. package/dist/types/index.js.map +1 -1
  161. package/dist/types/meta-index.d.ts +146 -0
  162. package/dist/types/meta-index.d.ts.map +1 -0
  163. package/dist/types/meta-index.js +7 -0
  164. package/dist/types/meta-index.js.map +1 -0
  165. package/dist/types/project.d.ts +19 -3
  166. package/dist/types/project.d.ts.map +1 -1
  167. package/dist/types/project.js +23 -0
  168. package/dist/types/project.js.map +1 -1
  169. package/dist/types/task-log.d.ts +208 -0
  170. package/dist/types/task-log.d.ts.map +1 -0
  171. package/dist/types/task-log.js +6 -0
  172. package/dist/types/task-log.js.map +1 -0
  173. package/dist/types/ui-meta.d.ts +118 -0
  174. package/dist/types/ui-meta.d.ts.map +1 -0
  175. package/dist/types/ui-meta.js +7 -0
  176. package/dist/types/ui-meta.js.map +1 -0
  177. package/package.json +12 -4
  178. package/templates/base/agents/base/tsq-architect.md +68 -0
  179. package/templates/base/agents/base/tsq-dba.md +56 -0
  180. package/templates/base/agents/base/tsq-designer.md +72 -0
  181. package/templates/base/agents/base/tsq-developer.md +67 -0
  182. package/templates/base/agents/base/tsq-qa.md +55 -0
  183. package/templates/base/agents/base/tsq-security.md +65 -0
  184. package/templates/base/agents/overlays/domain/general-web/_common.md +11 -0
  185. package/templates/base/agents/overlays/domain/mobile/_common.md +13 -0
  186. package/templates/base/agents/overlays/platform/claude-code.md +12 -0
  187. package/templates/base/config.template.yaml +213 -0
  188. package/templates/base/knowledge/checklists/accessibility.md +37 -0
  189. package/templates/base/knowledge/checklists/architecture-review.md +28 -0
  190. package/templates/base/knowledge/checklists/database-standards.md +84 -0
  191. package/templates/base/knowledge/checklists/design-reference.md +97 -0
  192. package/templates/base/knowledge/checklists/security.md +50 -0
  193. package/templates/base/knowledge/checklists/ssot-validation.md +19 -0
  194. package/templates/base/knowledge/domains/_template.md +16 -0
  195. package/templates/base/knowledge/platforms/_template.md +16 -0
  196. package/templates/base/knowledge/templates/sequence-report.md +44 -0
  197. package/templates/base/knowledge/templates/task-result.md +105 -0
  198. package/templates/base/skills/_template/SKILL.md +59 -0
  199. package/templates/base/skills/_template/references/_template.md +35 -0
  200. package/templates/base/skills/_template/rules/_sections.md +34 -0
  201. package/templates/base/skills/_template/rules/_template.md +32 -0
  202. package/templates/base/skills/_template/scripts/_template.sh +31 -0
  203. package/templates/base/skills/architecture/SKILL.md +54 -0
  204. package/templates/base/skills/architecture/references/adr-template.md +50 -0
  205. package/templates/base/skills/architecture/references/api-design.md +64 -0
  206. package/templates/base/skills/backend/node/SKILL.md +81 -0
  207. package/templates/base/skills/backend/node/rules/async-patterns.md +81 -0
  208. package/templates/base/skills/backend/node/rules/deployment.md +33 -0
  209. package/templates/base/skills/backend/node/rules/env-config.md +41 -0
  210. package/templates/base/skills/backend/node/rules/error-handling.md +83 -0
  211. package/templates/base/skills/backend/node/rules/hono-app-setup.md +98 -0
  212. package/templates/base/skills/backend/node/rules/jwt-auth.md +76 -0
  213. package/templates/base/skills/backend/node/rules/middleware.md +56 -0
  214. package/templates/base/skills/backend/node/rules/testing.md +82 -0
  215. package/templates/base/skills/coding/SKILL.md +47 -0
  216. package/templates/base/skills/coding/rules/patterns.md +81 -0
  217. package/templates/base/skills/controller/SKILL.md +111 -0
  218. package/templates/base/skills/controller/references/README.md +35 -0
  219. package/templates/base/skills/controller/rules/README.md +18 -0
  220. package/templates/base/skills/database/SKILL.md +98 -0
  221. package/templates/base/skills/database/prisma/SKILL.md +57 -0
  222. package/templates/base/skills/database/prisma/rules/queries.md +133 -0
  223. package/templates/base/skills/database/prisma/rules/schema-design.md +80 -0
  224. package/templates/base/skills/frontend/nextjs/SKILL.md +59 -0
  225. package/templates/base/skills/frontend/nextjs/rules/app-router.md +138 -0
  226. package/templates/base/skills/frontend/react/SKILL.md +86 -0
  227. package/templates/base/skills/frontend/react/rules/_sections.md +88 -0
  228. package/templates/base/skills/frontend/react/rules/anti-patterns.md +67 -0
  229. package/templates/base/skills/frontend/react/rules/async-api-routes.md +38 -0
  230. package/templates/base/skills/frontend/react/rules/async-defer-await.md +80 -0
  231. package/templates/base/skills/frontend/react/rules/async-dependencies.md +36 -0
  232. package/templates/base/skills/frontend/react/rules/async-parallel.md +28 -0
  233. package/templates/base/skills/frontend/react/rules/async-suspense-boundaries.md +99 -0
  234. package/templates/base/skills/frontend/react/rules/bundle-barrel-imports.md +59 -0
  235. package/templates/base/skills/frontend/react/rules/bundle-defer-third-party.md +49 -0
  236. package/templates/base/skills/frontend/react/rules/bundle-dynamic-imports.md +35 -0
  237. package/templates/base/skills/frontend/react/rules/component-conventions.md +74 -0
  238. package/templates/base/skills/frontend/react/rules/js-combine-iterations.md +32 -0
  239. package/templates/base/skills/frontend/react/rules/js-early-exit.md +50 -0
  240. package/templates/base/skills/frontend/react/rules/js-index-maps.md +37 -0
  241. package/templates/base/skills/frontend/react/rules/js-set-map-lookups.md +24 -0
  242. package/templates/base/skills/frontend/react/rules/rendering-conditional-render.md +40 -0
  243. package/templates/base/skills/frontend/react/rules/rendering-content-visibility.md +38 -0
  244. package/templates/base/skills/frontend/react/rules/rendering-hoist-jsx.md +46 -0
  245. package/templates/base/skills/frontend/react/rules/rerender-defer-reads.md +39 -0
  246. package/templates/base/skills/frontend/react/rules/rerender-derived-state.md +29 -0
  247. package/templates/base/skills/frontend/react/rules/rerender-memo.md +44 -0
  248. package/templates/base/skills/frontend/react/rules/rerender-transitions.md +40 -0
  249. package/templates/base/skills/frontend/react/rules/server-after-nonblocking.md +73 -0
  250. package/templates/base/skills/frontend/react/rules/server-cache-react.md +26 -0
  251. package/templates/base/skills/frontend/react/rules/server-parallel-fetching.md +79 -0
  252. package/templates/base/skills/frontend/react/rules/state-location.md +55 -0
  253. package/templates/base/skills/methodology/bdd/SKILL.md +69 -0
  254. package/templates/base/skills/methodology/bdd/rules/gherkin-patterns.md +113 -0
  255. package/templates/base/skills/methodology/ddd/SKILL.md +74 -0
  256. package/templates/base/skills/methodology/ddd/rules/strategic-patterns.md +98 -0
  257. package/templates/base/skills/methodology/debugging/SKILL.md +60 -0
  258. package/templates/base/skills/methodology/debugging/references/root-cause-tracing.md +84 -0
  259. package/templates/base/skills/methodology/tdd/SKILL.md +66 -0
  260. package/templates/base/skills/methodology/tdd/rules/real-world-example.md +88 -0
  261. package/templates/base/skills/methodology/tdd/rules/techniques.md +185 -0
  262. package/templates/base/skills/mobile/dart/SKILL.md +69 -0
  263. package/templates/base/skills/mobile/dart/rules/async-patterns.md +112 -0
  264. package/templates/base/skills/mobile/dart/rules/code-style.md +96 -0
  265. package/templates/base/skills/mobile/dart/rules/null-safety.md +84 -0
  266. package/templates/base/skills/mobile/dart/rules/type-system.md +111 -0
  267. package/templates/base/skills/mobile/flutter/SKILL.md +89 -0
  268. package/templates/base/skills/mobile/flutter/ci-cd/SKILL.md +82 -0
  269. package/templates/base/skills/mobile/flutter/ci-cd/references/ci-cd-pipeline.md +314 -0
  270. package/templates/base/skills/mobile/flutter/ci-cd/rules/code-signing.md +106 -0
  271. package/templates/base/skills/mobile/flutter/ci-cd/rules/codemagic-setup.md +116 -0
  272. package/templates/base/skills/mobile/flutter/ci-cd/rules/fastlane-setup.md +105 -0
  273. package/templates/base/skills/mobile/flutter/ci-cd/rules/github-actions.md +112 -0
  274. package/templates/base/skills/mobile/flutter/ci-cd/rules/store-deployment.md +106 -0
  275. package/templates/base/skills/mobile/flutter/ci-cd/rules/versioning.md +107 -0
  276. package/templates/base/skills/mobile/flutter/i18n/SKILL.md +78 -0
  277. package/templates/base/skills/mobile/flutter/i18n/references/i18n-architecture.md +225 -0
  278. package/templates/base/skills/mobile/flutter/i18n/rules/arb-files.md +182 -0
  279. package/templates/base/skills/mobile/flutter/i18n/rules/locale-switching.md +226 -0
  280. package/templates/base/skills/mobile/flutter/i18n/rules/localization-setup.md +137 -0
  281. package/templates/base/skills/mobile/flutter/i18n/rules/plural-gender.md +159 -0
  282. package/templates/base/skills/mobile/flutter/i18n/rules/text-direction.md +199 -0
  283. package/templates/base/skills/mobile/flutter/monitoring/SKILL.md +81 -0
  284. package/templates/base/skills/mobile/flutter/monitoring/references/monitoring-architecture.md +269 -0
  285. package/templates/base/skills/mobile/flutter/monitoring/rules/analytics.md +227 -0
  286. package/templates/base/skills/mobile/flutter/monitoring/rules/crashlytics-setup.md +195 -0
  287. package/templates/base/skills/mobile/flutter/monitoring/rules/logging.md +258 -0
  288. package/templates/base/skills/mobile/flutter/monitoring/rules/performance-monitoring.md +248 -0
  289. package/templates/base/skills/mobile/flutter/monitoring/rules/sentry-integration.md +249 -0
  290. package/templates/base/skills/mobile/flutter/networking/SKILL.md +88 -0
  291. package/templates/base/skills/mobile/flutter/networking/references/api-client-architecture.md +305 -0
  292. package/templates/base/skills/mobile/flutter/networking/rules/caching.md +212 -0
  293. package/templates/base/skills/mobile/flutter/networking/rules/connectivity.md +213 -0
  294. package/templates/base/skills/mobile/flutter/networking/rules/dio-setup.md +159 -0
  295. package/templates/base/skills/mobile/flutter/networking/rules/error-handling.md +209 -0
  296. package/templates/base/skills/mobile/flutter/networking/rules/interceptors.md +205 -0
  297. package/templates/base/skills/mobile/flutter/networking/rules/retrofit-patterns.md +194 -0
  298. package/templates/base/skills/mobile/flutter/push-notifications/SKILL.md +87 -0
  299. package/templates/base/skills/mobile/flutter/push-notifications/references/notification-architecture.md +340 -0
  300. package/templates/base/skills/mobile/flutter/push-notifications/references/platform-setup.md +286 -0
  301. package/templates/base/skills/mobile/flutter/push-notifications/rules/background-processing.md +308 -0
  302. package/templates/base/skills/mobile/flutter/push-notifications/rules/deep-linking.md +217 -0
  303. package/templates/base/skills/mobile/flutter/push-notifications/rules/fcm-setup.md +164 -0
  304. package/templates/base/skills/mobile/flutter/push-notifications/rules/local-notifications.md +262 -0
  305. package/templates/base/skills/mobile/flutter/push-notifications/rules/notification-handling.md +210 -0
  306. package/templates/base/skills/mobile/flutter/push-notifications/rules/notification-permissions.md +246 -0
  307. package/templates/base/skills/mobile/flutter/push-notifications/rules/rich-notifications.md +320 -0
  308. package/templates/base/skills/mobile/flutter/references/freezed-patterns.md +162 -0
  309. package/templates/base/skills/mobile/flutter/references/project-structure.md +170 -0
  310. package/templates/base/skills/mobile/flutter/rules/animations.md +112 -0
  311. package/templates/base/skills/mobile/flutter/rules/architecture.md +121 -0
  312. package/templates/base/skills/mobile/flutter/rules/navigation-routing.md +117 -0
  313. package/templates/base/skills/mobile/flutter/rules/performance.md +112 -0
  314. package/templates/base/skills/mobile/flutter/rules/platform-adaptive.md +126 -0
  315. package/templates/base/skills/mobile/flutter/rules/state-management.md +110 -0
  316. package/templates/base/skills/mobile/flutter/rules/testing.md +131 -0
  317. package/templates/base/skills/mobile/flutter/rules/widget-conventions.md +122 -0
  318. package/templates/base/skills/mobile/flutter/security/SKILL.md +86 -0
  319. package/templates/base/skills/mobile/flutter/security/references/mobile-security-checklist.md +168 -0
  320. package/templates/base/skills/mobile/flutter/security/rules/api-key-protection.md +206 -0
  321. package/templates/base/skills/mobile/flutter/security/rules/authentication.md +248 -0
  322. package/templates/base/skills/mobile/flutter/security/rules/data-protection.md +271 -0
  323. package/templates/base/skills/mobile/flutter/security/rules/obfuscation.md +213 -0
  324. package/templates/base/skills/mobile/flutter/security/rules/secure-storage.md +171 -0
  325. package/templates/base/skills/mobile/flutter/security/rules/ssl-pinning.md +197 -0
  326. package/templates/base/skills/planning/SKILL.md +58 -0
  327. package/templates/base/skills/planning/references/prd-guide.md +47 -0
  328. package/templates/base/skills/planning/references/requirements-guide.md +46 -0
  329. package/templates/base/skills/prompt-engineering/SKILL.md +103 -0
  330. package/templates/base/skills/retrospective/SKILL.md +102 -0
  331. package/templates/base/skills/security/SKILL.md +55 -0
  332. package/templates/base/skills/security/rules/owasp-examples.md +119 -0
  333. package/templates/base/skills/security/scripts/check-secrets.sh +55 -0
  334. package/templates/base/skills/testing/SKILL.md +63 -0
  335. package/templates/base/skills/testing/references/testing-patterns.md +103 -0
  336. package/templates/base/skills/tsq-protocol/SKILL.md +51 -0
  337. package/templates/base/skills/typescript/SKILL.md +67 -0
  338. package/templates/base/skills/typescript/rules/type-patterns.md +135 -0
  339. package/templates/base/skills/typescript/rules/utility-types.md +76 -0
  340. package/templates/base/skills/ui-design/SKILL.md +70 -0
  341. package/templates/{common → base}/timsquad/feedback/routing-rules.yaml +1 -1
  342. package/templates/{common → base}/timsquad/retrospective/metrics/metrics-schema.json +46 -1
  343. package/templates/platforms/claude-code/CLAUDE.md.template +89 -0
  344. package/templates/platforms/claude-code/rules/adr-rules.md +32 -0
  345. package/templates/platforms/claude-code/rules/feedback-routing.md +18 -0
  346. package/templates/platforms/claude-code/rules/phase-management.md +23 -0
  347. package/templates/platforms/claude-code/rules/reporting-format.md +26 -0
  348. package/templates/platforms/claude-code/rules/sequence-management.md +72 -0
  349. package/templates/platforms/claude-code/rules/workspace-sync.md +33 -0
  350. package/templates/platforms/claude-code/scripts/completion-guard.sh +57 -0
  351. package/templates/platforms/claude-code/scripts/phase-guard.sh +79 -0
  352. package/templates/platforms/claude-code/settings.json +98 -0
  353. package/templates/project-types/api-backend/config.yaml +227 -0
  354. package/templates/project-types/api-backend/process/workflow.xml +214 -0
  355. package/templates/project-types/fintech/config.yaml +151 -0
  356. package/templates/project-types/fintech/process/workflow.xml +316 -0
  357. package/templates/project-types/infra/config.yaml +327 -0
  358. package/templates/project-types/infra/process/workflow.xml +296 -0
  359. package/templates/project-types/mobile-app/config.yaml +123 -0
  360. package/templates/project-types/mobile-app/process/workflow.xml +191 -0
  361. package/templates/project-types/platform/config.yaml +254 -0
  362. package/templates/project-types/platform/process/workflow.xml +254 -0
  363. package/templates/project-types/web-app/config.yaml +198 -0
  364. package/templates/project-types/web-app/process/workflow.xml +210 -0
  365. package/templates/project-types/web-service/config.yaml +136 -0
  366. package/templates/project-types/web-service/process/workflow.xml +184 -0
  367. package/templates/common/CLAUDE.md.template +0 -254
  368. package/templates/common/claude/agents/tsq-dba.md +0 -311
  369. package/templates/common/claude/agents/tsq-designer.md +0 -323
  370. package/templates/common/claude/agents/tsq-developer.md +0 -177
  371. package/templates/common/claude/agents/tsq-planner.md +0 -190
  372. package/templates/common/claude/agents/tsq-prompter.md +0 -356
  373. package/templates/common/claude/agents/tsq-qa.md +0 -168
  374. package/templates/common/claude/agents/tsq-retro.md +0 -193
  375. package/templates/common/claude/agents/tsq-security.md +0 -221
  376. package/templates/common/claude/hooks/auto-metrics.sh +0 -165
  377. package/templates/common/claude/hooks/auto-worklog.sh +0 -245
  378. package/templates/common/claude/hooks/event-logger.sh +0 -208
  379. package/templates/common/claude/settings.json +0 -86
  380. package/templates/common/claude/skills/architecture/SKILL.md +0 -123
  381. package/templates/common/claude/skills/backend/node/SKILL.md +0 -1015
  382. package/templates/common/claude/skills/coding/SKILL.md +0 -171
  383. package/templates/common/claude/skills/database/prisma/SKILL.md +0 -357
  384. package/templates/common/claude/skills/frontend/nextjs/SKILL.md +0 -279
  385. package/templates/common/claude/skills/frontend/react/SKILL.md +0 -1729
  386. package/templates/common/claude/skills/methodology/bdd/SKILL.md +0 -234
  387. package/templates/common/claude/skills/methodology/ddd/SKILL.md +0 -311
  388. package/templates/common/claude/skills/methodology/tdd/SKILL.md +0 -512
  389. package/templates/common/claude/skills/planning/SKILL.md +0 -90
  390. package/templates/common/claude/skills/security/SKILL.md +0 -234
  391. package/templates/common/claude/skills/testing/SKILL.md +0 -146
  392. package/templates/common/claude/skills/typescript/SKILL.md +0 -435
  393. package/templates/common/config.template.yaml +0 -132
  394. /package/templates/{common → base}/timsquad/architectures/clean/ARCHITECTURE.md +0 -0
  395. /package/templates/{common → base}/timsquad/architectures/clean/backend.xml +0 -0
  396. /package/templates/{common → base}/timsquad/architectures/clean/frontend.xml +0 -0
  397. /package/templates/{common → base}/timsquad/architectures/fsd/ARCHITECTURE.md +0 -0
  398. /package/templates/{common → base}/timsquad/architectures/fsd/frontend.xml +0 -0
  399. /package/templates/{common → base}/timsquad/architectures/hexagonal/ARCHITECTURE.md +0 -0
  400. /package/templates/{common → base}/timsquad/architectures/hexagonal/backend.xml +0 -0
  401. /package/templates/{common → base}/timsquad/constraints/competency-framework.xml +0 -0
  402. /package/templates/{common → base}/timsquad/constraints/ssot-schema.xml +0 -0
  403. /package/templates/{common → base}/timsquad/feedback/feedback-router.sh +0 -0
  404. /package/templates/{common → base}/timsquad/generators/data-design.xml +0 -0
  405. /package/templates/{common → base}/timsquad/generators/prd.xml +0 -0
  406. /package/templates/{common → base}/timsquad/generators/requirements.xml +0 -0
  407. /package/templates/{common → base}/timsquad/generators/service-spec.xml +0 -0
  408. /package/templates/{common → base}/timsquad/logs/_example.md +0 -0
  409. /package/templates/{common → base}/timsquad/logs/_template.md +0 -0
  410. /package/templates/{common → base}/timsquad/patterns/cqrs.xml +0 -0
  411. /package/templates/{common → base}/timsquad/patterns/event-sourcing.xml +0 -0
  412. /package/templates/{common → base}/timsquad/patterns/repository.xml +0 -0
  413. /package/templates/{common → base}/timsquad/process/phase-checklist.yaml +0 -0
  414. /package/templates/{common → base}/timsquad/process/state-machine.xml +0 -0
  415. /package/templates/{common → base}/timsquad/process/validation-rules.xml +0 -0
  416. /package/templates/{common → base}/timsquad/process/workflow-base.xml +0 -0
  417. /package/templates/{common → base}/timsquad/retrospective/cycle-report.template.md +0 -0
  418. /package/templates/{common → base}/timsquad/retrospective/patterns/failure-patterns.md +0 -0
  419. /package/templates/{common → base}/timsquad/retrospective/patterns/success-patterns.md +0 -0
  420. /package/templates/{common → base}/timsquad/retrospective/retrospective-config.xml +0 -0
  421. /package/templates/{common → base}/timsquad/retrospective/retrospective-state.xml +0 -0
  422. /package/templates/{common → base}/timsquad/ssot/adr/ADR-000-template.md +0 -0
  423. /package/templates/{common → base}/timsquad/ssot/adr/ADR-001-example.md +0 -0
  424. /package/templates/{common → base}/timsquad/ssot/data-design.template.md +0 -0
  425. /package/templates/{common → base}/timsquad/ssot/deployment-spec.template.md +0 -0
  426. /package/templates/{common → base}/timsquad/ssot/env-config.template.md +0 -0
  427. /package/templates/{common → base}/timsquad/ssot/error-codes.template.md +0 -0
  428. /package/templates/{common → base}/timsquad/ssot/functional-spec.template.md +0 -0
  429. /package/templates/{common → base}/timsquad/ssot/glossary.template.md +0 -0
  430. /package/templates/{common → base}/timsquad/ssot/integration-spec.template.md +0 -0
  431. /package/templates/{common → base}/timsquad/ssot/planning.template.md +0 -0
  432. /package/templates/{common → base}/timsquad/ssot/prd.template.md +0 -0
  433. /package/templates/{common → base}/timsquad/ssot/requirements.template.md +0 -0
  434. /package/templates/{common → base}/timsquad/ssot/security-spec.template.md +0 -0
  435. /package/templates/{common → base}/timsquad/ssot/service-spec.template.md +0 -0
  436. /package/templates/{common → base}/timsquad/ssot/test-spec.template.md +0 -0
  437. /package/templates/{common → base}/timsquad/ssot/ui-ux-spec.template.md +0 -0
  438. /package/templates/{common → base}/timsquad/state/workspace.xml +0 -0
@@ -0,0 +1,41 @@
1
+ ---
2
+ title: Environment Config
3
+ impact: HIGH
4
+ tags: config, zod, env
5
+ ---
6
+
7
+ ## Environment Config (Zod Validation)
8
+
9
+ 앱 시작 시 환경변수를 Zod로 검증. 잘못된 설정이면 즉시 종료.
10
+
11
+ ```typescript
12
+ // src/config/index.ts
13
+ import { z } from 'zod';
14
+
15
+ const envSchema = z.object({
16
+ NODE_ENV: z.enum(['development', 'production', 'test']).default('development'),
17
+ PORT: z.coerce.number().default(3000),
18
+ HOST: z.string().default('0.0.0.0'),
19
+
20
+ DATABASE_URL: z.string().url(),
21
+
22
+ JWT_SECRET: z.string().min(32, 'JWT_SECRET must be at least 32 characters'),
23
+ JWT_REFRESH_SECRET: z.string().min(32),
24
+
25
+ REDIS_URL: z.string().url().optional(),
26
+ SENTRY_DSN: z.string().url().optional(),
27
+
28
+ ENABLE_SWAGGER: z.coerce.boolean().default(false),
29
+ });
30
+
31
+ const parseResult = envSchema.safeParse(process.env);
32
+
33
+ if (!parseResult.success) {
34
+ console.error('Invalid environment variables:', parseResult.error.format());
35
+ process.exit(1);
36
+ }
37
+
38
+ export const config = parseResult.data;
39
+ // config.PORT → number (타입 안전)
40
+ // config.REDIS_URL → string | undefined
41
+ ```
@@ -0,0 +1,83 @@
1
+ ---
2
+ title: Error Handling
3
+ impact: CRITICAL
4
+ tags: error, handler, AppError
5
+ ---
6
+
7
+ ## Error Handling
8
+
9
+ ### Custom Error Hierarchy
10
+
11
+ ```typescript
12
+ // src/shared/errors/base-error.ts
13
+ export class AppError extends Error {
14
+ constructor(
15
+ public readonly code: string,
16
+ message: string,
17
+ public readonly statusCode: number = 500,
18
+ public readonly details?: Record<string, unknown>,
19
+ ) {
20
+ super(message);
21
+ this.name = 'AppError';
22
+ Error.captureStackTrace(this, this.constructor);
23
+ }
24
+
25
+ toJSON() {
26
+ return {
27
+ code: this.code,
28
+ message: this.message,
29
+ ...(this.details && { details: this.details }),
30
+ };
31
+ }
32
+ }
33
+
34
+ export class NotFoundError extends AppError {
35
+ constructor(resource: string, id?: string) {
36
+ super(`${resource.toUpperCase()}_NOT_FOUND`, id ? `${resource} with id ${id} not found` : `${resource} not found`, 404);
37
+ }
38
+ }
39
+
40
+ export class ValidationError extends AppError {
41
+ constructor(message: string, details?: Record<string, unknown>) {
42
+ super('VALIDATION_ERROR', message, 400, details);
43
+ }
44
+ }
45
+
46
+ export class UnauthorizedError extends AppError {
47
+ constructor(message = 'Unauthorized') { super('UNAUTHORIZED', message, 401); }
48
+ }
49
+
50
+ export class ForbiddenError extends AppError {
51
+ constructor(message = 'Forbidden') { super('FORBIDDEN', message, 403); }
52
+ }
53
+ ```
54
+
55
+ ### Global Error Handler
56
+
57
+ ```typescript
58
+ // src/interface/middleware/error-handler.ts
59
+ export function errorHandler(err: Error, c: Context) {
60
+ console.error('[Error]', { name: err.name, message: err.message,
61
+ stack: process.env.NODE_ENV === 'development' ? err.stack : undefined });
62
+
63
+ if (err instanceof AppError) {
64
+ return c.json({ success: false, error: err.toJSON() }, err.statusCode as any);
65
+ }
66
+ if (err instanceof HTTPException) {
67
+ return c.json({ success: false, error: { code: 'HTTP_ERROR', message: err.message } }, err.status);
68
+ }
69
+ if (err instanceof ZodError) {
70
+ return c.json({ success: false, error: { code: 'VALIDATION_ERROR', message: 'Request validation failed',
71
+ details: err.errors.map(e => ({ path: e.path.join('.'), message: e.message })) } }, 400);
72
+ }
73
+ // Prisma P2002 (duplicate) → 409, P2025 (not found) → 404
74
+ if (err.name === 'PrismaClientKnownRequestError') {
75
+ const p = err as any;
76
+ if (p.code === 'P2002') return c.json({ success: false, error: { code: 'DUPLICATE_ENTRY', message: 'Resource already exists' } }, 409);
77
+ if (p.code === 'P2025') return c.json({ success: false, error: { code: 'NOT_FOUND', message: 'Resource not found' } }, 404);
78
+ }
79
+
80
+ return c.json({ success: false, error: { code: 'INTERNAL_ERROR',
81
+ message: process.env.NODE_ENV === 'production' ? 'Internal server error' : err.message } }, 500);
82
+ }
83
+ ```
@@ -0,0 +1,98 @@
1
+ ---
2
+ title: Hono App Setup
3
+ impact: CRITICAL
4
+ tags: hono, setup, routes, zod
5
+ ---
6
+
7
+ ## Hono App Setup
8
+
9
+ ### App Configuration
10
+
11
+ ```typescript
12
+ // src/app.ts
13
+ import { Hono } from 'hono';
14
+ import { cors } from 'hono/cors';
15
+ import { logger } from 'hono/logger';
16
+ import { secureHeaders } from 'hono/secure-headers';
17
+ import { timing } from 'hono/timing';
18
+ import { userRoutes } from './interface/routes/user.routes';
19
+ import { errorHandler } from './interface/middleware/error-handler';
20
+
21
+ const app = new Hono();
22
+
23
+ // 글로벌 미들웨어
24
+ app.use('*', logger());
25
+ app.use('*', timing());
26
+ app.use('*', secureHeaders());
27
+ app.use('*', cors({
28
+ origin: ['http://localhost:3000', 'https://example.com'],
29
+ allowMethods: ['GET', 'POST', 'PUT', 'DELETE'],
30
+ allowHeaders: ['Content-Type', 'Authorization'],
31
+ credentials: true,
32
+ }));
33
+
34
+ // 헬스 체크
35
+ app.get('/health', (c) => c.json({ status: 'ok', timestamp: new Date().toISOString() }));
36
+
37
+ // 라우트 마운트
38
+ app.route('/api/v1/users', userRoutes);
39
+
40
+ // 에러 핸들러
41
+ app.onError(errorHandler);
42
+
43
+ // 404
44
+ app.notFound((c) => {
45
+ return c.json({ success: false, error: { code: 'NOT_FOUND', message: 'Route not found' } }, 404);
46
+ });
47
+
48
+ export default app;
49
+ ```
50
+
51
+ ### Typed Routes with zValidator
52
+
53
+ ```typescript
54
+ // src/interface/routes/user.routes.ts
55
+ import { Hono } from 'hono';
56
+ import { zValidator } from '@hono/zod-validator';
57
+
58
+ type Variables = { userId: string };
59
+ const userRoutes = new Hono<{ Variables: Variables }>();
60
+
61
+ userRoutes.use('*', authMiddleware);
62
+
63
+ // 일관된 응답 형식: { success, data, error, pagination }
64
+ userRoutes.get('/', async (c) => {
65
+ const page = Number(c.req.query('page') || '1');
66
+ const limit = Number(c.req.query('limit') || '10');
67
+ const result = await UserService.findAll({ page, limit });
68
+
69
+ return c.json({
70
+ success: true,
71
+ data: result.users,
72
+ pagination: { page, limit, total: result.total, totalPages: Math.ceil(result.total / limit) },
73
+ });
74
+ });
75
+
76
+ userRoutes.post('/', zValidator('json', createUserSchema), async (c) => {
77
+ const data = c.req.valid('json');
78
+ const user = await UserService.create(data);
79
+ return c.json({ success: true, data: user }, 201);
80
+ });
81
+ ```
82
+
83
+ ### Zod Validation Schemas
84
+
85
+ ```typescript
86
+ // src/interface/validators/user.validator.ts
87
+ import { z } from 'zod';
88
+
89
+ export const createUserSchema = z.object({
90
+ email: z.string().email('올바른 이메일 형식이 아닙니다'),
91
+ name: z.string().min(2).max(50),
92
+ password: z.string().min(8).regex(/[A-Z]/, '대문자 필요').regex(/[0-9]/, '숫자 필요'),
93
+ role: z.enum(['USER', 'ADMIN']).default('USER'),
94
+ });
95
+
96
+ export const updateUserSchema = createUserSchema.partial().omit({ password: true });
97
+ export type CreateUserDto = z.infer<typeof createUserSchema>;
98
+ ```
@@ -0,0 +1,76 @@
1
+ ---
2
+ title: JWT Authentication
3
+ impact: HIGH
4
+ tags: jwt, auth, rbac, cookie
5
+ ---
6
+
7
+ ## JWT Authentication
8
+
9
+ ### Middleware + RBAC
10
+
11
+ ```typescript
12
+ // src/interface/middleware/auth.ts
13
+ import { jwt } from 'hono/jwt';
14
+ import { HTTPException } from 'hono/http-exception';
15
+
16
+ interface JWTPayload {
17
+ sub: string; email: string; role: 'USER' | 'ADMIN'; iat: number; exp: number;
18
+ }
19
+
20
+ export const authMiddleware = jwt({ secret: config.JWT_SECRET });
21
+
22
+ export function requireRole(...roles: Array<'USER' | 'ADMIN'>) {
23
+ return async (c: Context, next: Next) => {
24
+ const payload = c.get('jwtPayload') as JWTPayload;
25
+ if (!payload || !roles.includes(payload.role)) {
26
+ throw new HTTPException(403, { message: 'Insufficient permissions' });
27
+ }
28
+ c.set('userId', payload.sub);
29
+ await next();
30
+ };
31
+ }
32
+ ```
33
+
34
+ ### Token Generation
35
+
36
+ ```typescript
37
+ import { sign } from 'hono/jwt';
38
+
39
+ export async function generateTokens(user: { id: string; email: string; role: string }) {
40
+ const now = Math.floor(Date.now() / 1000);
41
+ const accessToken = await sign(
42
+ { sub: user.id, email: user.email, role: user.role, iat: now, exp: now + 60 * 15 }, // 15min
43
+ config.JWT_SECRET
44
+ );
45
+ const refreshToken = await sign(
46
+ { sub: user.id, type: 'refresh', iat: now, exp: now + 60 * 60 * 24 * 7 }, // 7days
47
+ config.JWT_REFRESH_SECRET
48
+ );
49
+ return { accessToken, refreshToken };
50
+ }
51
+ ```
52
+
53
+ ### Login/Refresh Flow
54
+
55
+ ```typescript
56
+ // Refresh Token은 HttpOnly 쿠키로 관리
57
+ authRoutes.post('/login', zValidator('json', loginSchema), async (c) => {
58
+ const { email, password } = c.req.valid('json');
59
+ const user = await UserService.verifyCredentials(email, password);
60
+ if (!user) throw new AppError('AUTH_001', 'Invalid credentials', 401);
61
+
62
+ const { accessToken, refreshToken } = await generateTokens(user);
63
+
64
+ setCookie(c, 'refreshToken', refreshToken, {
65
+ httpOnly: true, secure: process.env.NODE_ENV === 'production',
66
+ sameSite: 'Strict', maxAge: 60 * 60 * 24 * 7, path: '/api/v1/auth',
67
+ });
68
+
69
+ return c.json({ success: true, data: { accessToken, user: { id: user.id, email: user.email, name: user.name } } });
70
+ });
71
+
72
+ authRoutes.post('/logout', (c) => {
73
+ deleteCookie(c, 'refreshToken', { path: '/api/v1/auth' });
74
+ return c.json({ success: true, message: 'Logged out' });
75
+ });
76
+ ```
@@ -0,0 +1,56 @@
1
+ ---
2
+ title: Middleware Patterns
3
+ impact: MEDIUM
4
+ tags: middleware, rate-limit, logging
5
+ ---
6
+
7
+ ## Middleware Patterns
8
+
9
+ ### Rate Limiting
10
+
11
+ ```typescript
12
+ // src/interface/middleware/rate-limit.ts
13
+ import { rateLimiter } from 'hono-rate-limiter';
14
+
15
+ // 일반 API (분당 100회)
16
+ export const apiRateLimiter = rateLimiter({
17
+ windowMs: 60 * 1000,
18
+ limit: 100,
19
+ standardHeaders: 'draft-6',
20
+ keyGenerator: (c) => c.req.header('x-forwarded-for') || 'unknown',
21
+ message: { success: false, error: { code: 'RATE_LIMIT', message: 'Too many requests' } },
22
+ });
23
+
24
+ // 인증 (분당 5회)
25
+ export const authRateLimiter = rateLimiter({
26
+ windowMs: 60 * 1000,
27
+ limit: 5,
28
+ keyGenerator: (c) => `auth:${c.req.header('x-forwarded-for') || 'unknown'}`,
29
+ message: { success: false, error: { code: 'AUTH_RATE_LIMIT', message: 'Too many login attempts' } },
30
+ });
31
+ ```
32
+
33
+ ### Request Logging (Structured)
34
+
35
+ ```typescript
36
+ // src/interface/middleware/logger.ts
37
+ export async function requestLogger(c: Context, next: Next) {
38
+ const start = Date.now();
39
+ const requestId = crypto.randomUUID();
40
+
41
+ c.set('requestId', requestId);
42
+ c.header('X-Request-ID', requestId);
43
+
44
+ console.log(JSON.stringify({
45
+ type: 'request', requestId,
46
+ method: c.req.method, path: c.req.path, ip: c.req.header('x-forwarded-for') || 'unknown',
47
+ }));
48
+
49
+ await next();
50
+
51
+ console.log(JSON.stringify({
52
+ type: 'response', requestId,
53
+ method: c.req.method, path: c.req.path, status: c.res.status, duration: Date.now() - start,
54
+ }));
55
+ }
56
+ ```
@@ -0,0 +1,82 @@
1
+ ---
2
+ title: Testing Patterns
3
+ impact: MEDIUM
4
+ tags: testing, vitest, hono
5
+ ---
6
+
7
+ ## Testing Patterns
8
+
9
+ ### Hono API Test (app.request)
10
+
11
+ ```typescript
12
+ // src/interface/routes/user.routes.test.ts
13
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
14
+ import app from '../../app';
15
+
16
+ describe('User Routes', () => {
17
+ describe('GET /api/v1/users/:id', () => {
18
+ it('사용자를 조회한다', async () => {
19
+ const res = await app.request('/api/v1/users/user-123', {
20
+ method: 'GET',
21
+ headers: { Authorization: 'Bearer valid-token' },
22
+ });
23
+
24
+ expect(res.status).toBe(200);
25
+ const json = await res.json();
26
+ expect(json.success).toBe(true);
27
+ expect(json.data).toHaveProperty('id', 'user-123');
28
+ });
29
+
30
+ it('존재하지 않는 사용자는 404', async () => {
31
+ const res = await app.request('/api/v1/users/not-exist', {
32
+ method: 'GET',
33
+ headers: { Authorization: 'Bearer valid-token' },
34
+ });
35
+
36
+ expect(res.status).toBe(404);
37
+ expect((await res.json()).error.code).toBe('USER_NOT_FOUND');
38
+ });
39
+ });
40
+
41
+ describe('POST /api/v1/users', () => {
42
+ it('유효하지 않은 이메일은 400', async () => {
43
+ const res = await app.request('/api/v1/users', {
44
+ method: 'POST',
45
+ headers: { 'Content-Type': 'application/json', Authorization: 'Bearer valid-token' },
46
+ body: JSON.stringify({ email: 'invalid', name: 'Test', password: 'Password123' }),
47
+ });
48
+
49
+ expect(res.status).toBe(400);
50
+ expect((await res.json()).error.code).toBe('VALIDATION_ERROR');
51
+ });
52
+ });
53
+ });
54
+ ```
55
+
56
+ ### Service Unit Test (Mock Repository)
57
+
58
+ ```typescript
59
+ // src/domain/user/service.test.ts
60
+ const mockRepository: UserRepository = {
61
+ findById: vi.fn(), findByEmail: vi.fn(), create: vi.fn(), update: vi.fn(), delete: vi.fn(),
62
+ };
63
+
64
+ describe('UserService', () => {
65
+ let service: UserService;
66
+ beforeEach(() => { vi.clearAllMocks(); service = new UserService(mockRepository); });
67
+
68
+ it('존재하는 사용자를 반환', async () => {
69
+ const mockUser = { id: '1', email: 'test@example.com', name: 'Test' };
70
+ vi.mocked(mockRepository.findById).mockResolvedValue(mockUser);
71
+
72
+ const result = await service.findById('1');
73
+ expect(result).toEqual(mockUser);
74
+ expect(mockRepository.findById).toHaveBeenCalledWith('1');
75
+ });
76
+
77
+ it('존재하지 않으면 NotFoundError', async () => {
78
+ vi.mocked(mockRepository.findById).mockResolvedValue(null);
79
+ await expect(service.findById('x')).rejects.toThrow(NotFoundError);
80
+ });
81
+ });
82
+ ```
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: coding
3
+ description: 코드 작성 규칙 및 패턴 가이드라인
4
+ version: "1.0.0"
5
+ tags: [coding, conventions, naming]
6
+ user-invocable: false
7
+ ---
8
+
9
+ # Coding Guidelines
10
+
11
+ ## 네이밍 규칙
12
+
13
+ | 대상 | 규칙 | 예시 |
14
+ |------|------|------|
15
+ | 클래스 | PascalCase | `UserService`, `OrderRepository` |
16
+ | 함수/메서드 | camelCase | `getUserById`, `calculateTotal` |
17
+ | 변수 | camelCase | `userName`, `totalAmount` |
18
+ | 상수 | UPPER_SNAKE | `MAX_RETRY_COUNT`, `API_BASE_URL` |
19
+ | 파일 | kebab-case | `user-service.ts`, `order-repository.ts` |
20
+
21
+ ## 함수 원칙
22
+ - **단일 책임**: 함수는 한 가지 일만 수행
23
+ - **명확한 이름**: 함수 이름만으로 동작 파악 가능
24
+ - **적절한 크기**: 20줄 이내 권장
25
+
26
+ ## Rules
27
+
28
+ ### 필수
29
+ - 함수가 단일 책임을 가지는가
30
+ - 네이밍이 명확하고 일관적인가
31
+ - 에러가 명시적으로 처리되는가
32
+
33
+ ### 금지
34
+ - `any` 타입 사용
35
+ - 매직 넘버/문자열 사용
36
+ - `console.log` 사용 (logger 사용)
37
+
38
+ ## Checklist
39
+ - [ ] 함수가 단일 책임
40
+ - [ ] 네이밍이 명확하고 일관적
41
+ - [ ] 에러가 명시적으로 처리됨
42
+ - [ ] any 타입 없음
43
+ - [ ] 매직 넘버/문자열 없음
44
+ - [ ] console.log 없음
45
+
46
+ ## 참조
47
+ - `rules/patterns.md` — Error Handling, Repository, DTO/Entity, 의존성 주입, Anti-Patterns
@@ -0,0 +1,81 @@
1
+ ---
2
+ title: Coding Patterns & Anti-Patterns
3
+ impact: HIGH
4
+ tags: coding, patterns, error-handling
5
+ ---
6
+
7
+ # Coding Patterns & Anti-Patterns
8
+
9
+ ## Error Handling
10
+
11
+ ```typescript
12
+ // Good: 명시적 에러 처리
13
+ async function getUser(id: string): Promise<User> {
14
+ const user = await userRepository.findById(id);
15
+ if (!user) throw new NotFoundError('USER_NOT_FOUND', `User ${id} not found`);
16
+ return user;
17
+ }
18
+
19
+ // Bad: 에러 무시
20
+ async function getUser(id: string): Promise<User | null> {
21
+ try { return await userRepository.findById(id); }
22
+ catch { return null; } // 에러 원인 알 수 없음
23
+ }
24
+ ```
25
+
26
+ ## Repository Pattern
27
+
28
+ ```typescript
29
+ interface UserRepository {
30
+ findById(id: string): Promise<User | null>;
31
+ findByEmail(email: string): Promise<User | null>;
32
+ save(user: User): Promise<User>;
33
+ delete(id: string): Promise<void>;
34
+ }
35
+
36
+ class PostgresUserRepository implements UserRepository {
37
+ async findById(id: string): Promise<User | null> { /* PostgreSQL 구현 */ }
38
+ }
39
+ ```
40
+
41
+ ## DTO/Entity 분리
42
+
43
+ ```typescript
44
+ // Entity (도메인)
45
+ class User {
46
+ constructor(
47
+ public readonly id: string,
48
+ public email: string,
49
+ public passwordHash: string, // 민감 정보
50
+ ) {}
51
+ }
52
+
53
+ // DTO (외부 노출)
54
+ interface UserResponseDto {
55
+ id: string;
56
+ email: string;
57
+ // passwordHash 제외
58
+ }
59
+ ```
60
+
61
+ ## 의존성 주입
62
+
63
+ ```typescript
64
+ // Good
65
+ class UserService {
66
+ constructor(private userRepository: UserRepository) {}
67
+ }
68
+
69
+ // Bad
70
+ class UserService {
71
+ private userRepository = new PostgresUserRepository(); // 하드코딩
72
+ }
73
+ ```
74
+
75
+ ## Anti-Patterns
76
+
77
+ | 이름 | Bad | Good |
78
+ |------|-----|------|
79
+ | any 타입 | `function process(data: any)` | `function process<T>(data: T)` |
80
+ | 매직 넘버 | `if (status === 1)` | `if (status === Status.ACTIVE)` |
81
+ | 콘솔 로그 | `console.log('user:', user)` | `logger.debug('User fetched', { userId })` |
@@ -0,0 +1,111 @@
1
+ ---
2
+ name: controller
3
+ description: |
4
+ Context DI 컨테이너. 서브에이전트 위임 시 compiled spec을 의존성으로 주입.
5
+ 서브에이전트 호출, Task() 위임, 에이전트 실행 시 자동 트리거.
6
+ Use when: "구현해줘", "테스트해줘", "리뷰해줘", "설계해줘", 서브에이전트 위임
7
+ version: "1.0.0"
8
+ tags: [controller, di, context-injection]
9
+ user-invocable: false
10
+ ---
11
+
12
+ # Controller (Context DI Container)
13
+
14
+ 서브에이전트에게 작업을 위임할 때 필요한 컨텍스트를 자동으로 해석하고 주입하는 컨테이너.
15
+ 에이전트가 "스스로 찾아 읽기"가 아닌 "주입받아 바로 시작"하도록 보장.
16
+
17
+ ## Delegation Process
18
+
19
+ 서브에이전트 위임 시 반드시 이 순서를 따른다:
20
+
21
+ 1. **에이전트 파일 확인**: `.claude/agents/{agent}.md` 읽기
22
+ 2. **Prerequisites 파싱**: `<prerequisites>` 태그에서 필요 SSOT 목록 추출
23
+ 3. **Spec Resolve**: `controller/references/`에서 해당 compiled spec 로드
24
+ 4. **Phase 제약 로드**: `controller/rules/`에서 현재 phase 제약 확인
25
+ 5. **Stale 체크**: `.compile-manifest.json`의 hash와 현재 SSOT hash 비교
26
+ 6. **프롬프트 조합**: tsq-protocol + resolved specs + phase 제약 + 태스크 지시
27
+ 7. **Task() 호출**: 조합된 프롬프트로 서브에이전트 실행
28
+
29
+ ## Spec Resolution
30
+
31
+ ```
32
+ 에이전트 prerequisites → controller references/
33
+ ─────────────────────────────────────────────────────────
34
+ service-spec.md → references/*.spec.md (endpoint별)
35
+ data-design.md → references/*.spec.md (entity별)
36
+ error-codes.md → references/error-codes.spec.md
37
+ ```
38
+
39
+ 필요한 spec 전체가 아닌 **태스크에 관련된 섹션만** 주입한다.
40
+ 예: "로그인 API 구현" → `references/2-1-로그인.spec.md`만 주입.
41
+
42
+ ## Stale Detection
43
+
44
+ Spec 주입 전 `.compile-manifest.json`을 확인한다:
45
+
46
+ - hash 일치 → 최신. 주입 진행.
47
+ - hash 불일치 → 사용자에게 `tsq compile` 재실행을 제안.
48
+ - manifest 없음 → 사용자에게 `tsq compile` 최초 실행을 안내.
49
+
50
+ ## Task Prompt Template
51
+
52
+ ```
53
+ [MODE: {phase}] [TASK: {task_id}] [SPEC: {primary_spec}]
54
+
55
+ [tsq-protocol 기본 규칙]
56
+
57
+ [현재 Phase 제약]
58
+ - 허용: {allowed_actions}
59
+ - 금지: {forbidden_actions}
60
+
61
+ [Compiled Spec]
62
+ {injected_spec_content}
63
+
64
+ [태스크 지시]
65
+ task_id: {task_id}
66
+ description: {description}
67
+ ```
68
+
69
+ ## Mode Declaration
70
+
71
+ 서브에이전트는 **매 응답 첫 줄**에 모드 선언을 출력해야 한다:
72
+
73
+ ```
74
+ [MODE: IMPLEMENTATION] [TASK: P3-S001-T001] [SPEC: 2-1-로그인.spec.md]
75
+ ```
76
+
77
+ <mode-declaration>
78
+ <rules>
79
+ <must>응답 시작 시 [MODE: {phase}] [TASK: {task_id}] [SPEC: {spec}] 선언</must>
80
+ <must>phase는 current-phase.json 기준 (planning/design/implementation/review)</must>
81
+ <must>SPEC은 주입받은 primary spec 파일명</must>
82
+ </rules>
83
+ <rationale>
84
+ 컨텍스트 압축(compaction) 후에도 에이전트가 자신의 역할·제약·참조 spec을
85
+ 매 응답마다 재확인한다. Rationalization Prevention의 자연스러운 확장.
86
+ </rationale>
87
+ </mode-declaration>
88
+
89
+ ## Rationalization Prevention
90
+
91
+ <rationalization-prevention>
92
+
93
+ | 에이전트의 변명 | 현실 |
94
+ |----------------|------|
95
+ | "이 태스크는 간단해서 spec 없이 가능" | 간단함은 주관적. spec이 있으면 반드시 참조 |
96
+ | "spec이 오래된 것 같아서 직접 판단" | spec 신선도는 controller가 판단. 주입받은 spec을 따를 것 |
97
+ | "이미 비슷한 코드가 있으니 참고만 하면 됨" | 기존 코드가 spec과 일치하는지 알 수 없음. spec 기준 |
98
+ | "테스트는 나중에 한번에 돌리는 게 효율적" | 각 태스크 완료 시 테스트 통과가 완료 조건 |
99
+ | "사용자가 빨리 해달라고 했으니 절차 생략" | 절차는 품질 보장. 절차를 따르는 것이 결과적으로 빠름 |
100
+
101
+ </rationalization-prevention>
102
+
103
+ ## Checklist
104
+
105
+ | Priority | Item |
106
+ |----------|------|
107
+ | CRITICAL | 서브에이전트 위임 전 spec resolve 완료 |
108
+ | CRITICAL | compiled spec의 stale 여부 확인 |
109
+ | HIGH | phase 제약이 프롬프트에 포함됨 |
110
+ | HIGH | tsq-protocol이 프롬프트에 포함됨 |
111
+ | MEDIUM | 태스크에 관련된 섹션만 선별 주입 (전체 주입 지양) |