timsquad 3.3.0 → 3.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (196) hide show
  1. package/README.ko.md +288 -0
  2. package/README.md +158 -151
  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.map +1 -1
  8. package/dist/commands/daemon.js +95 -5
  9. package/dist/commands/daemon.js.map +1 -1
  10. package/dist/commands/full.js +1 -0
  11. package/dist/commands/full.js.map +1 -1
  12. package/dist/commands/git/pr.js +6 -5
  13. package/dist/commands/git/pr.js.map +1 -1
  14. package/dist/commands/git/release.js +2 -7
  15. package/dist/commands/git/release.js.map +1 -1
  16. package/dist/commands/improve.js +2 -2
  17. package/dist/commands/improve.js.map +1 -1
  18. package/dist/commands/init.d.ts.map +1 -1
  19. package/dist/commands/init.js +12 -3
  20. package/dist/commands/init.js.map +1 -1
  21. package/dist/commands/log.d.ts.map +1 -1
  22. package/dist/commands/log.js +2 -2
  23. package/dist/commands/log.js.map +1 -1
  24. package/dist/commands/metrics.d.ts.map +1 -1
  25. package/dist/commands/metrics.js +6 -2
  26. package/dist/commands/metrics.js.map +1 -1
  27. package/dist/commands/retro.js +8 -8
  28. package/dist/commands/retro.js.map +1 -1
  29. package/dist/commands/session.js +3 -3
  30. package/dist/commands/session.js.map +1 -1
  31. package/dist/commands/skills.d.ts +12 -0
  32. package/dist/commands/skills.d.ts.map +1 -0
  33. package/dist/commands/skills.js +228 -0
  34. package/dist/commands/skills.js.map +1 -0
  35. package/dist/commands/status.js +1 -1
  36. package/dist/commands/status.js.map +1 -1
  37. package/dist/commands/upgrade.d.ts.map +1 -1
  38. package/dist/commands/upgrade.js +23 -1
  39. package/dist/commands/upgrade.js.map +1 -1
  40. package/dist/daemon/entry.js +3 -3
  41. package/dist/daemon/entry.js.map +1 -1
  42. package/dist/daemon/event-queue.d.ts.map +1 -1
  43. package/dist/daemon/event-queue.js +2 -2
  44. package/dist/daemon/event-queue.js.map +1 -1
  45. package/dist/daemon/index.d.ts +4 -2
  46. package/dist/daemon/index.d.ts.map +1 -1
  47. package/dist/daemon/index.js +214 -52
  48. package/dist/daemon/index.js.map +1 -1
  49. package/dist/daemon/jsonl-watcher.d.ts +1 -0
  50. package/dist/daemon/jsonl-watcher.d.ts.map +1 -1
  51. package/dist/daemon/jsonl-watcher.js.map +1 -1
  52. package/dist/daemon/meta-cache.d.ts +1 -0
  53. package/dist/daemon/meta-cache.d.ts.map +1 -1
  54. package/dist/daemon/meta-cache.js +9 -0
  55. package/dist/daemon/meta-cache.js.map +1 -1
  56. package/dist/daemon/session-notes.d.ts +33 -0
  57. package/dist/daemon/session-notes.d.ts.map +1 -0
  58. package/dist/daemon/session-notes.js +74 -0
  59. package/dist/daemon/session-notes.js.map +1 -0
  60. package/dist/daemon/session-state.d.ts +27 -0
  61. package/dist/daemon/session-state.d.ts.map +1 -0
  62. package/dist/daemon/session-state.js +165 -0
  63. package/dist/daemon/session-state.js.map +1 -0
  64. package/dist/daemon/shutdown.d.ts.map +1 -1
  65. package/dist/daemon/shutdown.js +9 -1
  66. package/dist/daemon/shutdown.js.map +1 -1
  67. package/dist/index.js +4 -0
  68. package/dist/index.js.map +1 -1
  69. package/dist/lib/agent-generator.d.ts +4 -0
  70. package/dist/lib/agent-generator.d.ts.map +1 -1
  71. package/dist/lib/agent-generator.js +52 -3
  72. package/dist/lib/agent-generator.js.map +1 -1
  73. package/dist/lib/compile-rules.d.ts +66 -0
  74. package/dist/lib/compile-rules.d.ts.map +1 -0
  75. package/dist/lib/compile-rules.js +114 -0
  76. package/dist/lib/compile-rules.js.map +1 -0
  77. package/dist/lib/compiler.d.ts +105 -0
  78. package/dist/lib/compiler.d.ts.map +1 -0
  79. package/dist/lib/compiler.js +368 -0
  80. package/dist/lib/compiler.js.map +1 -0
  81. package/dist/lib/config.d.ts +1 -0
  82. package/dist/lib/config.d.ts.map +1 -1
  83. package/dist/lib/config.js +8 -1
  84. package/dist/lib/config.js.map +1 -1
  85. package/dist/lib/project.d.ts.map +1 -1
  86. package/dist/lib/project.js +8 -3
  87. package/dist/lib/project.js.map +1 -1
  88. package/dist/lib/skill-generator.d.ts.map +1 -1
  89. package/dist/lib/skill-generator.js +22 -1
  90. package/dist/lib/skill-generator.js.map +1 -1
  91. package/dist/lib/template.d.ts.map +1 -1
  92. package/dist/lib/template.js +6 -0
  93. package/dist/lib/template.js.map +1 -1
  94. package/dist/types/config.d.ts +1 -0
  95. package/dist/types/config.d.ts.map +1 -1
  96. package/dist/types/config.js +12 -1
  97. package/dist/types/config.js.map +1 -1
  98. package/dist/types/project.d.ts +1 -1
  99. package/dist/types/project.d.ts.map +1 -1
  100. package/dist/types/project.js +2 -0
  101. package/dist/types/project.js.map +1 -1
  102. package/package.json +4 -4
  103. package/templates/base/agents/base/tsq-architect.md +2 -2
  104. package/templates/base/agents/overlays/domain/mobile/_common.md +13 -0
  105. package/templates/base/knowledge/checklists/plan-quality.md +31 -0
  106. package/templates/base/knowledge/checklists/stability-verification.md +14 -0
  107. package/templates/base/skills/controller/SKILL.md +111 -0
  108. package/templates/base/skills/controller/references/README.md +35 -0
  109. package/templates/base/skills/controller/rules/README.md +18 -0
  110. package/templates/base/skills/mobile/dart/SKILL.md +69 -0
  111. package/templates/base/skills/mobile/dart/rules/async-patterns.md +112 -0
  112. package/templates/base/skills/mobile/dart/rules/code-style.md +96 -0
  113. package/templates/base/skills/mobile/dart/rules/null-safety.md +84 -0
  114. package/templates/base/skills/mobile/dart/rules/type-system.md +111 -0
  115. package/templates/base/skills/mobile/flutter/SKILL.md +89 -0
  116. package/templates/base/skills/mobile/flutter/ci-cd/SKILL.md +82 -0
  117. package/templates/base/skills/mobile/flutter/ci-cd/references/ci-cd-pipeline.md +314 -0
  118. package/templates/base/skills/mobile/flutter/ci-cd/rules/code-signing.md +106 -0
  119. package/templates/base/skills/mobile/flutter/ci-cd/rules/codemagic-setup.md +116 -0
  120. package/templates/base/skills/mobile/flutter/ci-cd/rules/fastlane-setup.md +105 -0
  121. package/templates/base/skills/mobile/flutter/ci-cd/rules/github-actions.md +112 -0
  122. package/templates/base/skills/mobile/flutter/ci-cd/rules/store-deployment.md +106 -0
  123. package/templates/base/skills/mobile/flutter/ci-cd/rules/versioning.md +107 -0
  124. package/templates/base/skills/mobile/flutter/i18n/SKILL.md +78 -0
  125. package/templates/base/skills/mobile/flutter/i18n/references/i18n-architecture.md +225 -0
  126. package/templates/base/skills/mobile/flutter/i18n/rules/arb-files.md +182 -0
  127. package/templates/base/skills/mobile/flutter/i18n/rules/locale-switching.md +226 -0
  128. package/templates/base/skills/mobile/flutter/i18n/rules/localization-setup.md +137 -0
  129. package/templates/base/skills/mobile/flutter/i18n/rules/plural-gender.md +159 -0
  130. package/templates/base/skills/mobile/flutter/i18n/rules/text-direction.md +199 -0
  131. package/templates/base/skills/mobile/flutter/monitoring/SKILL.md +81 -0
  132. package/templates/base/skills/mobile/flutter/monitoring/references/monitoring-architecture.md +269 -0
  133. package/templates/base/skills/mobile/flutter/monitoring/rules/analytics.md +227 -0
  134. package/templates/base/skills/mobile/flutter/monitoring/rules/crashlytics-setup.md +195 -0
  135. package/templates/base/skills/mobile/flutter/monitoring/rules/logging.md +258 -0
  136. package/templates/base/skills/mobile/flutter/monitoring/rules/performance-monitoring.md +248 -0
  137. package/templates/base/skills/mobile/flutter/monitoring/rules/sentry-integration.md +249 -0
  138. package/templates/base/skills/mobile/flutter/networking/SKILL.md +88 -0
  139. package/templates/base/skills/mobile/flutter/networking/references/api-client-architecture.md +305 -0
  140. package/templates/base/skills/mobile/flutter/networking/rules/caching.md +212 -0
  141. package/templates/base/skills/mobile/flutter/networking/rules/connectivity.md +213 -0
  142. package/templates/base/skills/mobile/flutter/networking/rules/dio-setup.md +159 -0
  143. package/templates/base/skills/mobile/flutter/networking/rules/error-handling.md +209 -0
  144. package/templates/base/skills/mobile/flutter/networking/rules/interceptors.md +205 -0
  145. package/templates/base/skills/mobile/flutter/networking/rules/retrofit-patterns.md +194 -0
  146. package/templates/base/skills/mobile/flutter/push-notifications/SKILL.md +87 -0
  147. package/templates/base/skills/mobile/flutter/push-notifications/references/notification-architecture.md +340 -0
  148. package/templates/base/skills/mobile/flutter/push-notifications/references/platform-setup.md +286 -0
  149. package/templates/base/skills/mobile/flutter/push-notifications/rules/background-processing.md +308 -0
  150. package/templates/base/skills/mobile/flutter/push-notifications/rules/deep-linking.md +217 -0
  151. package/templates/base/skills/mobile/flutter/push-notifications/rules/fcm-setup.md +164 -0
  152. package/templates/base/skills/mobile/flutter/push-notifications/rules/local-notifications.md +262 -0
  153. package/templates/base/skills/mobile/flutter/push-notifications/rules/notification-handling.md +210 -0
  154. package/templates/base/skills/mobile/flutter/push-notifications/rules/notification-permissions.md +246 -0
  155. package/templates/base/skills/mobile/flutter/push-notifications/rules/rich-notifications.md +320 -0
  156. package/templates/base/skills/mobile/flutter/references/freezed-patterns.md +162 -0
  157. package/templates/base/skills/mobile/flutter/references/project-structure.md +170 -0
  158. package/templates/base/skills/mobile/flutter/rules/animations.md +112 -0
  159. package/templates/base/skills/mobile/flutter/rules/architecture.md +121 -0
  160. package/templates/base/skills/mobile/flutter/rules/navigation-routing.md +117 -0
  161. package/templates/base/skills/mobile/flutter/rules/performance.md +112 -0
  162. package/templates/base/skills/mobile/flutter/rules/platform-adaptive.md +126 -0
  163. package/templates/base/skills/mobile/flutter/rules/state-management.md +110 -0
  164. package/templates/base/skills/mobile/flutter/rules/testing.md +131 -0
  165. package/templates/base/skills/mobile/flutter/rules/widget-conventions.md +122 -0
  166. package/templates/base/skills/mobile/flutter/security/SKILL.md +86 -0
  167. package/templates/base/skills/mobile/flutter/security/references/mobile-security-checklist.md +168 -0
  168. package/templates/base/skills/mobile/flutter/security/rules/api-key-protection.md +206 -0
  169. package/templates/base/skills/mobile/flutter/security/rules/authentication.md +248 -0
  170. package/templates/base/skills/mobile/flutter/security/rules/data-protection.md +271 -0
  171. package/templates/base/skills/mobile/flutter/security/rules/obfuscation.md +213 -0
  172. package/templates/base/skills/mobile/flutter/security/rules/secure-storage.md +171 -0
  173. package/templates/base/skills/mobile/flutter/security/rules/ssl-pinning.md +197 -0
  174. package/templates/base/skills/stability-verification/SKILL.md +64 -0
  175. package/templates/base/skills/stability-verification/references/release-checklist.md +34 -0
  176. package/templates/base/skills/stability-verification/references/security-fix-patterns.md +112 -0
  177. package/templates/base/skills/stability-verification/rules/verification-layers.md +67 -0
  178. package/templates/base/skills/stability-verification/rules/verification-workflow.md +69 -0
  179. package/templates/base/skills/stability-verification/scripts/verify.sh +294 -0
  180. package/templates/platforms/claude-code/CLAUDE.md.template +25 -0
  181. package/templates/platforms/claude-code/rules/build-gate.md +28 -0
  182. package/templates/platforms/claude-code/rules/completion-verification.md +30 -0
  183. package/templates/platforms/claude-code/rules/context-monitor.md +23 -0
  184. package/templates/platforms/claude-code/rules/plan-review.md +45 -0
  185. package/templates/platforms/claude-code/rules/quality-guards.md +43 -0
  186. package/templates/platforms/claude-code/rules/session-notes.md +18 -0
  187. package/templates/platforms/claude-code/rules/skill-suggest.md +27 -0
  188. package/templates/platforms/claude-code/scripts/build-gate.sh +73 -0
  189. package/templates/platforms/claude-code/scripts/completion-guard.sh +93 -0
  190. package/templates/platforms/claude-code/scripts/phase-guard.sh +79 -0
  191. package/templates/platforms/claude-code/scripts/safe-guard.sh +83 -0
  192. package/templates/platforms/claude-code/scripts/skill-rules.json +85 -0
  193. package/templates/platforms/claude-code/scripts/skill-suggest.sh +105 -0
  194. package/templates/platforms/claude-code/settings.json +111 -3
  195. package/templates/project-types/mobile-app/config.yaml +123 -0
  196. package/templates/project-types/mobile-app/process/workflow.xml +191 -0
