@uzysjung/agent-harness 26.83.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 (212) hide show
  1. package/LICENSE +21 -0
  2. package/README.ko.md +279 -0
  3. package/README.md +306 -0
  4. package/dist/chunk-SDVAM5JZ.js +775 -0
  5. package/dist/chunk-SDVAM5JZ.js.map +1 -0
  6. package/dist/index.js +5412 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/trust-tier-drift.js +67 -0
  9. package/dist/trust-tier-drift.js.map +1 -0
  10. package/package.json +53 -0
  11. package/scripts/prune-ecc.sh +310 -0
  12. package/templates/CLAUDE.md +86 -0
  13. package/templates/agents/build-error-resolver.md +114 -0
  14. package/templates/agents/code-reviewer.md +237 -0
  15. package/templates/agents/data-analyst.md +69 -0
  16. package/templates/agents/plan-checker.md +118 -0
  17. package/templates/agents/reviewer.md +128 -0
  18. package/templates/agents/security-reviewer.md +108 -0
  19. package/templates/agents/silent-failure-hunter.md +50 -0
  20. package/templates/agents/strategist.md +86 -0
  21. package/templates/antigravity/AGENTS.md.template +58 -0
  22. package/templates/codex/AGENTS.md.template +94 -0
  23. package/templates/codex/README.md +69 -0
  24. package/templates/codex/config.toml.template +108 -0
  25. package/templates/codex/hooks/README.md +40 -0
  26. package/templates/codex/hooks/gate-check.sh +7 -0
  27. package/templates/codex/hooks/hito-counter.sh +7 -0
  28. package/templates/codex/hooks/session-start.sh +7 -0
  29. package/templates/codex/hooks/uncommitted-check.sh +7 -0
  30. package/templates/codex/skills/uzys-build/SKILL.md +24 -0
  31. package/templates/codex/skills/uzys-plan/SKILL.md +24 -0
  32. package/templates/codex/skills/uzys-review/SKILL.md +24 -0
  33. package/templates/codex/skills/uzys-ship/SKILL.md +24 -0
  34. package/templates/codex/skills/uzys-spec/SKILL.md +28 -0
  35. package/templates/codex/skills/uzys-test/SKILL.md +24 -0
  36. package/templates/commands/ecc/checkpoint.md +32 -0
  37. package/templates/commands/ecc/e2e.md +105 -0
  38. package/templates/commands/ecc/eval.md +88 -0
  39. package/templates/commands/ecc/evolve.md +7 -0
  40. package/templates/commands/ecc/harness-audit.md +73 -0
  41. package/templates/commands/ecc/instinct-status.md +8 -0
  42. package/templates/commands/ecc/promote.md +10 -0
  43. package/templates/commands/ecc/security-scan.md +10 -0
  44. package/templates/commands/uzys/auto.md +190 -0
  45. package/templates/commands/uzys/build.md +42 -0
  46. package/templates/commands/uzys/plan.md +55 -0
  47. package/templates/commands/uzys/review.md +44 -0
  48. package/templates/commands/uzys/ship.md +49 -0
  49. package/templates/commands/uzys/spec.md +93 -0
  50. package/templates/commands/uzys/test.md +58 -0
  51. package/templates/docs/PLAN.template.md +102 -0
  52. package/templates/hooks/agentshield-gate.sh +101 -0
  53. package/templates/hooks/checkpoint-snapshot.sh +115 -0
  54. package/templates/hooks/gate-check.sh +138 -0
  55. package/templates/hooks/hito-counter.sh +26 -0
  56. package/templates/hooks/karpathy-gate.sh +59 -0
  57. package/templates/hooks/mcp-pre-exec.sh +104 -0
  58. package/templates/hooks/protect-files.sh +41 -0
  59. package/templates/hooks/session-start.sh +40 -0
  60. package/templates/hooks/spec-drift-check.sh +86 -0
  61. package/templates/mcp-allowlist.example +24 -0
  62. package/templates/mcp.json +20 -0
  63. package/templates/opencode/.opencode/commands/uzys-build.md +22 -0
  64. package/templates/opencode/.opencode/commands/uzys-plan.md +22 -0
  65. package/templates/opencode/.opencode/commands/uzys-review.md +22 -0
  66. package/templates/opencode/.opencode/commands/uzys-ship.md +22 -0
  67. package/templates/opencode/.opencode/commands/uzys-spec.md +28 -0
  68. package/templates/opencode/.opencode/commands/uzys-test.md +22 -0
  69. package/templates/opencode/.opencode/plugins/uzys-harness.ts +146 -0
  70. package/templates/opencode/AGENTS.md.template +98 -0
  71. package/templates/opencode/README.md +34 -0
  72. package/templates/opencode/opencode.json.template +42 -0
  73. package/templates/project-claude/_base.md +23 -0
  74. package/templates/project-claude/fragments/csr-fastapi/active-rules.md +13 -0
  75. package/templates/project-claude/fragments/csr-fastapi/agents.md +5 -0
  76. package/templates/project-claude/fragments/csr-fastapi/boundaries.md +18 -0
  77. package/templates/project-claude/fragments/csr-fastapi/commands.md +6 -0
  78. package/templates/project-claude/fragments/csr-fastapi/plugins.md +2 -0
  79. package/templates/project-claude/fragments/csr-fastapi/skills.md +5 -0
  80. package/templates/project-claude/fragments/csr-fastapi/stack.md +6 -0
  81. package/templates/project-claude/fragments/csr-fastapi/tagline.md +1 -0
  82. package/templates/project-claude/fragments/csr-fastapi/workflow.md +8 -0
  83. package/templates/project-claude/fragments/csr-fastify/active-rules.md +13 -0
  84. package/templates/project-claude/fragments/csr-fastify/agents.md +5 -0
  85. package/templates/project-claude/fragments/csr-fastify/boundaries.md +18 -0
  86. package/templates/project-claude/fragments/csr-fastify/commands.md +6 -0
  87. package/templates/project-claude/fragments/csr-fastify/plugins.md +2 -0
  88. package/templates/project-claude/fragments/csr-fastify/skills.md +5 -0
  89. package/templates/project-claude/fragments/csr-fastify/stack.md +6 -0
  90. package/templates/project-claude/fragments/csr-fastify/tagline.md +1 -0
  91. package/templates/project-claude/fragments/csr-fastify/workflow.md +8 -0
  92. package/templates/project-claude/fragments/csr-supabase/active-rules.md +12 -0
  93. package/templates/project-claude/fragments/csr-supabase/agents.md +5 -0
  94. package/templates/project-claude/fragments/csr-supabase/boundaries.md +19 -0
  95. package/templates/project-claude/fragments/csr-supabase/commands.md +6 -0
  96. package/templates/project-claude/fragments/csr-supabase/plugins.md +4 -0
  97. package/templates/project-claude/fragments/csr-supabase/skills.md +7 -0
  98. package/templates/project-claude/fragments/csr-supabase/stack.md +6 -0
  99. package/templates/project-claude/fragments/csr-supabase/supabase-auth.md +21 -0
  100. package/templates/project-claude/fragments/csr-supabase/tagline.md +1 -0
  101. package/templates/project-claude/fragments/csr-supabase/workflow.md +8 -0
  102. package/templates/project-claude/fragments/data/active-rules.md +10 -0
  103. package/templates/project-claude/fragments/data/agents.md +6 -0
  104. package/templates/project-claude/fragments/data/boundaries.md +20 -0
  105. package/templates/project-claude/fragments/data/commands.md +6 -0
  106. package/templates/project-claude/fragments/data/plugins.md +2 -0
  107. package/templates/project-claude/fragments/data/skills.md +3 -0
  108. package/templates/project-claude/fragments/data/stack.md +7 -0
  109. package/templates/project-claude/fragments/data/tagline.md +1 -0
  110. package/templates/project-claude/fragments/data/workflow.md +9 -0
  111. package/templates/project-claude/fragments/executive/active-rules.md +6 -0
  112. package/templates/project-claude/fragments/executive/agents.md +6 -0
  113. package/templates/project-claude/fragments/executive/boundaries.md +17 -0
  114. package/templates/project-claude/fragments/executive/commands.md +11 -0
  115. package/templates/project-claude/fragments/executive/plugins.md +1 -0
  116. package/templates/project-claude/fragments/executive/skills.md +7 -0
  117. package/templates/project-claude/fragments/executive/stack.md +4 -0
  118. package/templates/project-claude/fragments/executive/tagline.md +1 -0
  119. package/templates/project-claude/fragments/executive/workflow.md +10 -0
  120. package/templates/project-claude/fragments/growth-marketing/active-rules.md +7 -0
  121. package/templates/project-claude/fragments/growth-marketing/agents.md +6 -0
  122. package/templates/project-claude/fragments/growth-marketing/boundaries.md +17 -0
  123. package/templates/project-claude/fragments/growth-marketing/commands.md +11 -0
  124. package/templates/project-claude/fragments/growth-marketing/plugins.md +9 -0
  125. package/templates/project-claude/fragments/growth-marketing/skills.md +8 -0
  126. package/templates/project-claude/fragments/growth-marketing/stack.md +7 -0
  127. package/templates/project-claude/fragments/growth-marketing/tagline.md +1 -0
  128. package/templates/project-claude/fragments/growth-marketing/workflow.md +11 -0
  129. package/templates/project-claude/fragments/project-management/active-rules.md +7 -0
  130. package/templates/project-claude/fragments/project-management/agents.md +6 -0
  131. package/templates/project-claude/fragments/project-management/boundaries.md +16 -0
  132. package/templates/project-claude/fragments/project-management/commands.md +10 -0
  133. package/templates/project-claude/fragments/project-management/plugins.md +6 -0
  134. package/templates/project-claude/fragments/project-management/skills.md +5 -0
  135. package/templates/project-claude/fragments/project-management/stack.md +4 -0
  136. package/templates/project-claude/fragments/project-management/tagline.md +1 -0
  137. package/templates/project-claude/fragments/project-management/workflow.md +12 -0
  138. package/templates/project-claude/fragments/ssr-htmx/active-rules.md +11 -0
  139. package/templates/project-claude/fragments/ssr-htmx/agents.md +5 -0
  140. package/templates/project-claude/fragments/ssr-htmx/boundaries.md +20 -0
  141. package/templates/project-claude/fragments/ssr-htmx/commands.md +6 -0
  142. package/templates/project-claude/fragments/ssr-htmx/plugins.md +2 -0
  143. package/templates/project-claude/fragments/ssr-htmx/skills.md +3 -0
  144. package/templates/project-claude/fragments/ssr-htmx/stack.md +6 -0
  145. package/templates/project-claude/fragments/ssr-htmx/tagline.md +1 -0
  146. package/templates/project-claude/fragments/ssr-htmx/workflow.md +8 -0
  147. package/templates/project-claude/fragments/ssr-nextjs/active-rules.md +12 -0
  148. package/templates/project-claude/fragments/ssr-nextjs/agents.md +5 -0
  149. package/templates/project-claude/fragments/ssr-nextjs/boundaries.md +20 -0
  150. package/templates/project-claude/fragments/ssr-nextjs/commands.md +6 -0
  151. package/templates/project-claude/fragments/ssr-nextjs/plugins.md +2 -0
  152. package/templates/project-claude/fragments/ssr-nextjs/skills.md +5 -0
  153. package/templates/project-claude/fragments/ssr-nextjs/stack.md +5 -0
  154. package/templates/project-claude/fragments/ssr-nextjs/tagline.md +1 -0
  155. package/templates/project-claude/fragments/ssr-nextjs/workflow.md +8 -0
  156. package/templates/project-claude/fragments/tooling/active-rules.md +11 -0
  157. package/templates/project-claude/fragments/tooling/agents.md +5 -0
  158. package/templates/project-claude/fragments/tooling/boundaries.md +17 -0
  159. package/templates/project-claude/fragments/tooling/commands.md +4 -0
  160. package/templates/project-claude/fragments/tooling/skills.md +4 -0
  161. package/templates/project-claude/fragments/tooling/stack.md +5 -0
  162. package/templates/project-claude/fragments/tooling/tagline.md +1 -0
  163. package/templates/project-claude/fragments/tooling/workflow.md +5 -0
  164. package/templates/rules/api-contract.md +33 -0
  165. package/templates/rules/change-management.md +80 -0
  166. package/templates/rules/cli-development.md +39 -0
  167. package/templates/rules/code-style.md +23 -0
  168. package/templates/rules/data-analysis.md +61 -0
  169. package/templates/rules/database.md +29 -0
  170. package/templates/rules/design-workflow.md +17 -0
  171. package/templates/rules/error-handling.md +23 -0
  172. package/templates/rules/gates-taxonomy.md +21 -0
  173. package/templates/rules/git-policy.md +102 -0
  174. package/templates/rules/htmx.md +42 -0
  175. package/templates/rules/nextjs.md +35 -0
  176. package/templates/rules/playwright-launch.md +66 -0
  177. package/templates/rules/pyside6.md +59 -0
  178. package/templates/rules/shadcn.md +33 -0
  179. package/templates/rules/ship-checklist.md +24 -0
  180. package/templates/rules/tauri.md +40 -0
  181. package/templates/rules/test-policy.md +62 -0
  182. package/templates/settings.json +71 -0
  183. package/templates/skills/agent-introspection-debugging/SKILL.md +153 -0
  184. package/templates/skills/continuous-learning-v2/SKILL.md +365 -0
  185. package/templates/skills/continuous-learning-v2/config.json +8 -0
  186. package/templates/skills/continuous-learning-v2/hooks/observe.sh +428 -0
  187. package/templates/skills/continuous-learning-v2/scripts/detect-project.sh +228 -0
  188. package/templates/skills/continuous-learning-v2/scripts/instinct-cli.py +1426 -0
  189. package/templates/skills/deep-research/SKILL.md +155 -0
  190. package/templates/skills/deep-research/agents/openai.yaml +7 -0
  191. package/templates/skills/e2e-testing/SKILL.md +326 -0
  192. package/templates/skills/e2e-testing/agents/openai.yaml +7 -0
  193. package/templates/skills/eval-harness/SKILL.md +279 -0
  194. package/templates/skills/eval-harness/agents/openai.yaml +7 -0
  195. package/templates/skills/gh-issue-workflow/ISSUE.template.md +58 -0
  196. package/templates/skills/gh-issue-workflow/SKILL.md +184 -0
  197. package/templates/skills/investor-materials/SKILL.md +96 -0
  198. package/templates/skills/investor-outreach/SKILL.md +91 -0
  199. package/templates/skills/market-research/SKILL.md +75 -0
  200. package/templates/skills/market-research/agents/openai.yaml +7 -0
  201. package/templates/skills/nextjs-turbopack/SKILL.md +44 -0
  202. package/templates/skills/north-star/NORTH_STAR.template.md +114 -0
  203. package/templates/skills/north-star/SKILL.md +103 -0
  204. package/templates/skills/python-patterns/SKILL.md +750 -0
  205. package/templates/skills/python-testing/SKILL.md +816 -0
  206. package/templates/skills/spec-scaling/SKILL.md +89 -0
  207. package/templates/skills/strategic-compact/SKILL.md +131 -0
  208. package/templates/skills/strategic-compact/suggest-compact.sh +54 -0
  209. package/templates/skills/ui-visual-review/SKILL.md +154 -0
  210. package/templates/skills/verification-loop/SKILL.md +126 -0
  211. package/templates/skills/verification-loop/agents/openai.yaml +7 -0
  212. package/templates/track-mcp-map.tsv +15 -0
