timsquad 3.6.0 → 3.7.1

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 (433) hide show
  1. package/README.ko.md +103 -113
  2. package/README.md +100 -110
  3. package/dist/commands/init.js +4 -8
  4. package/dist/commands/init.js.map +1 -1
  5. package/dist/commands/{upgrade.d.ts → update.d.ts} +3 -3
  6. package/dist/commands/update.d.ts.map +1 -0
  7. package/dist/commands/{upgrade.js → update.js} +12 -17
  8. package/dist/commands/update.js.map +1 -0
  9. package/dist/daemon/event-queue.d.ts +3 -11
  10. package/dist/daemon/event-queue.d.ts.map +1 -1
  11. package/dist/daemon/event-queue.js +62 -203
  12. package/dist/daemon/event-queue.js.map +1 -1
  13. package/dist/daemon/index.d.ts +1 -1
  14. package/dist/daemon/index.d.ts.map +1 -1
  15. package/dist/daemon/index.js +15 -14
  16. package/dist/daemon/index.js.map +1 -1
  17. package/dist/index.js +3 -43
  18. package/dist/index.js.map +1 -1
  19. package/dist/lib/agent-generator.d.ts.map +1 -1
  20. package/dist/lib/agent-generator.js +10 -10
  21. package/dist/lib/agent-generator.js.map +1 -1
  22. package/dist/lib/compile-rules.d.ts.map +1 -1
  23. package/dist/lib/compile-rules.js +37 -4
  24. package/dist/lib/compile-rules.js.map +1 -1
  25. package/dist/lib/compiler.d.ts +1 -0
  26. package/dist/lib/compiler.d.ts.map +1 -1
  27. package/dist/lib/compiler.js +67 -11
  28. package/dist/lib/compiler.js.map +1 -1
  29. package/dist/{commands/log.d.ts → lib/log-utils.d.ts} +7 -15
  30. package/dist/lib/log-utils.d.ts.map +1 -0
  31. package/dist/lib/log-utils.js +347 -0
  32. package/dist/lib/log-utils.js.map +1 -0
  33. package/dist/lib/skill-generator.d.ts.map +1 -1
  34. package/dist/lib/skill-generator.js +4 -44
  35. package/dist/lib/skill-generator.js.map +1 -1
  36. package/dist/lib/ssot-map.d.ts.map +1 -1
  37. package/dist/lib/ssot-map.js +3 -0
  38. package/dist/lib/ssot-map.js.map +1 -1
  39. package/dist/lib/template.d.ts +10 -3
  40. package/dist/lib/template.d.ts.map +1 -1
  41. package/dist/lib/template.js +142 -22
  42. package/dist/lib/template.js.map +1 -1
  43. package/dist/lib/upgrade-backup.js +1 -1
  44. package/dist/lib/upgrade-backup.js.map +1 -1
  45. package/dist/types/config.d.ts.map +1 -1
  46. package/dist/types/config.js +37 -34
  47. package/dist/types/config.js.map +1 -1
  48. package/dist/types/feedback.d.ts +1 -54
  49. package/dist/types/feedback.d.ts.map +1 -1
  50. package/dist/types/feedback.js +1 -22
  51. package/dist/types/feedback.js.map +1 -1
  52. package/dist/types/project.d.ts +5 -0
  53. package/dist/types/project.d.ts.map +1 -1
  54. package/dist/types/project.js +15 -0
  55. package/dist/types/project.js.map +1 -1
  56. package/dist/types/ssot-map.d.ts +2 -0
  57. package/dist/types/ssot-map.d.ts.map +1 -1
  58. package/package.json +1 -1
  59. package/templates/base/agents/base/tsq-architect.md +1 -1
  60. package/templates/base/agents/base/tsq-dba.md +3 -1
  61. package/templates/base/agents/base/tsq-designer.md +3 -1
  62. package/templates/base/agents/base/tsq-developer.md +3 -1
  63. package/templates/base/agents/base/tsq-librarian.md +1 -1
  64. package/templates/base/agents/base/tsq-qa.md +3 -1
  65. package/templates/base/agents/base/tsq-security.md +3 -1
  66. package/templates/base/agents/overlays/platform/claude-code.md +2 -2
  67. package/templates/base/config.template.yaml +17 -28
  68. package/templates/base/knowledge/templates/task-result.md +5 -10
  69. package/templates/base/skills/_template/SKILL.md +1 -3
  70. package/templates/base/skills/{architecture → tsq-architecture}/SKILL.md +2 -2
  71. package/templates/base/skills/tsq-audit/SKILL.md +74 -0
  72. package/templates/base/skills/{methodology/bdd → tsq-bdd}/SKILL.md +14 -9
  73. package/templates/base/skills/{coding → tsq-coding}/SKILL.md +2 -4
  74. package/templates/base/skills/tsq-controller/SKILL.md +81 -0
  75. package/templates/base/skills/{mobile/dart → tsq-dart}/SKILL.md +5 -3
  76. package/templates/base/skills/{database → tsq-database}/SKILL.md +5 -2
  77. package/templates/base/skills/{methodology/ddd → tsq-ddd}/SKILL.md +15 -10
  78. package/templates/base/skills/{methodology/debugging → tsq-debugging}/SKILL.md +2 -2
  79. package/templates/base/skills/tsq-decompose/SKILL.md +117 -0
  80. package/templates/base/skills/tsq-delete/SKILL.md +72 -0
  81. package/templates/base/skills/{mobile/flutter → tsq-flutter}/SKILL.md +6 -3
  82. package/templates/base/skills/tsq-full/SKILL.md +67 -0
  83. package/templates/base/skills/tsq-grill/SKILL.md +86 -0
  84. package/templates/base/skills/{backend/node → tsq-hono}/SKILL.md +6 -4
  85. package/templates/base/skills/tsq-librarian/SKILL.md +78 -0
  86. package/templates/base/skills/tsq-log/SKILL.md +30 -0
  87. package/templates/base/skills/{frontend/nextjs → tsq-nextjs}/SKILL.md +14 -9
  88. package/templates/base/skills/{planning → tsq-planning}/SKILL.md +2 -2
  89. package/templates/base/skills/{database/prisma → tsq-prisma}/SKILL.md +15 -9
  90. package/templates/base/skills/{product-audit → tsq-product-audit}/SKILL.md +2 -4
  91. package/templates/base/skills/{prompt-engineering → tsq-prompt}/SKILL.md +6 -4
  92. package/templates/base/skills/tsq-protocol/SKILL.md +85 -33
  93. package/templates/base/skills/tsq-quick/SKILL.md +58 -0
  94. package/templates/base/skills/{frontend/react → tsq-react}/SKILL.md +6 -3
  95. package/templates/base/skills/tsq-retro/SKILL.md +86 -0
  96. package/templates/base/skills/tsq-retro/references/feedback-guide.md +58 -0
  97. package/templates/base/skills/tsq-retro/references/improve-protocol.md +87 -0
  98. package/templates/base/skills/{security → tsq-security}/SKILL.md +2 -4
  99. package/templates/base/skills/{spec → tsq-spec}/SKILL.md +4 -6
  100. package/templates/base/skills/{stability-verification → tsq-stability}/SKILL.md +3 -3
  101. package/templates/base/skills/tsq-start/SKILL.md +90 -0
  102. package/templates/base/skills/tsq-start/references/onboarding-questions.md +177 -0
  103. package/templates/base/skills/tsq-status/SKILL.md +32 -0
  104. package/templates/base/skills/{methodology/tdd → tsq-tdd}/SKILL.md +6 -3
  105. package/templates/base/skills/{testing → tsq-testing}/SKILL.md +5 -7
  106. package/templates/base/skills/{typescript → tsq-typescript}/SKILL.md +2 -2
  107. package/templates/base/skills/{ui-design → tsq-ui}/SKILL.md +2 -2
  108. package/templates/base/skills/tsq-update/SKILL.md +48 -0
  109. package/templates/base/timsquad/constraints/competency-framework.xml +2 -2
  110. package/templates/base/timsquad/constraints/ssot-schema.xml +2 -2
  111. package/templates/base/timsquad/process/phase-checklist.yaml +1 -1
  112. package/templates/base/timsquad/process/state-machine.xml +2 -2
  113. package/templates/base/timsquad/process/validation-rules.xml +8 -8
  114. package/templates/base/timsquad/process/workflow-base.xml +8 -8
  115. package/templates/base/timsquad/retrospective/cycle-report.template.md +2 -2
  116. package/templates/base/timsquad/retrospective/patterns/failure-patterns.md +1 -1
  117. package/templates/base/timsquad/retrospective/patterns/success-patterns.md +2 -2
  118. package/templates/base/timsquad/retrospective/retrospective-state.xml +2 -2
  119. package/templates/base/timsquad/ssot/audit-trail-spec.template.md +155 -0
  120. package/templates/base/timsquad/ssot/compliance-matrix.template.md +105 -0
  121. package/templates/base/timsquad/ssot/component-map.template.md +181 -0
  122. package/templates/base/timsquad/ssot/data-design.template.md +4 -4
  123. package/templates/base/timsquad/ssot/deployment-spec.template.md +29 -22
  124. package/templates/base/timsquad/ssot/env-config.template.md +4 -2
  125. package/templates/base/timsquad/ssot/error-codes.template.md +3 -3
  126. package/templates/base/timsquad/ssot/functional-spec.template.md +40 -3
  127. package/templates/base/timsquad/ssot/glossary.template.md +2 -2
  128. package/templates/base/timsquad/ssot/infra-topology.template.md +191 -0
  129. package/templates/base/timsquad/ssot/integration-spec.template.md +2 -2
  130. package/templates/base/timsquad/ssot/monitoring-spec.template.md +185 -0
  131. package/templates/base/timsquad/ssot/navigation-map.template.md +154 -0
  132. package/templates/base/timsquad/ssot/performance-budget.template.md +132 -0
  133. package/templates/base/timsquad/ssot/planning.template.md +3 -3
  134. package/templates/base/timsquad/ssot/prd/_template.md +73 -0
  135. package/templates/base/timsquad/ssot/prd.template.md +10 -21
  136. package/templates/base/timsquad/ssot/requirements.template.md +3 -3
  137. package/templates/base/timsquad/ssot/sdk-spec.template.md +223 -0
  138. package/templates/base/timsquad/ssot/service-spec.template.md +3 -3
  139. package/templates/base/timsquad/ssot/state-machine.template.md +127 -0
  140. package/templates/base/timsquad/ssot/ui-ux-spec.template.md +43 -3
  141. package/templates/base/timsquad/ssot-map.template.yaml +28 -0
  142. package/templates/base/timsquad/state/workspace.xml +11 -11
  143. package/templates/platforms/claude-code/rules/adr-rules.md +1 -1
  144. package/templates/platforms/claude-code/rules/build-gate.md +1 -1
  145. package/templates/platforms/claude-code/rules/completion-verification.md +0 -2
  146. package/templates/platforms/claude-code/rules/context-monitor.md +1 -1
  147. package/templates/platforms/claude-code/rules/feedback-routing.md +2 -2
  148. package/templates/platforms/claude-code/rules/phase-management.md +2 -2
  149. package/templates/platforms/claude-code/rules/plan-review.md +2 -2
  150. package/templates/platforms/claude-code/rules/quality-guards.md +0 -2
  151. package/templates/platforms/claude-code/rules/sequence-management.md +15 -15
  152. package/templates/platforms/claude-code/rules/session-notes.md +1 -1
  153. package/templates/platforms/claude-code/rules/workspace-sync.md +1 -1
  154. package/templates/platforms/claude-code/scripts/build-gate.sh +6 -1
  155. package/templates/platforms/claude-code/scripts/change-scope-guard.sh +1 -4
  156. package/templates/platforms/claude-code/scripts/check-capability.sh +68 -0
  157. package/templates/platforms/claude-code/scripts/completion-guard.sh +62 -4
  158. package/templates/platforms/claude-code/scripts/context-restore.sh +33 -6
  159. package/templates/platforms/claude-code/scripts/phase-guard.sh +2 -5
  160. package/templates/platforms/claude-code/scripts/pre-compact.sh +3 -3
  161. package/templates/platforms/claude-code/scripts/safe-guard.sh +2 -5
  162. package/templates/platforms/claude-code/scripts/subagent-start.sh +11 -0
  163. package/templates/platforms/claude-code/scripts/subagent-stop.sh +11 -0
  164. package/templates/platforms/claude-code/settings.json +20 -74
  165. package/templates/project-types/api-backend/config.yaml +9 -5
  166. package/templates/project-types/api-backend/process/workflow.xml +2 -2
  167. package/templates/project-types/fintech/config.yaml +13 -19
  168. package/templates/project-types/fintech/ssot/audit-trail-spec.template.md +207 -0
  169. package/templates/project-types/fintech/ssot/compliance-matrix.template.md +187 -0
  170. package/templates/project-types/infra/config.yaml +7 -4
  171. package/templates/project-types/infra/process/workflow.xml +3 -3
  172. package/templates/project-types/mobile-app/config.yaml +8 -14
  173. package/templates/project-types/mobile-app/process/workflow.xml +4 -4
  174. package/templates/project-types/platform/config.yaml +8 -5
  175. package/templates/project-types/platform/process/workflow.xml +3 -3
  176. package/templates/project-types/web-app/config.yaml +9 -15
  177. package/templates/project-types/web-app/process/workflow.xml +6 -6
  178. package/templates/project-types/web-service/config.yaml +10 -19
  179. package/templates/project-types/web-service/process/workflow.xml +6 -6
  180. package/dist/commands/audit.d.ts +0 -22
  181. package/dist/commands/audit.d.ts.map +0 -1
  182. package/dist/commands/audit.js +0 -233
  183. package/dist/commands/audit.js.map +0 -1
  184. package/dist/commands/compile.d.ts +0 -3
  185. package/dist/commands/compile.d.ts.map +0 -1
  186. package/dist/commands/compile.js +0 -251
  187. package/dist/commands/compile.js.map +0 -1
  188. package/dist/commands/feedback.d.ts +0 -12
  189. package/dist/commands/feedback.d.ts.map +0 -1
  190. package/dist/commands/feedback.js +0 -382
  191. package/dist/commands/feedback.js.map +0 -1
  192. package/dist/commands/full.d.ts +0 -3
  193. package/dist/commands/full.d.ts.map +0 -1
  194. package/dist/commands/full.js +0 -88
  195. package/dist/commands/full.js.map +0 -1
  196. package/dist/commands/git/commit.d.ts +0 -3
  197. package/dist/commands/git/commit.d.ts.map +0 -1
  198. package/dist/commands/git/commit.js +0 -85
  199. package/dist/commands/git/commit.js.map +0 -1
  200. package/dist/commands/git/index.d.ts +0 -5
  201. package/dist/commands/git/index.d.ts.map +0 -1
  202. package/dist/commands/git/index.js +0 -5
  203. package/dist/commands/git/index.js.map +0 -1
  204. package/dist/commands/git/pr.d.ts +0 -3
  205. package/dist/commands/git/pr.d.ts.map +0 -1
  206. package/dist/commands/git/pr.js +0 -139
  207. package/dist/commands/git/pr.js.map +0 -1
  208. package/dist/commands/git/release.d.ts +0 -3
  209. package/dist/commands/git/release.d.ts.map +0 -1
  210. package/dist/commands/git/release.js +0 -153
  211. package/dist/commands/git/release.js.map +0 -1
  212. package/dist/commands/git/sync.d.ts +0 -3
  213. package/dist/commands/git/sync.d.ts.map +0 -1
  214. package/dist/commands/git/sync.js +0 -132
  215. package/dist/commands/git/sync.js.map +0 -1
  216. package/dist/commands/improve.d.ts +0 -3
  217. package/dist/commands/improve.d.ts.map +0 -1
  218. package/dist/commands/improve.js +0 -286
  219. package/dist/commands/improve.js.map +0 -1
  220. package/dist/commands/knowledge.d.ts +0 -3
  221. package/dist/commands/knowledge.d.ts.map +0 -1
  222. package/dist/commands/knowledge.js +0 -316
  223. package/dist/commands/knowledge.js.map +0 -1
  224. package/dist/commands/log.d.ts.map +0 -1
  225. package/dist/commands/log.js +0 -1468
  226. package/dist/commands/log.js.map +0 -1
  227. package/dist/commands/meta-index.d.ts +0 -3
  228. package/dist/commands/meta-index.d.ts.map +0 -1
  229. package/dist/commands/meta-index.js +0 -431
  230. package/dist/commands/meta-index.js.map +0 -1
  231. package/dist/commands/metrics.d.ts +0 -3
  232. package/dist/commands/metrics.d.ts.map +0 -1
  233. package/dist/commands/metrics.js +0 -843
  234. package/dist/commands/metrics.js.map +0 -1
  235. package/dist/commands/quick.d.ts +0 -3
  236. package/dist/commands/quick.d.ts.map +0 -1
  237. package/dist/commands/quick.js +0 -136
  238. package/dist/commands/quick.js.map +0 -1
  239. package/dist/commands/retro.d.ts +0 -3
  240. package/dist/commands/retro.d.ts.map +0 -1
  241. package/dist/commands/retro.js +0 -885
  242. package/dist/commands/retro.js.map +0 -1
  243. package/dist/commands/session.d.ts +0 -3
  244. package/dist/commands/session.d.ts.map +0 -1
  245. package/dist/commands/session.js +0 -346
  246. package/dist/commands/session.js.map +0 -1
  247. package/dist/commands/skills.d.ts +0 -12
  248. package/dist/commands/skills.d.ts.map +0 -1
  249. package/dist/commands/skills.js +0 -228
  250. package/dist/commands/skills.js.map +0 -1
  251. package/dist/commands/status.d.ts +0 -3
  252. package/dist/commands/status.d.ts.map +0 -1
  253. package/dist/commands/status.js +0 -127
  254. package/dist/commands/status.js.map +0 -1
  255. package/dist/commands/upgrade.d.ts.map +0 -1
  256. package/dist/commands/upgrade.js.map +0 -1
  257. package/dist/commands/watch.d.ts +0 -3
  258. package/dist/commands/watch.d.ts.map +0 -1
  259. package/dist/commands/watch.js +0 -213
  260. package/dist/commands/watch.js.map +0 -1
  261. package/dist/commands/workflow.d.ts +0 -5
  262. package/dist/commands/workflow.d.ts.map +0 -1
  263. package/dist/commands/workflow.js +0 -781
  264. package/dist/commands/workflow.js.map +0 -1
  265. package/templates/base/skills/audit/SKILL.md +0 -66
  266. package/templates/base/skills/controller/SKILL.md +0 -77
  267. package/templates/base/skills/controller/delegation/developer.md +0 -25
  268. package/templates/base/skills/controller/delegation/librarian.md +0 -33
  269. package/templates/base/skills/controller/delegation/reviewer.md +0 -19
  270. package/templates/base/skills/controller/triggers/phase-complete.md +0 -25
  271. package/templates/base/skills/controller/triggers/sequence-complete.md +0 -15
  272. package/templates/base/skills/controller/triggers/ssot-changed.md +0 -14
  273. package/templates/base/skills/controller/triggers/task-complete.md +0 -14
  274. package/templates/base/skills/librarian/SKILL.md +0 -53
  275. package/templates/base/skills/main-session-constraints/SKILL.md +0 -62
  276. package/templates/base/skills/retrospective/SKILL.md +0 -77
  277. package/templates/base/skills/review/SKILL.md +0 -72
  278. package/templates/base/skills/tsq-cli/SKILL.md +0 -73
  279. package/templates/base/skills/tsq-cli/references/cli-reference.md +0 -92
  280. package/templates/base/timsquad/feedback/feedback-router.sh +0 -341
  281. package/templates/base/timsquad/feedback/routing-rules.yaml +0 -352
  282. package/templates/platforms/claude-code/CLAUDE.md.template +0 -89
  283. package/templates/platforms/claude-code/rules/skill-suggest.md +0 -27
  284. package/templates/platforms/claude-code/scripts/skill-inject.sh +0 -216
  285. package/templates/platforms/claude-code/scripts/skill-rules.json +0 -95
  286. package/templates/platforms/claude-code/scripts/skill-suggest.sh +0 -105
  287. package/templates/platforms/claude-code/scripts/subagent-inject.sh +0 -53
  288. /package/templates/base/skills/{architecture → tsq-architecture}/references/adr-template.md +0 -0
  289. /package/templates/base/skills/{architecture → tsq-architecture}/references/api-design.md +0 -0
  290. /package/templates/base/skills/{methodology/bdd → tsq-bdd}/rules/gherkin-patterns.md +0 -0
  291. /package/templates/base/skills/{coding → tsq-coding}/rules/async-patterns.md +0 -0
  292. /package/templates/base/skills/{coding → tsq-coding}/rules/code-organization.md +0 -0
  293. /package/templates/base/skills/{coding → tsq-coding}/rules/error-handling.md +0 -0
  294. /package/templates/base/skills/{coding → tsq-coding}/rules/patterns.md +0 -0
  295. /package/templates/base/skills/{coding → tsq-coding}/rules/type-safety.md +0 -0
  296. /package/templates/base/skills/{controller → tsq-controller}/memory/.gitkeep +0 -0
  297. /package/templates/base/skills/{controller → tsq-controller}/references/README.md +0 -0
  298. /package/templates/base/skills/{controller → tsq-controller}/rules/README.md +0 -0
  299. /package/templates/base/skills/{mobile/dart → tsq-dart}/rules/async-patterns.md +0 -0
  300. /package/templates/base/skills/{mobile/dart → tsq-dart}/rules/code-style.md +0 -0
  301. /package/templates/base/skills/{mobile/dart → tsq-dart}/rules/null-safety.md +0 -0
  302. /package/templates/base/skills/{mobile/dart → tsq-dart}/rules/type-system.md +0 -0
  303. /package/templates/base/skills/{database → tsq-database}/rules/query-optimization.md +0 -0
  304. /package/templates/base/skills/{database → tsq-database}/rules/supabase-patterns.md +0 -0
  305. /package/templates/base/skills/{methodology/ddd → tsq-ddd}/rules/strategic-patterns.md +0 -0
  306. /package/templates/base/skills/{methodology/debugging → tsq-debugging}/references/root-cause-tracing.md +0 -0
  307. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/SKILL.md +0 -0
  308. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/references/ci-cd-pipeline.md +0 -0
  309. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/code-signing.md +0 -0
  310. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/codemagic-setup.md +0 -0
  311. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/fastlane-setup.md +0 -0
  312. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/github-actions.md +0 -0
  313. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/store-deployment.md +0 -0
  314. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/ci-cd/rules/versioning.md +0 -0
  315. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/SKILL.md +0 -0
  316. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/references/i18n-architecture.md +0 -0
  317. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/arb-files.md +0 -0
  318. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/locale-switching.md +0 -0
  319. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/localization-setup.md +0 -0
  320. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/plural-gender.md +0 -0
  321. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/i18n/rules/text-direction.md +0 -0
  322. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/SKILL.md +0 -0
  323. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/references/monitoring-architecture.md +0 -0
  324. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/analytics.md +0 -0
  325. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/crashlytics-setup.md +0 -0
  326. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/logging.md +0 -0
  327. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/performance-monitoring.md +0 -0
  328. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/monitoring/rules/sentry-integration.md +0 -0
  329. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/SKILL.md +0 -0
  330. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/references/api-client-architecture.md +0 -0
  331. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/caching.md +0 -0
  332. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/connectivity.md +0 -0
  333. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/dio-setup.md +0 -0
  334. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/error-handling.md +0 -0
  335. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/interceptors.md +0 -0
  336. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/networking/rules/retrofit-patterns.md +0 -0
  337. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/SKILL.md +0 -0
  338. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/references/notification-architecture.md +0 -0
  339. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/references/platform-setup.md +0 -0
  340. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/background-processing.md +0 -0
  341. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/deep-linking.md +0 -0
  342. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/fcm-setup.md +0 -0
  343. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/local-notifications.md +0 -0
  344. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/notification-handling.md +0 -0
  345. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/notification-permissions.md +0 -0
  346. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/push-notifications/rules/rich-notifications.md +0 -0
  347. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/references/freezed-patterns.md +0 -0
  348. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/references/project-structure.md +0 -0
  349. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/animations.md +0 -0
  350. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/architecture.md +0 -0
  351. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/navigation-routing.md +0 -0
  352. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/performance.md +0 -0
  353. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/platform-adaptive.md +0 -0
  354. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/state-management.md +0 -0
  355. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/testing.md +0 -0
  356. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/rules/widget-conventions.md +0 -0
  357. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/SKILL.md +0 -0
  358. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/references/mobile-security-checklist.md +0 -0
  359. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/api-key-protection.md +0 -0
  360. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/authentication.md +0 -0
  361. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/data-protection.md +0 -0
  362. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/obfuscation.md +0 -0
  363. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/secure-storage.md +0 -0
  364. /package/templates/base/skills/{mobile/flutter → tsq-flutter}/security/rules/ssl-pinning.md +0 -0
  365. /package/templates/base/skills/{backend/node → tsq-hono}/rules/async-patterns.md +0 -0
  366. /package/templates/base/skills/{backend/node → tsq-hono}/rules/deployment.md +0 -0
  367. /package/templates/base/skills/{backend/node → tsq-hono}/rules/env-config.md +0 -0
  368. /package/templates/base/skills/{backend/node → tsq-hono}/rules/error-handling.md +0 -0
  369. /package/templates/base/skills/{backend/node → tsq-hono}/rules/hono-app-setup.md +0 -0
  370. /package/templates/base/skills/{backend/node → tsq-hono}/rules/jwt-auth.md +0 -0
  371. /package/templates/base/skills/{backend/node → tsq-hono}/rules/middleware.md +0 -0
  372. /package/templates/base/skills/{backend/node → tsq-hono}/rules/testing.md +0 -0
  373. /package/templates/base/skills/{frontend/nextjs → tsq-nextjs}/rules/app-router.md +0 -0
  374. /package/templates/base/skills/{planning → tsq-planning}/references/prd-guide.md +0 -0
  375. /package/templates/base/skills/{planning → tsq-planning}/references/requirements-guide.md +0 -0
  376. /package/templates/base/skills/{database/prisma → tsq-prisma}/rules/queries.md +0 -0
  377. /package/templates/base/skills/{database/prisma → tsq-prisma}/rules/schema-design.md +0 -0
  378. /package/templates/base/skills/{product-audit → tsq-product-audit}/checklists/01-security.md +0 -0
  379. /package/templates/base/skills/{product-audit → tsq-product-audit}/checklists/02-performance.md +0 -0
  380. /package/templates/base/skills/{product-audit → tsq-product-audit}/checklists/03-seo.md +0 -0
  381. /package/templates/base/skills/{product-audit → tsq-product-audit}/checklists/04-accessibility.md +0 -0
  382. /package/templates/base/skills/{product-audit → tsq-product-audit}/checklists/05-ui-ux.md +0 -0
  383. /package/templates/base/skills/{product-audit → tsq-product-audit}/checklists/06-architecture.md +0 -0
  384. /package/templates/base/skills/{product-audit → tsq-product-audit}/checklists/07-functional-requirements.md +0 -0
  385. /package/templates/base/skills/{product-audit → tsq-product-audit}/rules/audit-protocol.md +0 -0
  386. /package/templates/base/skills/{product-audit → tsq-product-audit}/rules/false-positive-guard.md +0 -0
  387. /package/templates/base/skills/{product-audit → tsq-product-audit}/rules/scoring-criteria.md +0 -0
  388. /package/templates/base/skills/{product-audit → tsq-product-audit}/templates/improvement-plan-template.md +0 -0
  389. /package/templates/base/skills/{product-audit → tsq-product-audit}/templates/report-template.md +0 -0
  390. /package/templates/base/skills/{frontend/react → tsq-react}/rules/_sections.md +0 -0
  391. /package/templates/base/skills/{frontend/react → tsq-react}/rules/anti-patterns.md +0 -0
  392. /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-api-routes.md +0 -0
  393. /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-defer-await.md +0 -0
  394. /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-dependencies.md +0 -0
  395. /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-parallel.md +0 -0
  396. /package/templates/base/skills/{frontend/react → tsq-react}/rules/async-suspense-boundaries.md +0 -0
  397. /package/templates/base/skills/{frontend/react → tsq-react}/rules/bundle-barrel-imports.md +0 -0
  398. /package/templates/base/skills/{frontend/react → tsq-react}/rules/bundle-defer-third-party.md +0 -0
  399. /package/templates/base/skills/{frontend/react → tsq-react}/rules/bundle-dynamic-imports.md +0 -0
  400. /package/templates/base/skills/{frontend/react → tsq-react}/rules/component-conventions.md +0 -0
  401. /package/templates/base/skills/{frontend/react → tsq-react}/rules/js-combine-iterations.md +0 -0
  402. /package/templates/base/skills/{frontend/react → tsq-react}/rules/js-early-exit.md +0 -0
  403. /package/templates/base/skills/{frontend/react → tsq-react}/rules/js-index-maps.md +0 -0
  404. /package/templates/base/skills/{frontend/react → tsq-react}/rules/js-set-map-lookups.md +0 -0
  405. /package/templates/base/skills/{frontend/react → tsq-react}/rules/rendering-conditional-render.md +0 -0
  406. /package/templates/base/skills/{frontend/react → tsq-react}/rules/rendering-content-visibility.md +0 -0
  407. /package/templates/base/skills/{frontend/react → tsq-react}/rules/rendering-hoist-jsx.md +0 -0
  408. /package/templates/base/skills/{frontend/react → tsq-react}/rules/rerender-defer-reads.md +0 -0
  409. /package/templates/base/skills/{frontend/react → tsq-react}/rules/rerender-derived-state.md +0 -0
  410. /package/templates/base/skills/{frontend/react → tsq-react}/rules/rerender-memo.md +0 -0
  411. /package/templates/base/skills/{frontend/react → tsq-react}/rules/rerender-transitions.md +0 -0
  412. /package/templates/base/skills/{frontend/react → tsq-react}/rules/server-after-nonblocking.md +0 -0
  413. /package/templates/base/skills/{frontend/react → tsq-react}/rules/server-cache-react.md +0 -0
  414. /package/templates/base/skills/{frontend/react → tsq-react}/rules/server-parallel-fetching.md +0 -0
  415. /package/templates/base/skills/{frontend/react → tsq-react}/rules/state-location.md +0 -0
  416. /package/templates/base/skills/{retrospective → tsq-retro}/references/improvement-template.md +0 -0
  417. /package/templates/base/skills/{security → tsq-security}/rules/auth-patterns.md +0 -0
  418. /package/templates/base/skills/{security → tsq-security}/rules/dependency-security.md +0 -0
  419. /package/templates/base/skills/{security → tsq-security}/rules/input-validation.md +0 -0
  420. /package/templates/base/skills/{security → tsq-security}/rules/owasp-examples.md +0 -0
  421. /package/templates/base/skills/{security → tsq-security}/rules/secrets-management.md +0 -0
  422. /package/templates/base/skills/{security → tsq-security}/scripts/check-secrets.sh +0 -0
  423. /package/templates/base/skills/{stability-verification → tsq-stability}/references/release-checklist.md +0 -0
  424. /package/templates/base/skills/{stability-verification → tsq-stability}/references/security-fix-patterns.md +0 -0
  425. /package/templates/base/skills/{stability-verification → tsq-stability}/rules/verification-layers.md +0 -0
  426. /package/templates/base/skills/{stability-verification → tsq-stability}/rules/verification-workflow.md +0 -0
  427. /package/templates/base/skills/{stability-verification → tsq-stability}/scripts/verify.sh +0 -0
  428. /package/templates/base/skills/{methodology/tdd → tsq-tdd}/rules/real-world-example.md +0 -0
  429. /package/templates/base/skills/{methodology/tdd → tsq-tdd}/rules/techniques.md +0 -0
  430. /package/templates/base/skills/{testing → tsq-testing}/references/e2e-stability.md +0 -0
  431. /package/templates/base/skills/{testing → tsq-testing}/references/testing-patterns.md +0 -0
  432. /package/templates/base/skills/{typescript → tsq-typescript}/rules/type-patterns.md +0 -0
  433. /package/templates/base/skills/{typescript → tsq-typescript}/rules/utility-types.md +0 -0