@@ -0,0 +1,294 @@
1
+ #!/bin/bash
2
+ # Stability Verification — 6-Layer 자동 검증 오케스트레이터
3
+ #
4
+ # Usage: bash verify.sh [--layer L0-L5] [--skip L0-L5] [--report]
5
+ # Exit: 0=PASS, 1=FAIL
6
+ #
7
+ # 출처: OWASP, ShellCheck Wiki, npm security best practices
8
+
9
+ set -e
10
+
11
+ # ── Colors ──
12
+ RED='\033[0;31m'
13
+ GREEN='\033[0;32m'
14
+ YELLOW='\033[1;33m'
15
+ CYAN='\033[0;36m'
16
+ NC='\033[0m'
17
+
18
+ # ── Args ──
19
+ ONLY_LAYER=""
20
+ SKIP_LAYERS=""
21
+ REPORT_MODE=false
22
+ while [[ $# -gt 0 ]]; do
23
+ case $1 in
24
+ --layer) ONLY_LAYER="$2"; shift 2 ;;
25
+ --skip) SKIP_LAYERS="$SKIP_LAYERS $2"; shift 2 ;;
26
+ --report) REPORT_MODE=true; shift ;;
27
+ *) shift ;;
28
+ esac
29
+ done
30
+
31
+ # ── Helpers ──
32
+ PASS=0
33
+ FAIL=0
34
+ WARN=0
35
+
36
+ layer_header() {
37
+ echo -e "\n${CYAN}━━━ $1 ━━━${NC}"
38
+ }
39
+
40
+ pass() {
41
+ echo -e " ${GREEN}✓${NC} $1"
42
+ PASS=$((PASS + 1))
43
+ }
44
+
45
+ fail() {
46
+ echo -e " ${RED}✗${NC} $1"
47
+ FAIL=$((FAIL + 1))
48
+ }
49
+
50
+ warn() {
51
+ echo -e " ${YELLOW}!${NC} $1"
52
+ WARN=$((WARN + 1))
53
+ }
54
+
55
+ should_run() {
56
+ local layer="$1"
57
+ if [ -n "$ONLY_LAYER" ] && [ "$ONLY_LAYER" != "$layer" ]; then
58
+ return 1
59
+ fi
60
+ if echo "$SKIP_LAYERS" | grep -q "$layer"; then
61
+ return 1
62
+ fi
63
+ return 0
64
+ }
65
+
66
+ # ── Find project root ──
67
+ PROJECT_ROOT="$(pwd)"
68
+ while [ "$PROJECT_ROOT" != "/" ]; do
69
+ if [ -f "$PROJECT_ROOT/package.json" ]; then break; fi
70
+ PROJECT_ROOT="$(dirname "$PROJECT_ROOT")"
71
+ done
72
+ cd "$PROJECT_ROOT"
73
+
74
+ echo -e "${CYAN}Stability Verification${NC} — $(basename "$PROJECT_ROOT")"
75
+ echo "──────────────────────────────────────"
76
+
77
+ # ════════════════════════════════════════
78
+ # L0: 정적 분석
79
+ # ════════════════════════════════════════
80
+ if should_run "L0"; then
81
+ layer_header "L0: 정적 분석 (Syntax/Lint)"
82
+
83
+ # tsc --noEmit
84
+ if [ -f "tsconfig.json" ]; then
85
+ if npx tsc --noEmit 2>&1 | grep -q "error TS"; then
86
+ fail "tsc --noEmit — TypeScript 에러 발견"
87
+ else
88
+ pass "tsc --noEmit"
89
+ fi
90
+ fi
91
+
92
+ # shellcheck
93
+ SH_FILES=$(find . -name '*.sh' -not -path '*/node_modules/*' -not -path '*/.git/*' 2>/dev/null || echo "")
94
+ if [ -n "$SH_FILES" ] && command -v shellcheck &>/dev/null; then
95
+ SC_RESULT=$(echo "$SH_FILES" | xargs shellcheck --severity=warning 2>&1 || true)
96
+ SC_ERRORS=$(echo "$SC_RESULT" | grep -c "^In " 2>/dev/null || echo "0")
97
+ if [ "$SC_ERRORS" -gt 0 ]; then
98
+ warn "shellcheck — ${SC_ERRORS}개 파일에서 경고 발견"
99
+ else
100
+ pass "shellcheck"
101
+ fi
102
+ fi
103
+
104
+ # bash -n
105
+ BASH_FAIL=0
106
+ for f in $SH_FILES; do
107
+ bash -n "$f" 2>/dev/null || { BASH_FAIL=$((BASH_FAIL + 1)); }
108
+ done
109
+ if [ "$BASH_FAIL" -gt 0 ]; then
110
+ fail "bash -n — ${BASH_FAIL}개 파일 구문 에러"
111
+ else
112
+ pass "bash -n (전체 .sh)"
113
+ fi
114
+
115
+ # JSON validation
116
+ JSON_FILES=$(find . -name '*.json' -not -path '*/node_modules/*' -not -path '*/.git/*' -not -path '*/dist/*' 2>/dev/null || echo "")
117
+ JSON_FAIL=0
118
+ for f in $JSON_FILES; do
119
+ jq empty < "$f" 2>/dev/null || { JSON_FAIL=$((JSON_FAIL + 1)); }
120
+ done
121
+ if [ "$JSON_FAIL" -gt 0 ]; then
122
+ fail "JSON — ${JSON_FAIL}개 파일 구문 에러"
123
+ else
124
+ pass "JSON 유효성 ($(echo "$JSON_FILES" | wc -w | tr -d ' ')개)"
125
+ fi
126
+ fi
127
+
128
+ # ════════════════════════════════════════
129
+ # L1: 유닛 테스트
130
+ # ════════════════════════════════════════
131
+ if should_run "L1"; then
132
+ layer_header "L1: 유닛 테스트"
133
+
134
+ TEST_OUTPUT=$(npm run test:unit 2>&1 || true)
135
+ if echo "$TEST_OUTPUT" | grep -q "passed"; then
136
+ TEST_COUNT=$(echo "$TEST_OUTPUT" | grep "Tests" | grep -oE '[0-9]+ passed' || echo "? passed")
137
+ pass "test:unit — $TEST_COUNT"
138
+ else
139
+ fail "test:unit — 실패"
140
+ fi
141
+ fi
142
+
143
+ # ════════════════════════════════════════
144
+ # L2: 보안 스캔
145
+ # ════════════════════════════════════════
146
+ if should_run "L2"; then
147
+ layer_header "L2: 보안 스캔"
148
+
149
+ # npm audit (production dependencies only — devDeps are warn-only)
150
+ AUDIT_PROD=$(npm audit --omit=dev 2>&1 || true)
151
+ if echo "$AUDIT_PROD" | grep -q "found 0 vulnerabilities"; then
152
+ pass "npm audit (prod)"
153
+ elif echo "$AUDIT_PROD" | grep -qiE "high|critical"; then
154
+ fail "npm audit (prod) — high/critical 취약점 발견"
155
+ else
156
+ warn "npm audit (prod) — moderate/low 취약점 존재"
157
+ fi
158
+
159
+ # npm audit (dev — warn only, ReDoS in eslint/vitest chain is common)
160
+ AUDIT_FULL=$(npm audit 2>&1 || true)
161
+ AUDIT_DEV_COUNT=$(echo "$AUDIT_FULL" | grep -oE '[0-9]+ vulnerabilities' | grep -oE '[0-9]+' || echo "0")
162
+ if [ "$AUDIT_DEV_COUNT" -gt 0 ] 2>/dev/null; then
163
+ warn "npm audit (dev) — ${AUDIT_DEV_COUNT}개 취약점 (devDependencies)"
164
+ fi
165
+
166
+ # execSync injection check
167
+ EXEC_SYNC=$(grep -rn 'execSync(' src/ 2>/dev/null | grep -v 'gh --version' | grep -v '\.test\.' || true)
168
+ if [ -n "$EXEC_SYNC" ]; then
169
+ # 변수 보간 확인 (template literal 또는 string concat)
170
+ INJECTION=$(echo "$EXEC_SYNC" | grep -E '\$\{|` \+' || true)
171
+ if [ -n "$INJECTION" ]; then
172
+ fail "execSync 커맨드 인젝션 의심: $(echo "$INJECTION" | wc -l | tr -d ' ')건"
173
+ else
174
+ pass "execSync — 변수 보간 없음"
175
+ fi
176
+ else
177
+ pass "execSync — 미사용 또는 상수만 사용"
178
+ fi
179
+
180
+ # eval check
181
+ EVAL_USAGE=$(grep -rn 'eval ' templates/**/*.sh scripts/**/*.sh 2>/dev/null | grep -v '^\s*#' || true)
182
+ if [ -n "$EVAL_USAGE" ]; then
183
+ fail "eval 사용 발견: $(echo "$EVAL_USAGE" | wc -l | tr -d ' ')건"
184
+ else
185
+ pass "eval 미사용"
186
+ fi
187
+
188
+ # .gitignore security
189
+ if [ -f ".gitignore" ]; then
190
+ MISSING=""
191
+ grep -q '\.env' .gitignore 2>/dev/null || MISSING="$MISSING .env"
192
+ grep -q '\*.pem' .gitignore 2>/dev/null || MISSING="$MISSING *.pem"
193
+ grep -q '\*.key' .gitignore 2>/dev/null || MISSING="$MISSING *.key"
194
+ if [ -n "$MISSING" ]; then
195
+ warn ".gitignore 보안 항목 누락:$MISSING"
196
+ else
197
+ pass ".gitignore 보안 항목"
198
+ fi
199
+ fi
200
+ fi
201
+
202
+ # ════════════════════════════════════════
203
+ # L3: 쉘 스크립트 테스트
204
+ # ════════════════════════════════════════
205
+ if should_run "L3"; then
206
+ layer_header "L3: 쉘 스크립트 테스트"
207
+
208
+ HOOK_DIR="templates/platforms/claude-code/scripts"
209
+ if [ -d "$HOOK_DIR" ]; then
210
+ HOOK_SCRIPTS=$(find "$HOOK_DIR" -name '*.sh' 2>/dev/null || echo "")
211
+ L3_FAIL=0
212
+
213
+ for script in $HOOK_SCRIPTS; do
214
+ NAME=$(basename "$script" .sh)
215
+
216
+ # malformed JSON → fail-open
217
+ RESULT=$(echo "not json" | bash "$script" 2>/dev/null || true)
218
+ EXIT=$?
219
+ if [ $EXIT -ne 0 ]; then
220
+ fail "$NAME — malformed JSON 시 crash (exit $EXIT)"
221
+ L3_FAIL=$((L3_FAIL + 1))
222
+ fi
223
+
224
+ # empty stdin → fail-open
225
+ RESULT=$(echo "" | bash "$script" 2>/dev/null || true)
226
+ EXIT=$?
227
+ if [ $EXIT -ne 0 ]; then
228
+ fail "$NAME — empty stdin 시 crash"
229
+ L3_FAIL=$((L3_FAIL + 1))
230
+ fi
231
+ done
232
+
233
+ if [ $L3_FAIL -eq 0 ]; then
234
+ pass "훅 스크립트 fail-open 검증 ($(echo "$HOOK_SCRIPTS" | wc -w | tr -d ' ')개)"
235
+ fi
236
+ else
237
+ warn "훅 스크립트 디렉토리 없음: $HOOK_DIR"
238
+ fi
239
+ fi
240
+
241
+ # ════════════════════════════════════════
242
+ # L5: 패키지 무결성
243
+ # ════════════════════════════════════════
244
+ if should_run "L5"; then
245
+ layer_header "L5: 패키지 무결성"
246
+
247
+ # Build
248
+ BUILD_OUTPUT=$(npm run build 2>&1 || true)
249
+ if echo "$BUILD_OUTPUT" | grep -q "error TS"; then
250
+ fail "npm run build — TypeScript 에러"
251
+ else
252
+ pass "npm run build"
253
+ fi
254
+
255
+ # Version
256
+ if [ -f "bin/tsq.js" ]; then
257
+ VER=$(node bin/tsq.js --version 2>/dev/null || echo "FAIL")
258
+ if [ "$VER" != "FAIL" ]; then
259
+ pass "CLI version: $VER"
260
+ else
261
+ fail "CLI version 출력 실패"
262
+ fi
263
+ fi
264
+
265
+ # npm pack
266
+ PACK_OUTPUT=$(npm pack --dry-run 2>&1)
267
+ if echo "$PACK_OUTPUT" | grep -qiE '\.env|\.key.*\.pem|credential'; then
268
+ fail "npm pack — 민감 파일 포함"
269
+ else
270
+ pass "npm pack — 민감 파일 미포함"
271
+ fi
272
+
273
+ # domains/ exclusion
274
+ if echo "$PACK_OUTPUT" | grep -q "templates/domains/"; then
275
+ fail "npm pack — templates/domains/ 포함 (유료 콘텐츠)"
276
+ else
277
+ pass "npm pack — templates/domains/ 제외"
278
+ fi
279
+ fi
280
+
281
+ # ════════════════════════════════════════
282
+ # Summary
283
+ # ════════════════════════════════════════
284
+ echo ""
285
+ echo "──────────────────────────────────────"
286
+ echo -e " ${GREEN}PASS: $PASS${NC} ${RED}FAIL: $FAIL${NC} ${YELLOW}WARN: $WARN${NC}"
287
+
288
+ if [ $FAIL -gt 0 ]; then
289
+ echo -e "\n${RED}VERIFICATION FAILED${NC} — $FAIL개 항목 실패"
290
+ exit 1
291
+ else
292
+ echo -e "\n${GREEN}VERIFICATION PASSED${NC}"
293
+ exit 0
294
+ fi
@@ -37,10 +37,35 @@
37
37
 