@@ -0,0 +1,22 @@
1
+ ---
2
+ description: "Verify phase — TDD 워크플로우와 Track별 커버리지 게이트를 실행한다."
3
+ agent: build
4
+ ---
5
+
6
+ # /uzys-test — OpenCode
7
+
8
+ > **Generated from**: `.claude/commands/uzys/test.md` via TS CLI `src/opencode/skills.ts` (Phase C)
9
+ > **Slash**: `/uzys-test` (OpenCode namespace 미사용 — Phase B2 결정, hyphen 채택)
10
+
11
+ ## Goal
12
+
13
+ {COMMAND_BODY_PLACEHOLDER}
14
+
15
+ ## OpenCode 제약 참고
16
+
17
+ - Slash 콜론 namespace 미사용 — 파일명 = 커맨드명 (`uzys-test.md` → `/uzys-test`)
18
+ - Plugin lifecycle (`.opencode/plugins/uzys-harness.ts`)이 gate-check / spec-drift / HITO 처리
19
+
20
+ ---
21
+
22
+ *Phase C에서 본 command 본문이 `.claude/commands/uzys/test.md`로부터 포팅됨.*
@@ -0,0 +1,146 @@
1
+ // uzys-harness — OpenCode plugin (Phase E1 본문)
2
+ //
3
+ // SPEC: docs/specs/opencode-compat.md AC5
4
+ // ADR: docs/decisions/ADR-004-opencode-plugin-mapping.md
5
+ //
6
+ // Hook 매핑 (ADR-004 v1):
7
+ // - PreToolUse → tool.execute.before (gate-check 등가)
8
+ // - PostToolUse → tool.execute.after (spec-drift-check 등가)
9
+ // - UserPromptSubmit → messageCreated filter role==="user" (HITO 카운터)
10
+ //
11
+ // Reference: templates/hooks/{hito-counter,gate-check,spec-drift-check}.sh
12
+ //
13
+ // 본 파일은 사용자 프로젝트에 그대로 복사되는 self-contained template.
14
+ // 핵심 로직은 src/opencode/plugin-helpers.ts에서도 동일하게 유지(테스트용 미러).
15
+ //
16
+ // Phase E2 실측 항목 (한계 L1~L4):
17
+ // L1 Plugin runtime (Bun vs Node) — OpenCode CLI 실측 필요
18
+ // L2 tool.execute.before 인자 정확한 시그니처
19
+ // L3 messageCreated user-only 필터 충분 여부
20
+ // L4 throw 시 graceful 차단/crash 동작
21
+
22
+ import type { Plugin } from "@opencode-ai/plugin";
23
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
24
+ import { join } from "node:path";
25
+
26
+ type GateStatus = {
27
+ define?: { completed?: boolean };
28
+ plan?: { completed?: boolean };
29
+ build?: { completed?: boolean };
30
+ verify?: { completed?: boolean };
31
+ review?: { completed?: boolean };
32
+ ship?: { completed?: boolean };
33
+ };
34
+
35
+ type Phase = "define" | "plan" | "build" | "verify" | "review" | "ship";
36
+
37
+ const PHASE_DEPENDENCY: Record<string, Phase | null> = {
38
+ "uzys-spec": null,
39
+ "uzys-plan": "define",
40
+ "uzys-build": "plan",
41
+ "uzys-test": "build",
42
+ "uzys-review": "verify",
43
+ "uzys-ship": "review",
44
+ };
45
+
46
+ const PHASE_TO_COMMAND: Record<Phase, string> = {
47
+ define: "spec",
48
+ plan: "plan",
49
+ build: "build",
50
+ verify: "test",
51
+ review: "review",
52
+ ship: "ship",
53
+ };
54
+
55
+ const SPEC_PATH_RE = /docs\/SPEC\.md$|docs\/specs\/[^/]+\.md$/;
56
+
57
+ const UzysHarness: Plugin = async ({ directory }) => {
58
+ return {
59
+ "tool.execute.before": async (input, _output) => {
60
+ const command = extractSlashCommand(input);
61
+ if (!command) return;
62
+
63
+ const required = PHASE_DEPENDENCY[command];
64
+ if (required === undefined) return;
65
+ if (required === null) return;
66
+
67
+ const status = readGateStatus(directory);
68
+ if (status[required]?.completed !== true) {
69
+ throw new Error(
70
+ `[uzys-harness] /${command} requires ${required} gate completion. ` +
71
+ `Run /uzys-${PHASE_TO_COMMAND[required]} first.`,
72
+ );
73
+ }
74
+ },
75
+
76
+ "tool.execute.after": async (input, _output) => {
77
+ const filePath = extractFilePath(input);
78
+ if (!filePath || !SPEC_PATH_RE.test(filePath)) return;
79
+
80
+ const date = new Date().toISOString().slice(0, 10);
81
+ const logDir = join(directory, ".claude/evals");
82
+ try {
83
+ mkdirSync(logDir, { recursive: true });
84
+ const stamp = new Date().toISOString();
85
+ writeFileSync(join(logDir, `spec-drift-${date}.log`), `${stamp} edited ${filePath}\n`, {
86
+ flag: "a",
87
+ });
88
+ } catch {
89
+ // Best-effort logging — never block tool execution.
90
+ }
91
+ },
92
+
93
+ messageCreated: async (message, _output) => {
94
+ if (message.role !== "user") return;
95
+
96
+ const date = new Date().toISOString().slice(0, 10);
97
+ const logDir = join(directory, ".claude/evals");
98
+ try {
99
+ mkdirSync(logDir, { recursive: true });
100
+ const stamp = new Date().toISOString();
101
+ writeFileSync(join(logDir, `hito-${date}.log`), `${stamp} prompt_submit\n`, {
102
+ flag: "a",
103
+ });
104
+ } catch {
105
+ // Privacy: prompt body never logged. Best-effort.
106
+ }
107
+ },
108
+ };
109
+ };
110
+
111
+ export default UzysHarness;
112
+
113
+ function readGateStatus(projectDir: string): GateStatus {
114
+ const path = join(projectDir, ".claude/gate-status.json");
115
+ if (!existsSync(path)) return {};
116
+ try {
117
+ return JSON.parse(readFileSync(path, "utf8")) as GateStatus;
118
+ } catch {
119
+ return {};
120
+ }
121
+ }
122
+
123
+ function extractSlashCommand(input: unknown): string | null {
124
+ if (!input || typeof input !== "object") return null;
125
+ const c = input as { command?: unknown; tool?: unknown; args?: { command?: unknown } };
126
+ if (typeof c.command === "string") return c.command.startsWith("/") ? c.command.slice(1) : c.command;
127
+ if (typeof c.tool === "string" && c.tool.startsWith("uzys-")) return c.tool;
128
+ if (c.args && typeof c.args === "object" && typeof c.args.command === "string") {
129
+ return c.args.command.startsWith("/") ? c.args.command.slice(1) : c.args.command;
130
+ }
131
+ return null;
132
+ }
133
+
134
+ function extractFilePath(input: unknown): string | null {
135
+ if (!input || typeof input !== "object") return null;
136
+ const c = input as {
137
+ filePath?: unknown;
138
+ args?: { filePath?: unknown; path?: unknown };
139
+ };
140
+ if (typeof c.filePath === "string") return c.filePath;
141
+ if (c.args && typeof c.args === "object") {
142
+ if (typeof c.args.filePath === "string") return c.args.filePath;
143
+ if (typeof c.args.path === "string") return c.args.path;
144
+ }
145
+ return null;
146
+ }
@@ -0,0 +1,98 @@
1
+ # {PROJECT_NAME} — OpenCode Agent Guide
2
+
3
+ > **Generated from**: `.claude/CLAUDE.md` via TS CLI `src/opencode/transform.ts` (Phase C)
4
+ > **OpenCode Version**: 0.x (anomalyco/opencode)
5
+ > **Linked SPEC**: `docs/specs/opencode-compat.md`
6
+
7
+ ## Project Rules
8
+
9
+ {PROJECT_RULES}
10
+
11
+ ## Workflow Gates
12
+
13
+ ```
14
+ Define(/uzys-spec) → Plan(/uzys-plan) → Build(/uzys-build) → Verify(/uzys-test) → Review(/uzys-review) → Ship(/uzys-ship)
15
+ ```
16
+
17
+ 각 단계 완료 없이 다음 진행 금지. 건너뛰기 시도 시 `tool.execute.before` plugin hook이 throw로 차단.
18
+
19
+ **Hotfix 단축**: Build → Verify → Ship (긴급 수정에 한함)
20
+
21
+ **Executive track**: 6단계 게이트 미적용. 자연어 요청 → strategist + document-skills → 산출물 → 검토.
22
+
23
+ ## Session Start
24
+
25
+ 매 세션 시작 시:
26
+ 1. `git pull --rebase`
27
+ 2. `docs/SPEC.md` 및 `docs/specs/*.md` 재참조 (Persistent Anchor)
28
+ 3. `docs/todo.md` 또는 `docs/plans/*-todo.md` 현재 Phase 확인
29
+
30
+ `sessionCreated` plugin hook이 자동 수행. Hook 실패 시 수동 수행.
31
+
32
+ ## Protected Files (DO NOT EDIT)
33
+
34
+ OpenCode `permission` 설정 + plugin `tool.execute.before` 검사가 1차 방어. LLM 추가 준수:
35
+
36
+ - `.env*`
37
+ - `**/credentials.json`
38
+ - `*.lock`, `package-lock.json`, `pnpm-lock.yaml`, `poetry.lock`, `Cargo.lock`, `uv.lock`
39
+ - `.git/` 내부 파일 (커밋 메시지/hook 제외)
40
+ - `~/.opencode/`, `~/.codex/`, `~/.claude/` 글로벌 (D16 보호)
41
+
42
+ 보호 영역 이슈 발견 시 **보고만**. 직접 수정 금지.
43
+
44
+ ## Git Policy
45
+
46
+ - 코드/문서 변경 시 **즉시 commit**. "나중에 한꺼번에" 금지.
47
+ - `main` 직접 커밋 금지. feature branch 사용.
48
+ - 세션 시작 시 `git pull` 필수.
49
+ - Conventional Commits — `<type>: <description>` (feat, fix, refactor, docs, test, chore, perf, ci)
50
+
51
+ ## Command Reference (OpenCode slash)
52
+
53
+ | Slash | 용도 |
54
+ |-------|------|
55
+ | `/uzys-spec` | Define — 구조화된 스펙 작성 |
56
+ | `/uzys-plan` | Plan — 검증 가능한 작은 단위로 분해 |
57
+ | `/uzys-build` | Build — TDD 점진적 구현 |
58
+ | `/uzys-test` | Verify — 테스트 실행 + 커버리지 |
59
+ | `/uzys-review` | Review — 5축 리뷰 (correctness, readability, architecture, security, performance) |
60
+ | `/uzys-ship` | Ship — 프리런치 체크리스트 + 배포 |
61
+
62
+ OpenCode slash 커맨드는 `.opencode/commands/<name>.md` 파일명이 그대로 슬래시 이름. namespace(`:`) 미사용 — Codex 1차 일관성 + filesystem 호환을 위해 hyphen 채택 (Phase B2 결정, 2026-04-25).
63
+
64
+ ## Agents (subagent)
65
+
66
+ | Agent | Mode | 역할 |
67
+ |-------|------|------|
68
+ | reviewer | subagent | 검증 전용 (SOD). 5축 리뷰 |
69
+ | data-analyst | subagent | Python / DuckDB / Trino / ML / PySide6 |
70
+ | strategist | subagent | 제안서 / DD / PPT / 경쟁분석 / 재무모델 |
71
+ | code-reviewer | subagent | 일상적 코드 리뷰 |
72
+ | security-reviewer | subagent | OWASP Top 10, 보안 패턴 |
73
+
74
+ `opencode.json` `agent.<name>.mode = "subagent"` 로 정의.
75
+
76
+ ## Hooks (Plugin lifecycle)
77
+
78
+ OpenCode plugin (`./.opencode/plugin/uzys-harness.ts`)이 다음 3종 hook을 처리:
79
+
80
+ - **`tool.execute.before`** — Claude `PreToolUse` 매핑. gate-check (단계 위반 차단)
81
+ - **`tool.execute.after`** — Claude `PostToolUse` 매핑. spec-drift-check (산출물 검증)
82
+ - **`messageCreated`** filter `role==="user"` — Claude `UserPromptSubmit` 매핑. HITO 카운터
83
+
84
+ 자세한 매핑: `docs/decisions/ADR-004-opencode-plugin-mapping.md`.
85
+
86
+ ## Experience Accumulation
87
+
88
+ - 검증된 learning만 Rules 승격
89
+ - HITO 로그: `.claude/evals/hito-YYYY-MM-DD.log` (plugin이 누적)
90
+
91
+ ## Context Management
92
+
93
+ - SPEC/PRD 매 세션 시작 시 재참조 (Persistent Anchor)
94
+ - `instructions` 키 (`opencode.json`)로 `.claude/rules/*.md` glob 자동 merge
95
+
96
+ ---
97
+
98
+ *이 문서는 자동 생성됨. 수동 편집 시 transform 재실행이 덮어쓸 수 있음. 원본은 `.claude/CLAUDE.md` 또는 `templates/CLAUDE.md`.*
@@ -0,0 +1,34 @@
1
+ # OpenCode Template
2
+
3
+ > **Linked SPEC**: `docs/specs/opencode-compat.md`
4
+ > **Generated by**: TS CLI `src/opencode/transform.ts` (Phase C — 미구현)
5
+
6
+ 이 디렉토리는 OpenCode CLI 호환 자산을 생성하기 위한 **마스터 템플릿**이다. Claude Code SSOT(`.claude/`, `.mcp.json`, `templates/CLAUDE.md`)로부터 transform 모듈이 다음 출력을 생성:
7
+
8
+ ```
9
+ <project>/AGENTS.md ← AGENTS.md.template + CLAUDE.md
10
+ <project>/opencode.json ← opencode.json.template + .mcp.json
11
+ <project>/.opencode/commands/uzys-{spec,plan,build,test,review,ship}.md
12
+ <project>/.opencode/plugins/uzys-harness.ts
13
+ ```
14
+
15
+ ## 구조
16
+
17
+ | 파일 | 용도 | Phase |
18
+ |------|------|-------|
19
+ | `AGENTS.md.template` | 프로젝트 root AGENTS.md 마스터 | B1 (현재) / C1 transform |
20
+ | `opencode.json.template` | `opencode.json` 마스터 ($schema + mcp + command + agent + plugin + permission) | B3 |
21
+ | `.opencode/commands/uzys-*.md` | 6 slash command stub. `{COMMAND_BODY_PLACEHOLDER}`가 transform 시 `.claude/commands/uzys/<n>.md` 본문으로 치환 | B1 stub / C2 |
22
+ | `.opencode/plugins/uzys-harness.ts` | Plugin stub (3 hook 골격) | B1 stub / E1 본문 |
23
+
24
+ ## 디자인 결정
25
+
26
+ - **Slash 콜론 namespace 미사용** (B2, 2026-04-25): `uzys-spec` 형식 채택. Codex 1차 일관성 + filesystem 호환.
27
+ - **Plugin 위치 프로젝트 스코프** (D16, ADR-004): `.opencode/plugins/` 만 사용. 글로벌 `~/.config/opencode/plugins/` 미수정.
28
+ - **Commands 디렉토리** = `commands/` (plural). OpenCode 공식 규약. 파일명 = 커맨드명.
29
+ - **Plugin 키** = `plugin` (singular array key in opencode.json).
30
+
31
+ ## OpenCode 호환 버전
32
+
33
+ - OpenCode 0.x (anomalyco/opencode)
34
+ - `$schema`: `https://opencode.ai/config.json`
@@ -0,0 +1,42 @@
1
+ {
2
+ "$schema": "https://opencode.ai/config.json",
3
+ "instructions": [
4
+ ".claude/rules/*.md",
5
+ "docs/SPEC.md",
6
+ "docs/specs/*.md"
7
+ ],
8
+ "mcp": {},
9
+ "command": {},
10
+ "agent": {
11
+ "build": {
12
+ "mode": "primary",
13
+ "tools": {
14
+ "write": true,
15
+ "edit": true,
16
+ "bash": true
17
+ }
18
+ },
19
+ "plan": {
20
+ "mode": "primary",
21
+ "tools": {
22
+ "write": false,
23
+ "edit": false,
24
+ "bash": false
25
+ }
26
+ },
27
+ "code-reviewer": {
28
+ "mode": "subagent",
29
+ "description": "5축 리뷰 (correctness/readability/architecture/security/performance)",
30
+ "tools": {
31
+ "write": false,
32
+ "edit": false
33
+ }
34
+ }
35
+ },
36
+ "plugin": [
37
+ "./.opencode/plugins/uzys-harness.ts"
38
+ ],
39
+ "permission": {
40
+ "question": "allow"
41
+ }
42
+ }
@@ -0,0 +1,23 @@
1
+ # [Project Name]
2
+
3
+ > 활성 Track(s): <!-- INSERT: track-list -->
4
+ >
5
+ > <!-- INSERT: tagline -->
6
+
7
+ <!-- INSERT: stack -->
8
+
9
+ <!-- INSERT: workflow -->
10
+
11
+ <!-- INSERT: active-rules -->
12
+
13
+ <!-- INSERT: agents -->
14
+
15
+ <!-- INSERT: skills -->
16
+
17
+ <!-- INSERT: plugins -->
18
+
19
+ <!-- INSERT: commands -->
20
+
21
+ <!-- INSERT: boundaries -->
22
+
23
+ <!-- INSERT: supabase-auth -->
@@ -0,0 +1,13 @@
1
+ | Rule | 설명 |
2
+ |------|------|
3
+ | git-policy | 브랜치 전략, PR 필수, main 직접 커밋 금지 |
4
+ | change-management | 변경 영향 분석, DO NOT CHANGE 영역 보호 |
5
+ | test-policy | 단위/통합/E2E (pytest + Playwright). 커버리지 80% 이상 |
6
+ | ship-checklist | 배포 전 최종 점검 체크리스트 |
7
+ | code-style | 불변성(Pydantic 모델), 소형 파일, 함수 50줄 이하 |
8
+ | error-handling | 명시적 에러 처리. HTTPException 계층화 |
9
+ | design-workflow | UI/UX 설계 프로세스. shape -> build -> polish |
10
+ | tauri | Tauri IPC, 보안 설정, 빌드 구성 |
11
+ | shadcn | shadcn/ui 컴포넌트 사용 규칙, 커스터마이징 패턴 |
12
+ | api-contract | REST API 계약. Pydantic 스키마, OpenAPI 자동 생성 |
13
+ | database | Alembic 마이그레이션, 쿼리 최적화, 인덱스 전략 |
@@ -0,0 +1,5 @@
1
+ | Agent | Scope | Model | 역할 |
2
+ |-------|-------|-------|------|
3
+ | reviewer | global | opus | 검증 전용 (SOD). 코드/문서/UI 관점 전환 |
4
+ | code-reviewer | project | sonnet | 일상적 코드 리뷰. CRITICAL -> LOW 분류 |
5
+ | security-reviewer | project | sonnet | OWASP Top 10, FastAPI 보안 미들웨어 검증 |
@@ -0,0 +1,18 @@
1
+ **Always (자동 실행)**:
2
+ - 코드 변경 후 code-reviewer 실행
3
+ - 커밋 전 보안 체크 (하드코딩된 시크릿 탐지)
4
+ - FastAPI 엔드포인트 추가 시 Pydantic 스키마 검증
5
+ - git pull로 세션 시작
6
+
7
+ **Ask First (확인 후 실행)**:
8
+ - Alembic 마이그레이션 실행 (되돌리기 어려움)
9
+ - Railway 배포
10
+ - Tauri 빌드/릴리스
11
+ - main 브랜치 머지
12
+
13
+ **Never (금지)**:
14
+ - main 직접 커밋
15
+ - 시크릿 하드코딩
16
+ - 프로덕션 DB 직접 조작
17
+ - 게이트 건너뛰기 (Hotfix 예외)
18
+ - DO NOT CHANGE 영역 수정
@@ -0,0 +1,6 @@
1
+ | Namespace | Command | 용도 |
2
+ |-----------|---------|------|
3
+ | uzys: | spec, plan, build, test, review, ship | 6-gate 개발 사이클 |
4
+ | ecc: | security-scan, instinct-status, evolve, promote | 보안 스캔, 학습 관리 |
5
+ | imm: | teach, polish, critique, audit, shape, adapt | 디자인 품질 관리 |
6
+ | gsd: | (선택 설치) | 대형 프로젝트 오케스트레이션 |
@@ -0,0 +1,2 @@
1
+ - **agent-skills**: 6-gate 워크플로우 엔진
2
+ - **Railway**: 배포 자동화 (FastAPI 서비스 + PostgreSQL)
@@ -0,0 +1,5 @@
1
+ - **agent-skills**: 워크플로우 백본 (spec-driven-development, idea-refine)
2
+ - **ECC CL-v2**: instinct 기반 학습. 세션 관찰 -> 패턴 축적
3
+ - **Impeccable**: 프론트엔드 디자인 품질 (polish, critique, audit)
4
+ - **react-best-practices**: React 패턴, 훅 규칙, 상태 관리
5
+ - **shadcn-ui**: shadcn/ui 컴포넌트 가이드, 테마 커스터마이징
@@ -0,0 +1,6 @@
1
+ - **Backend**: FastAPI + Python 3.12+ (uvicorn)
2
+ - **Database**: PostgreSQL (SQLAlchemy / SQLModel)
3
+ - **Frontend**: React + TypeScript + Vite
4
+ - **UI**: shadcn/ui + Tailwind CSS
5
+ - **Desktop**: Tauri (Rust shell)
6
+ - **Infra**: Railway
@@ -0,0 +1 @@
1
+ FastAPI + React + Tauri 데스크탑 앱을 위한 클라이언트 사이드 렌더링 풀스택 트랙.
@@ -0,0 +1,8 @@
1
+ 6-gate 개발 워크플로우 적용:
2
+
3
+ ```
4
+ Define(/uzys:spec) -> Plan(/uzys:plan) -> Build(/uzys:build) -> Verify(/uzys:test) -> Review(/uzys:review) -> Ship(/uzys:ship)
5
+ ```
6
+
7
+ - 각 게이트를 순서대로 통과해야 다음 단계 진행 가능.
8
+ - Hotfix 단축: Build -> Verify -> Ship (긴급 수정에 한함).
@@ -0,0 +1,13 @@
1
+ | Rule | 설명 |
2
+ |------|------|
3
+ | git-policy | 브랜치 전략, PR 필수, main 직접 커밋 금지 |
4
+ | change-management | 변경 영향 분석, DO NOT CHANGE 영역 보호 |
5
+ | test-policy | 단위/통합/E2E 테스트. 커버리지 80% 이상 |
6
+ | ship-checklist | 배포 전 최종 점검 체크리스트 |
7
+ | code-style | 불변성, 소형 파일(800줄 이하), 함수 50줄 이하 |
8
+ | error-handling | 명시적 에러 처리. 에러 무시 금지 |
9
+ | design-workflow | UI/UX 설계 프로세스. shape -> build -> polish |
10
+ | tauri | Tauri IPC, 보안 설정, 빌드 구성 |
11
+ | shadcn | shadcn/ui 컴포넌트 사용 규칙, 커스터마이징 패턴 |
12
+ | api-contract | REST API 계약. 요청/응답 스키마, 에러 형식 |
13
+ | database | DB 마이그레이션, 쿼리 최적화, 인덱스 전략 |
@@ -0,0 +1,5 @@
1
+ | Agent | Scope | Model | 역할 |
2
+ |-------|-------|-------|------|
3
+ | reviewer | global | opus | 검증 전용 (SOD). 코드/문서/UI 관점 전환 |
4
+ | code-reviewer | project | sonnet | 일상적 코드 리뷰. CRITICAL -> LOW 분류 |
5
+ | security-reviewer | project | sonnet | OWASP Top 10, 인증/인가 검증 |
@@ -0,0 +1,18 @@
1
+ **Always (자동 실행)**:
2
+ - 코드 변경 후 code-reviewer 실행
3
+ - 커밋 전 보안 체크 (하드코딩된 시크릿 탐지)
4
+ - DB 스키마 변경 시 마이그레이션 파일 생성 확인
5
+ - git pull로 세션 시작
6
+
7
+ **Ask First (확인 후 실행)**:
8
+ - DB 마이그레이션 실행 (되돌리기 어려움)
9
+ - Railway 배포
10
+ - Tauri 빌드/릴리스
11
+ - main 브랜치 머지
12
+
13
+ **Never (금지)**:
14
+ - main 직접 커밋
15
+ - 시크릿 하드코딩
16
+ - 프로덕션 DB 직접 조작
17
+ - 게이트 건너뛰기 (Hotfix 예외)
18
+ - DO NOT CHANGE 영역 수정
@@ -0,0 +1,6 @@
1
+ | Namespace | Command | 용도 |
2
+ |-----------|---------|------|
3
+ | uzys: | spec, plan, build, test, review, ship | 6-gate 개발 사이클 |
4
+ | ecc: | security-scan, instinct-status, evolve, promote | 보안 스캔, 학습 관리 |
5
+ | imm: | teach, polish, critique, audit, shape, adapt | 디자인 품질 관리 |
6
+ | gsd: | (선택 설치) | 대형 프로젝트 오케스트레이션 |
@@ -0,0 +1,2 @@
1
+ - **agent-skills**: 6-gate 워크플로우 엔진
2
+ - **Railway**: 배포 자동화 (Fastify 서비스 + PostgreSQL)
@@ -0,0 +1,5 @@
1
+ - **agent-skills**: 워크플로우 백본 (spec-driven-development, idea-refine)
2
+ - **ECC CL-v2**: instinct 기반 학습. 세션 관찰 -> 패턴 축적
3
+ - **Impeccable**: 프론트엔드 디자인 품질 (polish, critique, audit)
4
+ - **react-best-practices**: React 패턴, 훅 규칙, 상태 관리
5
+ - **shadcn-ui**: shadcn/ui 컴포넌트 가이드, 테마 커스터마이징
@@ -0,0 +1,6 @@
1
+ - **Backend**: Fastify + TypeScript + Node.js
2
+ - **Database**: PostgreSQL (Drizzle ORM / Prisma)
3
+ - **Frontend**: React + TypeScript + Vite
4
+ - **UI**: shadcn/ui + Tailwind CSS
5
+ - **Desktop**: Tauri (Rust shell)
6
+ - **Infra**: Railway
@@ -0,0 +1 @@
1
+ Fastify + React + Tauri 데스크탑 앱을 위한 클라이언트 사이드 렌더링 풀스택 트랙.
@@ -0,0 +1,8 @@
1
+ 6-gate 개발 워크플로우 적용:
2
+
3
+ ```
4
+ Define(/uzys:spec) -> Plan(/uzys:plan) -> Build(/uzys:build) -> Verify(/uzys:test) -> Review(/uzys:review) -> Ship(/uzys:ship)
5
+ ```
6
+
7
+ - 각 게이트를 순서대로 통과해야 다음 단계 진행 가능.
8
+ - Hotfix 단축: Build -> Verify -> Ship (긴급 수정에 한함).
@@ -0,0 +1,12 @@
1
+ | Rule | 설명 |
2
+ |------|------|
3
+ | git-policy | 브랜치 전략, PR 필수, main 직접 커밋 금지 |
4
+ | change-management | 변경 영향 분석, DO NOT CHANGE 영역 보호 |
5
+ | test-policy | 단위/통합/E2E 테스트. 커버리지 80% 이상 |
6
+ | ship-checklist | 배포 전 최종 점검 체크리스트 |
7
+ | code-style | 불변성, 소형 파일(800줄 이하), 함수 50줄 이하 |
8
+ | error-handling | 명시적 에러 처리. 에러 무시 금지 |
9
+ | design-workflow | UI/UX 설계 프로세스. shape -> build -> polish |
10
+ | tauri | Tauri IPC, 보안 설정, 빌드 구성 |
11
+ | shadcn | shadcn/ui 컴포넌트 사용 규칙, 커스터마이징 패턴 |
12
+ | api-contract | Supabase Edge Function 계약. 요청/응답 스키마 정의 |
@@ -0,0 +1,5 @@
1
+ | Agent | Scope | Model | 역할 |
2
+ |-------|-------|-------|------|
3
+ | reviewer | global | opus | 검증 전용 (SOD). 코드/문서/UI 관점 전환 |
4
+ | code-reviewer | project | sonnet | 일상적 코드 리뷰. CRITICAL -> LOW 분류 |
5
+ | security-reviewer | project | sonnet | OWASP Top 10, Supabase RLS 검증 |
@@ -0,0 +1,19 @@
1
+ **Always (자동 실행)**:
2
+ - 코드 변경 후 code-reviewer 실행
3
+ - 커밋 전 보안 체크 (하드코딩된 시크릿 탐지)
4
+ - Supabase RLS 정책 변경 시 security-reviewer 실행
5
+ - Supabase 쿼리 작성 시 postgres-best-practices 스킬 참조 (인덱스, RLS 영향)
6
+ - git pull로 세션 시작
7
+
8
+ **Ask First (확인 후 실행)**:
9
+ - Supabase 마이그레이션 실행
10
+ - Edge Function 배포
11
+ - Tauri 빌드/릴리스
12
+ - main 브랜치 머지
13
+
14
+ **Never (금지)**:
15
+ - main 직접 커밋
16
+ - 시크릿 하드코딩
17
+ - RLS 비활성화 상태로 배포
18
+ - 게이트 건너뛰기 (Hotfix 예외)
19
+ - DO NOT CHANGE 영역 수정
@@ -0,0 +1,6 @@
1
+ | Namespace | Command | 용도 |
2
+ |-----------|---------|------|
3
+ | uzys: | spec, plan, build, test, review, ship | 6-gate 개발 사이클 |
4
+ | ecc: | security-scan, instinct-status, evolve, promote | 보안 스캔, 학습 관리 |
5
+ | imm: | teach, polish, critique, audit, shape, adapt | 디자인 품질 관리 |
6
+ | gsd: | (선택 설치) | 대형 프로젝트 오케스트레이션 |
@@ -0,0 +1,4 @@
1
+ - **agent-skills**: 6-gate 워크플로우 엔진
2
+ - **supabase-agent-skills**: Supabase 전용 전문 지식 (공식 플러그인, D23)
3
+ - **Vercel CLI** + **Netlify CLI**: 프론트엔드 배포 (Supabase backend + JAMstack hosting)
4
+ - **Supabase CLI**: 프로젝트 link / DB migration / Edge Functions 배포
@@ -0,0 +1,7 @@
1
+ - **agent-skills**: 워크플로우 백본 (spec-driven-development, idea-refine)
2
+ - **ECC CL-v2**: instinct 기반 학습. 세션 관찰 -> 패턴 축적
3
+ - **Impeccable**: 프론트엔드 디자인 품질 (polish, critique, audit)
4
+ - **react-best-practices**: React 패턴, 훅 규칙, 상태 관리
5
+ - **shadcn-ui**: shadcn/ui 컴포넌트 가이드, 테마 커스터마이징
6
+ - **supabase**: Supabase 종합 (DB/Auth/Edge/Realtime/Storage/Vectors/Cron/Queues)
7
+ - **postgres-best-practices**: 쿼리 최적화, RLS, 인덱스, 연결 풀링, SSR 통합
@@ -0,0 +1,6 @@
1
+ - **Backend**: Supabase (PostgreSQL + Auth + Storage + Realtime) + Edge Functions (Deno)
2
+ - **Frontend**: React + TypeScript + Vite
3
+ - **UI**: shadcn/ui + Tailwind CSS
4
+ - **Desktop**: Tauri (Rust shell)
5
+ - **Infra**: Supabase hosted / self-hosted
6
+ - **MCP**: Supabase
@@ -0,0 +1,21 @@
1
+ setup-harness가 Supabase CLI를 자동 설치한다. 다음 두 path를 각각 1회 설정:
2
+
3
+ ### CLI 자동화 (link / db push / functions deploy)
4
+
5
+ ```bash
6
+ supabase login # OAuth 브라우저 인증 → ~/.config/supabase/access-token 저장
7
+ supabase link --project-ref <YOUR_REF> # 프로젝트 연결
8
+ ```
9
+
10
+ ### MCP server (프로젝트 자동 생성/관리)
11
+
12
+ `@supabase/mcp-server`는 별도 환경변수 필요. PAT 발급 후 export:
13
+
14
+ ```bash
15
+ # https://supabase.com/dashboard/account/tokens 에서 PAT 발급
16
+ export SUPABASE_ACCESS_TOKEN=sbp_xxxxxxxxxxxxxxxxxxxxxxxxxxx
17
+ ```
18
+
19
+ (영구 적용은 `~/.zshrc`/`~/.bashrc`에 export 추가, 또는 프로젝트 `.env`에 기록 — `.env`는 `.gitignore`됨.)
20
+
21
+ 이후 `/uzys:spec`에서 "Supabase 프로젝트 X 사용" 명시 → `/uzys:auto`가 MCP로 프로젝트 생성/스키마 적용/Edge Functions 배포 자동.
@@ -0,0 +1 @@
1
+ Supabase BaaS + React + Tauri 데스크탑 앱을 위한 클라이언트 사이드 렌더링 풀스택 트랙.
@@ -0,0 +1,8 @@
1
+ 6-gate 개발 워크플로우 적용:
2
+
3
+ ```
4
+ Define(/uzys:spec) -> Plan(/uzys:plan) -> Build(/uzys:build) -> Verify(/uzys:test) -> Review(/uzys:review) -> Ship(/uzys:ship)
5
+ ```
6
+
7
+ - 각 게이트를 순서대로 통과해야 다음 단계 진행 가능.
8
+ - Hotfix 단축: Build -> Verify -> Ship (긴급 수정에 한함).
@@ -0,0 +1,10 @@
1
+ | Rule | 설명 |
2
+ |------|------|
3
+ | git-policy | 브랜치 전략, PR 필수, main 직접 커밋 금지 |
4
+ | change-management | 변경 영향 분석, DO NOT CHANGE 영역 보호 |
5
+ | test-policy | 단위/통합 테스트 (pytest). 커버리지 80% 이상 |
6
+ | ship-checklist | 배포/릴리스 전 최종 점검 체크리스트 |
7
+ | code-style | 불변성, 소형 파일(800줄 이하), 함수 50줄 이하 |
8
+ | error-handling | 명시적 에러 처리. 데이터 파이프라인 실패 복구 |
9
+ | pyside6 | PySide6 위젯 규칙, 시그널/슬롯 패턴, 스레딩 |
10
+ | data-analysis | 데이터 품질 검증, 재현 가능한 분석, 시드 고정 |