@@ -1,251 +0,0 @@
1
- import path from 'path';
2
- import { colors, printHeader, printError, printSuccess, printWarning, printInfo, printStep, } from '../utils/colors.js';
3
- import { findProjectRoot } from '../lib/project.js';
4
- import { exists } from '../utils/fs.js';
5
- import { compileAll, checkStale, validateDependencyGraph, validateSkillDependencies, } from '../lib/compiler.js';
6
- export function registerCompileCommand(program) {
7
- const compileCmd = program
8
- .command('compile')
9
- .description('Compile SSOT documents into agent-facing specs (Context DI)');
10
- compileCmd
11
- .command('build')
12
- .description('Compile all SSOT documents into controller specs')
13
- .alias('b')
14
- .action(async () => {
15
- try {
16
- await runCompile();
17
- }
18
- catch (err) {
19
- printError(err instanceof Error ? err.message : String(err));
20
- process.exit(1);
21
- }
22
- });
23
- compileCmd
24
- .command('validate')
25
- .description('Validate SSOT completeness and dependency graph')
26
- .alias('v')
27
- .action(async () => {
28
- try {
29
- await runValidate();
30
- }
31
- catch (err) {
32
- printError(err instanceof Error ? err.message : String(err));
33
- process.exit(1);
34
- }
35
- });
36
- compileCmd
37
- .command('e2e')
38
- .description('Show E2E test mappings from compiled specs')
39
- .option('--task <source>', 'Filter by SSOT source name')
40
- .action(async (options) => {
41
- try {
42
- await runE2eMapping(options.task);
43
- }
44
- catch (err) {
45
- printError(err instanceof Error ? err.message : String(err));
46
- process.exit(1);
47
- }
48
- });
49
- compileCmd
50
- .command('status')
51
- .description('Check for stale specs (SSOT changed since last compile)')
52
- .alias('s')
53
- .action(async () => {
54
- try {
55
- await runStatus();
56
- }
57
- catch (err) {
58
- printError(err instanceof Error ? err.message : String(err));
59
- process.exit(1);
60
- }
61
- });
62
- // Default action (no subcommand) → build
63
- compileCmd.action(async () => {
64
- try {
65
- await runCompile();
66
- }
67
- catch (err) {
68
- printError(err instanceof Error ? err.message : String(err));
69
- process.exit(1);
70
- }
71
- });
72
- }
73
- async function resolveProject() {
74
- const projectRoot = await findProjectRoot();
75
- if (!projectRoot) {
76
- throw new Error('TimSquad 프로젝트를 찾을 수 없습니다. tsq init을 먼저 실행하세요.');
77
- }
78
- const controllerDir = path.join(projectRoot, '.claude', 'skills', 'controller');
79
- return { projectRoot, controllerDir };
80
- }
81
- // ─── tsq compile (build) ─────────────────────────────────────────
82
- async function runCompile() {
83
- printHeader('SSOT Compile');
84
- const { projectRoot, controllerDir } = await resolveProject();
85
- // Verify SSOT directory exists
86
- const ssotDir = path.join(projectRoot, '.timsquad', 'ssot');
87
- if (!await exists(ssotDir)) {
88
- printError('.timsquad/ssot/ 디렉토리가 없습니다.');
89
- return;
90
- }
91
- printStep(1, 3, 'SSOT 문서 파싱 및 컴파일...');
92
- const result = await compileAll(projectRoot, controllerDir);
93
- printStep(2, 3, '검증 결과 확인...');
94
- printCompileResult(result);
95
- printStep(3, 3, '의존성 그래프 검증...');
96
- const unresolved = await validateDependencyGraph(projectRoot, controllerDir);
97
- printDependencyResult(unresolved);
98
- // Skill dependency validation (7-A)
99
- const skillIssues = await validateSkillDependencies(projectRoot);
100
- if (skillIssues.length > 0) {
101
- printSkillDependencyResult(skillIssues);
102
- }
103
- const totalIssues = unresolved.length + skillIssues.length;
104
- if (result.success && totalIssues === 0) {
105
- printSuccess(`컴파일 완료 — ${result.compiled.length}개 문서, ${countOutputFiles(result)}개 spec 생성`);
106
- }
107
- else if (result.success) {
108
- printWarning(`컴파일 완료 (이슈 ${totalIssues}건)`);
109
- }
110
- else {
111
- printError(`컴파일 실패 — ${result.errors.length}건 오류`);
112
- }
113
- }
114
- // ─── tsq compile validate ────────────────────────────────────────
115
- async function runValidate() {
116
- printHeader('SSOT Validate');
117
- const { projectRoot, controllerDir } = await resolveProject();
118
- // Check stale first
119
- const stale = await checkStale(projectRoot, controllerDir);
120
- if (stale.length > 0) {
121
- printWarning('Stale spec 감지:');
122
- for (const s of stale) {
123
- console.log(` ${colors.warning('⚠')} ${colors.path(s.source)} — ${s.reason}`);
124
- }
125
- console.log();
126
- }
127
- // Dependency graph
128
- const unresolved = await validateDependencyGraph(projectRoot, controllerDir);
129
- printDependencyResult(unresolved);
130
- if (stale.length === 0 && unresolved.length === 0) {
131
- printSuccess('모든 검증 통과');
132
- }
133
- }
134
- // ─── tsq compile status ──────────────────────────────────────────
135
- async function runStatus() {
136
- printHeader('Compile Status');
137
- const { projectRoot, controllerDir } = await resolveProject();
138
- const stale = await checkStale(projectRoot, controllerDir);
139
- if (stale.length === 0) {
140
- printSuccess('모든 spec이 최신 상태입니다.');
141
- }
142
- else {
143
- printWarning(`${stale.length}개 SSOT 변경 감지 — tsq compile 실행 필요:`);
144
- for (const s of stale) {
145
- console.log(` ${colors.warning('⚠')} ${colors.path(s.source)} — ${s.reason}`);
146
- }
147
- }
148
- }
149
- // ─── tsq compile e2e ─────────────────────────────────────────────
150
- async function runE2eMapping(taskFilter) {
151
- printHeader('E2E Test Mappings');
152
- const { projectRoot, controllerDir } = await resolveProject();
153
- const ssotDir = path.join(projectRoot, '.timsquad', 'ssot');
154
- if (!await exists(ssotDir)) {
155
- printError('.timsquad/ssot/ 디렉토리가 없습니다.');
156
- return;
157
- }
158
- const result = await compileAll(projectRoot, controllerDir);
159
- let mappings = result.affected_e2e;
160
- if (taskFilter) {
161
- mappings = mappings.filter(m => m.specFile.includes(taskFilter));
162
- }
163
- if (mappings.length === 0) {
164
- printInfo('E2E 매핑 없음' + (taskFilter ? ` (filter: ${taskFilter})` : ''));
165
- return;
166
- }
167
- // Also scan __tests__/e2e/ for unmapped test files
168
- const e2eDir = path.join(projectRoot, '__tests__', 'e2e');
169
- const existingE2eFiles = new Set();
170
- if (await exists(e2eDir)) {
171
- const files = await import('fs-extra').then(f => f.default.readdir(e2eDir));
172
- for (const f of files) {
173
- if (f.endsWith('.test.ts') || f.endsWith('.test.js')) {
174
- existingE2eFiles.add(path.join('__tests__/e2e', f));
175
- }
176
- }
177
- }
178
- console.log(colors.subheader(' Spec → E2E Mappings'));
179
- for (const m of mappings) {
180
- const icon = m.exists ? '✅' : '⚠️';
181
- const action = m.exists ? 'run' : 'create';
182
- console.log(` ${icon} ${colors.path(m.specFile)} → ${m.e2eFile} [${action}]`);
183
- }
184
- // Show unmapped E2E test files
185
- const mappedE2e = new Set(mappings.map(m => m.e2eFile));
186
- const unmapped = [...existingE2eFiles].filter(f => !mappedE2e.has(f));
187
- if (unmapped.length > 0) {
188
- console.log(colors.subheader('\n Unmapped E2E Tests (no spec reference)'));
189
- for (const f of unmapped) {
190
- console.log(` ${colors.dim('○')} ${f}`);
191
- }
192
- }
193
- printSuccess(`${mappings.length}개 E2E 매핑 (${mappings.filter(m => m.exists).length} exist, ${mappings.filter(m => !m.exists).length} missing)`);
194
- }
195
- // ─── Output Helpers ──────────────────────────────────────────────
196
- function printCompileResult(result) {
197
- // Compiled documents
198
- for (const c of result.compiled) {
199
- const validation = result.validations.find((v) => v.source === c.source);
200
- const score = validation ? `${validation.score}%` : '-';
201
- const icon = validation && validation.score === 100 ? '✅' : validation && validation.score >= 50 ? '⚠️' : '❌';
202
- console.log(` ${icon} ${colors.path(c.source)} → ${c.outputFiles.length}개 spec (완성도: ${score})`);
203
- // Show missing fields
204
- if (validation && validation.missingFields.length > 0) {
205
- for (const mf of validation.missingFields) {
206
- console.log(` ${colors.dim(`└ ${mf.section}: 누락 필드 [${mf.fields.join(', ')}]`)}`);
207
- }
208
- }
209
- }
210
- // Skipped (too small / template)
211
- if (result.skipped.length > 0) {
212
- console.log(` ${colors.dim(`⏭ 건너뜀 (미작성): ${result.skipped.join(', ')}`)}`);
213
- }
214
- // E2E mappings summary
215
- if (result.affected_e2e.length > 0) {
216
- const existing = result.affected_e2e.filter(m => m.exists).length;
217
- const missing = result.affected_e2e.length - existing;
218
- console.log(` ${colors.dim(`🧪 E2E: ${result.affected_e2e.length}개 매핑 (${existing} exist, ${missing} missing) — tsq compile e2e 로 상세 확인`)}`);
219
- }
220
- // Errors
221
- for (const err of result.errors) {
222
- printError(err);
223
- }
224
- console.log();
225
- }
226
- function printDependencyResult(unresolved) {
227
- if (unresolved.length === 0) {
228
- printInfo('의존성 그래프: 모든 agent prerequisites 해결됨');
229
- }
230
- else {
231
- printWarning('미해결 의존성:');
232
- for (const u of unresolved) {
233
- console.log(` ${colors.agent(u.agent)} → 누락: ${u.missing.map((m) => colors.path(m)).join(', ')}`);
234
- }
235
- }
236
- console.log();
237
- }
238
- function printSkillDependencyResult(issues) {
239
- printWarning('스킬 의존성 이슈:');
240
- for (const issue of issues) {
241
- const typeLabel = issue.type === 'missing_dependency' ? '누락'
242
- : issue.type === 'circular' ? '순환'
243
- : '충돌';
244
- console.log(` ${colors.warning('⚠')} ${colors.path(issue.skill)} → ${typeLabel}: ${issue.target}`);
245
- }
246
- console.log();
247
- }
248
- function countOutputFiles(result) {
249
- return result.compiled.reduce((sum, c) => sum + c.outputFiles.length, 0);
250
- }
251
- //# sourceMappingURL=compile.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"compile.js","sourceRoot":"","sources":["../../src/commands/compile.ts"],"names":[],"mappings":"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"}
@@ -1,12 +0,0 @@
1
- import { Command } from 'commander';
2
- import type { FeedbackLevel, FeedbackRoutingRules } from '../types/index.js';
3
- export declare function registerFeedbackCommand(program: Command): void;
4
- export interface ClassificationResult {
5
- level: FeedbackLevel;
6
- routeTo: string;
7
- approvalRequired: boolean;
8
- trigger: string;
9
- }
10
- export declare function classifyFeedback(message: string, rules: FeedbackRoutingRules): ClassificationResult;
11
- export declare function getTriggerPatterns(trigger: string): string[];
12
- //# sourceMappingURL=feedback.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"feedback.d.ts","sourceRoot":"","sources":["../../src/commands/feedback.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASpC,OAAO,KAAK,EAAE,aAAa,EAAE,oBAAoB,EAAiB,MAAM,mBAAmB,CAAC;AAG5F,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsE9D;AAiND,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,aAAa,CAAC;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,oBAAoB,GAAG,oBAAoB,CAiDnG;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CAoB5D"}
@@ -1,382 +0,0 @@
1
- import path from 'path';
2
- import fs from 'fs-extra';
3
- import { colors, printHeader, printError, printSuccess, printKeyValue } from '../utils/colors.js';
4
- import { findProjectRoot } from '../lib/project.js';
5
- import { exists, readFile, writeFile, listFiles } from '../utils/fs.js';
6
- import { loadYaml } from '../utils/yaml.js';
7
- import { getDateString, getTimeString, getTimestamp } from '../utils/date.js';
8
- import { loadWorkflowState, saveWorkflowState } from '../lib/workflow-state.js';
9
- import { DEFAULT_ROUTING_RULES } from '../types/feedback.js';
10
- export function registerFeedbackCommand(program) {
11
- const feedbackCmd = program
12
- .command('feedback')
13
- .description('Manage feedback routing and lifecycle');
14
- // tsq feedback route <message>
15
- feedbackCmd
16
- .command('route <message>')
17
- .description('Classify and route feedback with auto-actions')
18
- .action(async (message) => {
19
- try {
20
- await routeFeedback(message);
21
- }
22
- catch (error) {
23
- printError(error.message);
24
- process.exit(1);
25
- }
26
- });
27
- // tsq feedback list [--status <status>]
28
- feedbackCmd
29
- .command('list')
30
- .description('List feedback entries')
31
- .option('--status <status>', 'Filter by status (open, in_review, resolved, approved, rejected)')
32
- .action(async (options) => {
33
- try {
34
- await listFeedback(options);
35
- }
36
- catch (error) {
37
- printError(error.message);
38
- process.exit(1);
39
- }
40
- });
41
- // tsq feedback resolve <id>
42
- feedbackCmd
43
- .command('resolve <id>')
44
- .description('Mark feedback as resolved')
45
- .action(async (id) => {
46
- try {
47
- await resolveFeedback(id);
48
- }
49
- catch (error) {
50
- printError(error.message);
51
- process.exit(1);
52
- }
53
- });
54
- // tsq feedback approve <id>
55
- feedbackCmd
56
- .command('approve <id>')
57
- .description('Approve L3 feedback (user action)')
58
- .action(async (id) => {
59
- try {
60
- await approveFeedback(id);
61
- }
62
- catch (error) {
63
- printError(error.message);
64
- process.exit(1);
65
- }
66
- });
67
- // tsq feedback reject <id>
68
- feedbackCmd
69
- .command('reject <id>')
70
- .description('Reject L3 feedback')
71
- .action(async (id) => {
72
- try {
73
- await rejectFeedback(id);
74
- }
75
- catch (error) {
76
- printError(error.message);
77
- process.exit(1);
78
- }
79
- });
80
- }
81
- // ── Route ──
82
- async function routeFeedback(message) {
83
- const projectRoot = await findProjectRoot();
84
- if (!projectRoot) {
85
- throw new Error('Not a TimSquad project');
86
- }
87
- // Load routing rules
88
- const rulesPath = path.join(projectRoot, '.timsquad', 'feedback', 'routing-rules.yaml');
89
- let rules = DEFAULT_ROUTING_RULES;
90
- if (await exists(rulesPath)) {
91
- rules = await loadYaml(rulesPath);
92
- }
93
- // Classify feedback
94
- const result = classifyFeedback(message, rules);
95
- printHeader('Feedback Routing');
96
- printKeyValue('Message', message.substring(0, 50) + (message.length > 50 ? '...' : ''));
97
- printKeyValue('Level', `${result.level} (${getLevelName(result.level)})`);
98
- printKeyValue('Route to', result.routeTo);
99
- printKeyValue('Approval required', result.approvalRequired ? 'Yes' : 'No');
100
- // Log feedback + auto-actions
101
- const entry = await logFeedback(projectRoot, message, result);
102
- await executeAutoActions(projectRoot, entry, result);
103
- console.log('');
104
- if (result.level === 3) {
105
- console.log(colors.warning('⚠ L3 feedback: user approval required (tsq feedback approve/reject)'));
106
- }
107
- else if (result.level === 2) {
108
- printSuccess(`L2 feedback routed to ${result.routeTo} (in_review, phase gate blocking)`);
109
- }
110
- else {
111
- printSuccess(`Feedback routed to ${result.routeTo}`);
112
- }
113
- }
114
- // ── Auto Actions ──
115
- async function executeAutoActions(projectRoot, entry, result) {
116
- const state = await loadWorkflowState(projectRoot);
117
- if (!state.automation.feedback)
118
- return;
119
- const feedbackDir = path.join(projectRoot, '.timsquad', 'feedback');
120
- if (result.level === 2) {
121
- // L2: SSOT 리뷰 → status='in_review', pending에 등록
122
- entry.status = 'in_review';
123
- await fs.writeJson(path.join(feedbackDir, `${entry.id}.json`), entry, { spaces: 2 });
124
- if (!state.pending_feedback.includes(entry.id)) {
125
- state.pending_feedback.push(entry.id);
126
- await saveWorkflowState(projectRoot, state);
127
- }
128
- await appendWorkflowLog(projectRoot, `[AUTO-FEEDBACK] L2 "${entry.trigger}" → ${entry.routeTo} (review required)`);
129
- }
130
- if (result.level === 3) {
131
- // L3: 사용자 승인 대기 → status='open', pending에 등록
132
- entry.status = 'open';
133
- await fs.writeJson(path.join(feedbackDir, `${entry.id}.json`), entry, { spaces: 2 });
134
- if (!state.pending_feedback.includes(entry.id)) {
135
- state.pending_feedback.push(entry.id);
136
- await saveWorkflowState(projectRoot, state);
137
- }
138
- await appendWorkflowLog(projectRoot, `[AUTO-FEEDBACK] L3 "${entry.trigger}" → user approval required (phase gate blocked)`);
139
- }
140
- }
141
- // ── List ──
142
- async function listFeedback(options) {
143
- const projectRoot = await findProjectRoot();
144
- if (!projectRoot) {
145
- throw new Error('Not a TimSquad project');
146
- }
147
- const feedbackDir = path.join(projectRoot, '.timsquad', 'feedback');
148
- if (!await fs.pathExists(feedbackDir)) {
149
- console.log('No feedback entries found.');
150
- return;
151
- }
152
- const files = await listFiles('FB-*.json', feedbackDir);
153
- if (files.length === 0) {
154
- console.log('No feedback entries found.');
155
- return;
156
- }
157
- printHeader('Feedback List');
158
- const entries = [];
159
- for (const file of files) {
160
- try {
161
- const entry = await fs.readJson(path.join(feedbackDir, file));
162
- // 하위 호환: status 없으면 'open'
163
- if (!entry.status)
164
- entry.status = 'open';
165
- entries.push(entry);
166
- }
167
- catch { /* skip */ }
168
- }
169
- // Filter by status
170
- const filtered = options.status
171
- ? entries.filter(e => e.status === options.status)
172
- : entries;
173
- if (filtered.length === 0) {
174
- console.log(`No feedback entries with status "${options.status}".`);
175
- return;
176
- }
177
- // Table output
178
- console.log(`${'ID'.padEnd(10)} ${'Lv'.padEnd(4)} ${'Status'.padEnd(12)} ${'Trigger'.padEnd(22)} ${'Route'.padEnd(12)} Timestamp`);
179
- console.log('-'.repeat(80));
180
- for (const entry of filtered) {
181
- const id = (entry.id || '').padEnd(10);
182
- const lv = `L${entry.level || '?'}`.padEnd(4);
183
- const status = (entry.status || 'open').padEnd(12);
184
- const trigger = (entry.trigger || '').substring(0, 20).padEnd(22);
185
- const route = (entry.routeTo || '').padEnd(12);
186
- const ts = entry.timestamp || '';
187
- console.log(`${id} ${lv} ${status} ${trigger} ${route} ${ts}`);
188
- }
189
- console.log('');
190
- console.log(`Total: ${filtered.length} entries`);
191
- }
192
- // ── Resolve ──
193
- async function resolveFeedback(id) {
194
- const projectRoot = await findProjectRoot();
195
- if (!projectRoot) {
196
- throw new Error('Not a TimSquad project');
197
- }
198
- const entry = await loadFeedbackEntry(projectRoot, id);
199
- entry.status = 'resolved';
200
- entry.resolvedAt = getTimestamp();
201
- entry.resolvedBy = 'user';
202
- await saveFeedbackEntry(projectRoot, id, entry);
203
- await removePendingFeedback(projectRoot, id);
204
- printSuccess(`Feedback ${id} resolved`);
205
- }
206
- // ── Approve (L3) ──
207
- async function approveFeedback(id) {
208
- const projectRoot = await findProjectRoot();
209
- if (!projectRoot) {
210
- throw new Error('Not a TimSquad project');
211
- }
212
- const entry = await loadFeedbackEntry(projectRoot, id);
213
- if (entry.level !== 3) {
214
- throw new Error(`Only L3 feedback can be approved (${id} is L${entry.level})`);
215
- }
216
- entry.status = 'approved';
217
- entry.resolvedAt = getTimestamp();
218
- entry.resolvedBy = 'user';
219
- await saveFeedbackEntry(projectRoot, id, entry);
220
- await removePendingFeedback(projectRoot, id);
221
- printSuccess(`L3 feedback ${id} approved`);
222
- }
223
- // ── Reject (L3) ──
224
- async function rejectFeedback(id) {
225
- const projectRoot = await findProjectRoot();
226
- if (!projectRoot) {
227
- throw new Error('Not a TimSquad project');
228
- }
229
- const entry = await loadFeedbackEntry(projectRoot, id);
230
- if (entry.level !== 3) {
231
- throw new Error(`Only L3 feedback can be rejected (${id} is L${entry.level})`);
232
- }
233
- entry.status = 'rejected';
234
- entry.resolvedAt = getTimestamp();
235
- entry.resolvedBy = 'user';
236
- await saveFeedbackEntry(projectRoot, id, entry);
237
- await removePendingFeedback(projectRoot, id);
238
- printSuccess(`L3 feedback ${id} rejected`);
239
- }
240
- export function classifyFeedback(message, rules) {
241
- const lowerMessage = message.toLowerCase();
242
- // Check Level 1 triggers (implementation issues)
243
- for (const trigger of rules.level_1.triggers) {
244
- const patterns = getTriggerPatterns(trigger);
245
- if (patterns.some(p => lowerMessage.includes(p))) {
246
- return {
247
- level: 1,
248
- routeTo: rules.level_1.route_to,
249
- approvalRequired: rules.level_1.approval_required,
250
- trigger,
251
- };
252
- }
253
- }
254
- // Check Level 2 triggers (design issues)
255
- for (const trigger of rules.level_2.triggers) {
256
- const patterns = getTriggerPatterns(trigger);
257
- if (patterns.some(p => lowerMessage.includes(p))) {
258
- return {
259
- level: 2,
260
- routeTo: rules.level_2.route_to,
261
- approvalRequired: rules.level_2.approval_required,
262
- trigger,
263
- };
264
- }
265
- }
266
- // Check Level 3 triggers (planning issues)
267
- for (const trigger of rules.level_3.triggers) {
268
- const patterns = getTriggerPatterns(trigger);
269
- if (patterns.some(p => lowerMessage.includes(p))) {
270
- return {
271
- level: 3,
272
- routeTo: 'user',
273
- approvalRequired: rules.level_3.approval_required,
274
- trigger,
275
- };
276
- }
277
- }
278
- // Default to Level 1 (developer)
279
- return {
280
- level: 1,
281
- routeTo: 'developer',
282
- approvalRequired: false,
283
- trigger: 'default',
284
- };
285
- }
286
- export function getTriggerPatterns(trigger) {
287
- const patterns = {
288
- test_failure: ['test fail', 'test error', '테스트 실패', 'assertion', 'expect'],
289
- lint_error: ['lint', 'eslint', 'prettier', 'format'],
290
- type_error: ['type error', 'typescript', '타입 에러', 'type mismatch'],
291
- runtime_error: ['runtime', 'exception', '런타임', 'crash', 'undefined'],
292
- code_style_violation: ['style', 'convention', '컨벤션', 'naming'],
293
- architecture_issue: ['architecture', '아키텍처', 'structure', 'design pattern'],
294
- api_mismatch: ['api', 'endpoint', '명세', 'spec', 'contract'],
295
- performance_problem: ['performance', '성능', 'slow', 'memory', 'leak'],
296
- scalability_concern: ['scale', '확장', 'load', 'bottleneck'],
297
- security_vulnerability: ['security', '보안', 'vulnerability', 'xss', 'injection'],
298
- requirement_ambiguity: ['requirement', '요구사항', 'unclear', '불명확', 'ambiguous'],
299
- scope_change: ['scope', '범위', 'change request', '변경'],
300
- business_logic_error: ['business', '비즈니스', 'logic', '로직'],
301
- feature_request: ['feature', '기능', 'request', '요청', 'add'],
302
- stakeholder_feedback: ['stakeholder', 'client', '고객', 'user feedback'],
303
- };
304
- return patterns[trigger] || [trigger.replace(/_/g, ' ')];
305
- }
306
- function getLevelName(level) {
307
- const names = {
308
- 1: '구현 수정',
309
- 2: '설계 수정',
310
- 3: '기획 수정',
311
- };
312
- return names[level];
313
- }
314
- async function logFeedback(projectRoot, message, result) {
315
- const date = getDateString();
316
- const time = getTimeString();
317
- // 1. Markdown log
318
- const logDir = path.join(projectRoot, '.timsquad', 'logs');
319
- await fs.ensureDir(logDir);
320
- const logFile = path.join(logDir, `${date}-feedback.md`);
321
- let content = '';
322
- if (await exists(logFile)) {
323
- content = await readFile(logFile);
324
- }
325
- else {
326
- content = `# Feedback Log - ${date}\n\n`;
327
- }
328
- content += `## ${time} [Level ${result.level}]\n\n`;
329
- content += `**Trigger:** ${result.trigger}\n`;
330
- content += `**Route to:** ${result.routeTo}\n`;
331
- content += `**Message:**\n\n${message}\n\n---\n\n`;
332
- await writeFile(logFile, content);
333
- // 2. Structured JSON
334
- const feedbackDir = path.join(projectRoot, '.timsquad', 'feedback');
335
- await fs.ensureDir(feedbackDir);
336
- const existingFiles = await listFiles('FB-*.json', feedbackDir);
337
- const nextNum = existingFiles.length + 1;
338
- const entryId = `FB-${String(nextNum).padStart(4, '0')}`;
339
- const entry = {
340
- id: entryId,
341
- timestamp: getTimestamp(),
342
- type: 'feedback',
343
- level: result.level,
344
- trigger: result.trigger,
345
- message,
346
- routeTo: result.routeTo,
347
- tags: [result.trigger, `level-${result.level}`],
348
- status: result.level === 1 ? 'resolved' : 'open',
349
- };
350
- await fs.writeJson(path.join(feedbackDir, `${entryId}.json`), entry, { spaces: 2 });
351
- return entry;
352
- }
353
- async function loadFeedbackEntry(projectRoot, id) {
354
- const feedbackDir = path.join(projectRoot, '.timsquad', 'feedback');
355
- const fbPath = path.join(feedbackDir, `${id}.json`);
356
- if (!await fs.pathExists(fbPath)) {
357
- throw new Error(`Feedback entry not found: ${id}`);
358
- }
359
- const entry = await fs.readJson(fbPath);
360
- if (!entry.status)
361
- entry.status = 'open';
362
- return entry;
363
- }
364
- async function saveFeedbackEntry(projectRoot, id, entry) {
365
- const feedbackDir = path.join(projectRoot, '.timsquad', 'feedback');
366
- await fs.writeJson(path.join(feedbackDir, `${id}.json`), entry, { spaces: 2 });
367
- }
368
- async function removePendingFeedback(projectRoot, id) {
369
- const state = await loadWorkflowState(projectRoot);
370
- const idx = state.pending_feedback.indexOf(id);
371
- if (idx >= 0) {
372
- state.pending_feedback.splice(idx, 1);
373
- await saveWorkflowState(projectRoot, state);
374
- await appendWorkflowLog(projectRoot, `[FEEDBACK] ${id} removed from pending (resolved/approved/rejected)`);
375
- }
376
- }
377
- async function appendWorkflowLog(projectRoot, message) {
378
- const logPath = path.join(projectRoot, '.timsquad', 'logs', 'workflow-automation.log');
379
- await fs.ensureDir(path.dirname(logPath));
380
- await fs.appendFile(logPath, `${getTimestamp()} ${message}\n`);
381
- }
382
- //# sourceMappingURL=feedback.js.map