38
38
  ## 서브에이전트 위임 규칙
39
39
 
40
+ <rules>
41
+ <must>서브에이전트 위임은 controller skill의 프로세스를 따를 것</must>
42
+ <must>위임 전 해당 에이전트의 prerequisites가 compiled spec으로 존재하는지 확인</must>
43
+ <must>compiled spec의 stale 여부를 .compile-manifest.json으로 확인</must>
44
+ <must-not>controller 우회하여 Task() 직접 호출</must-not>
45
+ <must-not>compiled spec 없이 서브에이전트 실행</must-not>
46
+ </rules>
47
+
40
48
  {{DELEGATION_RULES}}
41
49
 
42
50
  ---
43
51
 
52
+ ## 작업 모드 분류
53
+
54
+ <task-classification>
55
+ 사용자가 `tsq f` 또는 `tsq q` 없이 직접 작업을 지시하면, 실행 전에 반드시 모드를 분류한다.
56
+
57
+ <quick-indicators>CSS, 스타일, 오타, typo, 색상, 텍스트, 변수명, 간단한 버그, 1-2줄 수정</quick-indicators>
58
+ <full-indicators>새 기능, API, DB, 구조 변경, 인증, 아키텍처, 리팩토링, 여러 파일 수정</full-indicators>
59
+
60
+ <rules>
61
+ <must>Full로 판단되면 사용자에게 확인 후 진행:
62
+ "이 작업은 Full 모드로 진행합니다 (SSOT 검증 + controller 경유). 진행할까요?"</must>
63
+ <must>Quick으로 판단되면 바로 진행하되 모드를 명시:
64
+ "Quick 모드로 바로 진행합니다."</must>
65
+ <must>판단이 모호하면 사용자에게 선택지를 제시</must>
66
+ </rules>
67
+ </task-classification>
68
+
44
69
  ## 작업 원칙
45
70
 
46
71
  1. 요구사항에 여러 해석이 가능하면 조용히 선택하지 말고 **선택지를 제시**하라
@@ -0,0 +1,28 @@
1
+ ---
2
+ description: 빌드 게이트. 변경 파일의 TypeScript 에러를 자동 감지하여 완료 차단.
3
+ globs:
4
+ - "src/**/*.ts"
5
+ - "src/**/*.tsx"
6
+ ---
7
+
8
+ # 빌드 게이트 (Build Gate)
9
+
10
+ ## 자동 검증
11
+
12
+ 매 턴 종료 시 변경된 TypeScript 파일에 대해 `tsc --noEmit`을 실행합니다.
13
+ - 변경 파일에 에러가 있으면 **완료를 차단**하고 에러 목록을 제공
14
+ - 기존 파일의 pre-existing 에러는 무시 (변경 파일만 필터링)
15
+ - `stop_hook_active` 플래그로 1회만 차단 (무한루프 방지)
16
+
17
+ ## 블로킹 수신 시 대응
18
+
19
+ `[Build Gate]` 블로킹 메시지를 받으면:
20
+ 1. 제시된 TypeScript 에러를 확인하세요
21
+ 2. 해당 파일을 열어 에러를 수정하세요
22
+ 3. 수정 후 작업을 마무리하세요
23
+
24
+ ## 참고
25
+
26
+ - 전체 `tsc --noEmit` 실행 (incremental 가능)
27
+ - 변경 파일 감지: `git diff --name-only HEAD -- '*.ts' '*.tsx'`
28
+ - 타임아웃: 30초
@@ -0,0 +1,30 @@
1
+ ---
2
+ description: 완료 검증 루프. 자기 보고 금지, exit code로 완료 판정.
3
+ globs:
4
+ - "**/*"
5
+ ---
6
+
7
+ # 완료 검증 루프 (Completion Verification)
8
+
9
+ ## 원칙: 자기 보고 금지
10
+
11
+ "작업을 완료했습니다"라고 자체 판단하지 마세요. 객관적 증거(테스트 exit code)가 완료를 판정합니다.
12
+
13
+ ## 자동 검증 (Stop Hook)
14
+
15
+ Implementation phase에서 턴이 종료될 때:
16
+ 1. 세션 내 Bash 명령 실행 이력 확인
17
+ 2. 테스트가 한 번도 실행되지 않았으면 **블로킹** — 강제로 테스트 실행 요구
18
+ 3. `stop_hook_active` 플래그로 1회만 블로킹 (무한루프 방지)
19
+
20
+ ## 블로킹 수신 시 대응
21
+
22
+ `[Completion Guard]` 블로킹 메시지를 받으면:
23
+ 1. 프로젝트의 테스트 명령을 실행하세요 (`npm test`, `pytest` 등)
24
+ 2. 실패한 테스트가 있으면 수정하세요
25
+ 3. 모든 테스트 통과 후 작업을 마무리하세요
26
+
27
+ ## 참고
28
+
29
+ - Planning/Design phase에서는 블로킹하지 않음 (코드 변경이 없으므로)
30
+ - 세션 컨텍스트(`[Session]`)는 블로킹 여부와 무관하게 항상 주입됨
@@ -0,0 +1,23 @@
1
+ ---
2
+ description: 컨텍스트 윈도우 모니터. 85% 임계값 도달 시 사전 대응.
3
+ globs:
4
+ - ".timsquad/.daemon/**"
5
+ ---
6
+
7
+ # 컨텍스트 윈도우 모니터 (Context Window Monitor)
8
+
9
+ ## 자동 감지
10
+ 매 턴 종료 시 `[Session]` 메시지에 컨텍스트 사용률이 포함됩니다.
11
+ - 70% 이상: `Ctx: XX%` 표시
12
+ - 85% 이상: 경고 메시지 발생
13
+
14
+ ## 85% 경고 수신 시 대응 절차
15
+ 1. **현재 태스크 상태 기록**: 진행 중인 작업, 결정사항, 다음 단계를 정리
16
+ 2. **서브에이전트 완료 대기**: 활성 서브에이전트가 있으면 완료 후 정리
17
+ 3. **태스크 마무리**: 현재 태스크를 가능한 완료 지점까지 진행
18
+ 4. **컨텍스트 압축 대비**: 자동 압축 후에도 `[Session]` 메시지로 상태 복원 가능
19
+
20
+ ## 참고
21
+ - 기본 컨텍스트 윈도우: 200K 토큰 (Sonnet 기준)
22
+ - 자동 압축은 75-95% 사이에서 발생 (Claude Code 내부 휴리스틱)
23
+ - 사용률은 최신 턴의 input 토큰 기준 (누적 아님)
@@ -0,0 +1,45 @@
1
+ ---
2
+ description: 계획 품질 검증 루프. Full Mode에서 구현 전 필수 수행.
3
+ globs:
4
+ - ".timsquad/ssot/**"
5
+ - ".timsquad/state/**"
6
+ ---
7
+
8
+ # 계획 품질 검증 (Plan Review Protocol)
9
+
10
+ ## 언제 수행하나
11
+ `tsq f`로 Full Mode 진입 시, SSOT 체크 후 / 에이전트 위임 전.
12
+
13
+ ## 검증 축 (3-Axis Plan Review)
14
+
15
+ ### Axis P1: 요구사항 명확성
16
+ - 태스크가 구체적 행동(what)과 완료 조건(done-when)을 포함하는가
17
+ - 모호한 용어 없이 검증 가능한 기준이 있는가
18
+ - SSOT 문서(requirements.md, functional-spec.md)에 근거가 있는가
19
+
20
+ ### Axis P2: 기술 분해 품질
21
+ - 단일 시퀀스로 완료 가능한 크기인가 (아니면 분할 필요)
22
+ - 에이전트 위임이 명확한가 (developer/dba/qa 중 누구에게)
23
+ - 의존성 순서가 올바른가 (DB 먼저 → API → 프론트 등)
24
+
25
+ ### Axis P3: 리스크 & 빠진 것
26
+ - 기존 코드에 영향을 주는 부분이 식별되었는가
27
+ - 에러/엣지 케이스 대응이 계획에 포함되었는가
28
+ - 보안/성능 고려사항이 누락되지 않았는가
29
+
30
+ ## 검증 결과 분류
31
+
32
+ | 결과 | 조건 | 액션 |
33
+ |------|------|------|
34
+ | ✅ PASS | 3축 모두 충족 | 구현 진행 |
35
+ | 🔄 REVISE (1/2) | 1-2축 미충족, 자체 보완 가능 | PM이 계획 보완 후 재검증 |
36
+ | ❌ ESCALATE | 3축 미충족 or 2회 재검토 후에도 미충족 | 사용자에게 확인 요청 (L3) |
37
+
38
+ ## 재검토 규칙
39
+ - 최대 2회 재검토 (iteration 1 → 2 → 실패 시 ESCALATE)
40
+ - 매 재검토마다 어떤 축이 미충족인지 명시
41
+ - REVISE 시 SSOT 보완이 필요하면 먼저 SSOT 수정 후 재검증
42
+ - 2회 이내 PASS 시 "Plan Review: PASS (iteration N)" 기록 후 진행
43
+
44
+ ## 상세 체크 항목
45
+ knowledge/checklists/plan-quality.md 참조.
@@ -0,0 +1,43 @@
1
+ ---
2
+ description: 품질 가드 시스템. 파괴적 명령 차단, 페이즈 제한, 완료 검증.
3
+ globs:
4
+ - "**/*"
5
+ ---
6
+
7
+ # 품질 가드 시스템 (Quality Guards)
8
+
9
+ ## 가드 목록
10
+
11
+ ### 1. Safe Guard (PreToolUse/Bash)
12
+ Bash 명령 실행 전 파괴적 명령을 차단합니다.
13
+
14
+ **차단 (DENY)**:
15
+ - `rm -rf /` — 루트 삭제
16
+ - `git push --force` (main/master) — force push
17
+ - `git reset --hard` — 커밋되지 않은 변경 유실
18
+ - `DROP TABLE`, `TRUNCATE TABLE` — 데이터 파괴
19
+ - `chmod 777` — 보안 위반
20
+
21
+ **확인 요청 (ASK)**:
22
+ - `npm publish` — 패키지 배포
23
+ - `git push` (main/master) — 메인 브랜치 push
24
+ - `rm -rf` (일반) — 재귀 삭제
25
+
26
+ ### 2. Phase Guard (PreToolUse/Write|Edit)
27
+ 페이즈에 따라 파일 수정을 제한합니다.
28
+
29
+ - **planning/design**: `src/`, `lib/`, `app/` 등 코드 수정 차단
30
+ - **implementation**: `.timsquad/ssot/` 직접 수정 차단
31
+
32
+ ### 3. Completion Guard (Stop)
33
+ 매 턴 종료 시 세션 컨텍스트를 주입하고, 필요 시 경고합니다.
34
+
35
+ - 세션 상태 (턴, 도구, 에이전트, 파일) 주입
36
+ - implementation phase에서 테스트 미실행 경고
37
+ - 컨텍스트 윈도우 85% 이상 시 경고
38
+
39
+ ## 가드가 차단한 경우
40
+
41
+ 1. **DENY된 경우**: 차단 사유를 확인하고 안전한 대안을 사용하세요
42
+ 2. **ASK로 에스컬레이션된 경우**: 사용자에게 확인을 요청합니다
43
+ 3. **Phase 제한인 경우**: 현재 페이즈에 맞는 작업을 수행하세요
@@ -0,0 +1,18 @@
1
+ ---
2
+ description: 컨텍스트 생존 메모. 세션 압축 후 작업 연속성 유지.
3
+ globs:
4
+ - ".timsquad/.daemon/**"
5
+ ---
6
+
7
+ # 세션 컨텍스트 복원 (Session Notes)
8
+
9
+ ## 자동 주입
10
+ 매 턴 종료 시 `[Session]` 시스템 메시지가 자동 주입됩니다.
11
+ - 현재 턴 번호, 도구 사용 횟수, 활성 서브에이전트, 최근 수정 파일
12
+
13
+ ## 압축 감지 후 대응
14
+ 컨텍스트가 압축된 것 같으면 (이전 대화 내용이 요약되어 있으면):
15
+ 1. `[Session]` 메시지의 턴/도구/에이전트 정보로 현재 진행 상태 파악
16
+ 2. 필요 시 `.timsquad/.daemon/session-notes.jsonl`을 직접 읽어 이전 턴 이력 확인
17
+ 3. 최근 수정 파일들을 Read로 다시 확인하여 작업 컨텍스트 복원
18
+ 4. `.timsquad/logs/sessions/` 하위 세션 로그에서 상세 이벤트 확인 가능
@@ -0,0 +1,27 @@
1
+ ---
2
+ description: 런타임 스킬 제안. 프롬프트 분석 후 관련 스킬 자동 추천.
3
+ globs:
4
+ - "**/*"
5
+ ---
6
+
7
+ # 런타임 스킬 제안 (Skill Suggest)
8
+
9
+ ## 자동 감지
10
+
11
+ 매 프롬프트 제출 시 `[Skill Suggest]` 메시지가 주입될 수 있습니다.
12
+ - 사용자 프롬프트의 키워드/패턴을 분석하여 관련 스킬 추천
13
+ - 배포된 스킬만 추천 (프로젝트에 없는 스킬은 무시)
14
+
15
+ ## 제안 수신 시 대응
16
+
17
+ `[Skill Suggest] 관련 스킬이 감지되었습니다: ...` 메시지를 받으면:
18
+ 1. 추천된 스킬의 `rules/` 디렉토리를 확인하세요
19
+ 2. 현재 태스크에 관련된 규칙을 참조하여 품질을 높이세요
20
+ 3. 스킬이 현재 작업과 무관하면 무시해도 됩니다
21
+
22
+ ## 스킬 규칙 위치
23
+
24
+ 배포된 스킬: `.claude/skills/{skill-name}/`
25
+ - `SKILL.md` — 스킬 개요
26
+ - `rules/` — 구체적 규칙 (on-demand 참조)
27
+ - `references/` — 참고 자료
@@ -0,0 +1,73 @@
1
+ #!/bin/bash
2
+ # Build Gate — Stop Hook
3
+ # 변경된 TypeScript 파일에 tsc 에러가 있으면 완료를 차단한다.
4
+ # 변경 파일만 필터링하여 기존 에러는 무시.
5
+ #
6
+ # Input: JSON via stdin (Claude Code hook protocol)
7
+ # Output: JSON with decision (block) or empty
8
+
9
+ set -e
10
+
11
+ # ── 0. Stop hook loop prevention ──
12
+ INPUT=$(cat 2>/dev/null || echo "")
13
+ STOP_HOOK_ACTIVE=$(echo "$INPUT" | jq -r '.stop_hook_active // false' 2>/dev/null || echo "false")
14
+ if [ "$STOP_HOOK_ACTIVE" = "true" ]; then
15
+ exit 0
16
+ fi
17
+
18
+ # Find project root
19
+ PROJECT_ROOT="$(pwd)"
20
+ while [ "$PROJECT_ROOT" != "/" ]; do
21
+ if [ -d "$PROJECT_ROOT/.timsquad" ]; then
22
+ break
23
+ fi
24
+ PROJECT_ROOT="$(dirname "$PROJECT_ROOT")"
25
+ done
26
+
27
+ if [ ! -d "$PROJECT_ROOT/.timsquad" ]; then
28
+ exit 0
29
+ fi
30
+
31
+ # ── 1. Get changed TypeScript files ──
32
+ cd "$PROJECT_ROOT"
33
+ CHANGED_TS=$(git diff --name-only --diff-filter=ACMR HEAD -- '*.ts' '*.tsx' 2>/dev/null || echo "")
34
+
35
+ # No TypeScript files changed → pass
36
+ if [ -z "$CHANGED_TS" ]; then
37
+ exit 0
38
+ fi
39
+
40
+ # ── 2. Run tsc --noEmit ──
41
+ TSC_OUTPUT=$(npx tsc --noEmit 2>&1 || true)
42
+
43
+ # tsc passed → allow stop
44
+ if [ -z "$TSC_OUTPUT" ]; then
45
+ exit 0
46
+ fi
47
+
48
+ # ── 3. Filter errors to changed files only ──
49
+ RELEVANT_ERRORS=""
50
+ while IFS= read -r file; do
51
+ # tsc 에러 형식: src/foo.ts(12,5): error TS2345: ...
52
+ FILE_ERRORS=$(echo "$TSC_OUTPUT" | grep -F -- "$file" 2>/dev/null || true)
53
+ if [ -n "$FILE_ERRORS" ]; then
54
+ RELEVANT_ERRORS="${RELEVANT_ERRORS}${FILE_ERRORS}
55
+ "
56
+ fi
57
+ done <<< "$CHANGED_TS"
58
+
59
+ # No errors in changed files → pre-existing errors, ignore
60
+ if [ -z "$RELEVANT_ERRORS" ]; then
61
+ exit 0
62
+ fi
63
+
64
+ # ── 4. Block with error details ──
65
+ # 에러 수 계산
66
+ ERROR_COUNT=$(echo "$RELEVANT_ERRORS" | grep -c "error TS" 2>/dev/null || echo "0")
67
+
68
+ REASON="[Build Gate] 변경된 파일에 TypeScript 에러 ${ERROR_COUNT}개가 있습니다. 수정 후 완료하세요.
69
+
70
+ ${RELEVANT_ERRORS}"
71
+
72
+ jq -n --arg reason "$REASON" '{"decision": "block", "reason": $reason}'
73
+ exit 0