@zrg-sh/studio 0.1.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 (95) hide show
  1. package/LICENSE +21 -0
  2. package/ONBOARDING.html +270 -0
  3. package/README.md +82 -0
  4. package/bin/zrg-studio.mjs +67 -0
  5. package/package.json +29 -0
  6. package/src/commands/doctor.mjs +60 -0
  7. package/src/commands/init.mjs +44 -0
  8. package/src/lib/copy-template.mjs +42 -0
  9. package/src/lib/merge-claude-settings.mjs +54 -0
  10. package/template/.claude/agents/studio-analyst.md +109 -0
  11. package/template/.claude/agents/studio-designer.md +172 -0
  12. package/template/.claude/agents/studio-domain-framer.md +109 -0
  13. package/template/.claude/agents/studio-domain-merger.md +264 -0
  14. package/template/.claude/agents/studio-pm.md +169 -0
  15. package/template/.claude/agents/studio-reviewer.md +156 -0
  16. package/template/.claude/agents/studio-scenario-writer.md +152 -0
  17. package/template/.claude/commands/studio-analyst.md +45 -0
  18. package/template/.claude/commands/studio-designer.md +34 -0
  19. package/template/.claude/commands/studio-domain-framer.md +30 -0
  20. package/template/.claude/commands/studio-onboard.md +98 -0
  21. package/template/.claude/commands/studio-pm.md +39 -0
  22. package/template/.claude/commands/studio-scenario-writer.md +44 -0
  23. package/template/product-specs/CLAUDE.md +53 -0
  24. package/template/product-specs/agents/studio-analyst.md +109 -0
  25. package/template/product-specs/agents/studio-codebase-mapper.md +217 -0
  26. package/template/product-specs/agents/studio-conflict-resolver.md +169 -0
  27. package/template/product-specs/agents/studio-designer.md +172 -0
  28. package/template/product-specs/agents/studio-domain-extractor.md +365 -0
  29. package/template/product-specs/agents/studio-domain-framer.md +109 -0
  30. package/template/product-specs/agents/studio-domain-interviewer.md +246 -0
  31. package/template/product-specs/agents/studio-domain-merger.md +264 -0
  32. package/template/product-specs/agents/studio-god.md +779 -0
  33. package/template/product-specs/agents/studio-meta-god.md +335 -0
  34. package/template/product-specs/agents/studio-pm.md +169 -0
  35. package/template/product-specs/agents/studio-reviewer.md +156 -0
  36. package/template/product-specs/agents/studio-scenario-writer.md +152 -0
  37. package/template/product-specs/agents/studio-verifier.md +222 -0
  38. package/template/product-specs/docs/_meta/capability-map.example.md +103 -0
  39. package/template/product-specs/docs/_meta/doc-schema.md +134 -0
  40. package/template/product-specs/docs/_meta/domain-map.example.md +106 -0
  41. package/template/product-specs/docs/_meta/glossary.example.md +72 -0
  42. package/template/product-specs/docs/_meta/onboarding.example.md +142 -0
  43. package/template/product-specs/docs/_meta/product-vision.example.md +136 -0
  44. package/template/product-specs/hooks/studio-conflict-detect.sh +59 -0
  45. package/template/product-specs/hooks/studio-context-monitor.js +37 -0
  46. package/template/product-specs/hooks/studio-domain-guard.sh +40 -0
  47. package/template/product-specs/hooks/studio-prompt-guard.js +36 -0
  48. package/template/product-specs/hooks/studio-session-state.sh +55 -0
  49. package/template/product-specs/hooks/studio-stage-gate.sh +180 -0
  50. package/template/product-specs/references/checkpoints.md +27 -0
  51. package/template/product-specs/references/ddd-conventions.md +38 -0
  52. package/template/product-specs/references/gates.md +50 -0
  53. package/template/product-specs/references/model-profiles.md +28 -0
  54. package/template/product-specs/references/obsidian-conventions.md +51 -0
  55. package/template/product-specs/references/stage-pipeline.md +65 -0
  56. package/template/product-specs/rules/change-management.md +159 -0
  57. package/template/product-specs/rules/docs-conventions.md +81 -0
  58. package/template/product-specs/rules/domain-conventions.md +69 -0
  59. package/template/product-specs/rules/id-numbering.md +51 -0
  60. package/template/product-specs/rules/obsidian-conventions.md +51 -0
  61. package/template/product-specs/templates/change/01-intent.md +40 -0
  62. package/template/product-specs/templates/change/02-scenarios.md +66 -0
  63. package/template/product-specs/templates/change/03-analysis.md +64 -0
  64. package/template/product-specs/templates/change/04-domain.md +47 -0
  65. package/template/product-specs/templates/change/05-ux.md +46 -0
  66. package/template/product-specs/templates/change/metadata.yaml +26 -0
  67. package/template/product-specs/templates/config.json +19 -0
  68. package/template/product-specs/templates/domain/README.md +31 -0
  69. package/template/product-specs/templates/domain/aggregates.md +37 -0
  70. package/template/product-specs/templates/domain/api-contracts.md +29 -0
  71. package/template/product-specs/templates/domain/business-rules.md +30 -0
  72. package/template/product-specs/templates/domain/changelog.md +25 -0
  73. package/template/product-specs/templates/domain/data-model.md +34 -0
  74. package/template/product-specs/templates/domain/events.md +24 -0
  75. package/template/product-specs/templates/domain/integrations.md +27 -0
  76. package/template/product-specs/templates/domain/invariants.md +14 -0
  77. package/template/product-specs/templates/domain/links.yaml +20 -0
  78. package/template/product-specs/templates/domain/operational-sla.md +32 -0
  79. package/template/product-specs/templates/domain/ownership.md +13 -0
  80. package/template/product-specs/templates/domain/scenarios.md +65 -0
  81. package/template/product-specs/templates/domain/surfaces.md +51 -0
  82. package/template/product-specs/templates/domain/ubiquitous-language.md +12 -0
  83. package/template/product-specs/templates/meta/capability-map.md +55 -0
  84. package/template/product-specs/templates/meta/doc-schema.md +134 -0
  85. package/template/product-specs/templates/meta/domain-map.md +67 -0
  86. package/template/product-specs/templates/meta/glossary.md +30 -0
  87. package/template/product-specs/templates/meta/onboarding.md +108 -0
  88. package/template/product-specs/templates/state.md +19 -0
  89. package/template/product-specs/workflows/conflict-resolution.md +10 -0
  90. package/template/product-specs/workflows/domain-update.md +15 -0
  91. package/template/product-specs/workflows/map-codebase.md +17 -0
  92. package/template/product-specs/workflows/onboard-project.md +575 -0
  93. package/template/product-specs/workflows/pipeline-full.md +258 -0
  94. package/template/product-specs/workflows/pipeline-resume.md +21 -0
  95. package/template/product-specs/workflows/verify-change.md +12 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ Copyright (c) 2026 matthew. All rights reserved.
2
+
3
+ This software and its source code are proprietary and confidential. Access
4
+ is granted only to npm accounts explicitly added to the @zrg-sh:buyers team.
5
+
6
+ You may NOT:
7
+ - Redistribute, sublicense, publish, or resell this package or its contents.
8
+ - Share installed files with anyone outside your own organization.
9
+ - Reverse-engineer the package to extract content for circumvention of access controls.
10
+
11
+ You MAY:
12
+ - Use the installed agents, prompts, and hooks in your own projects.
13
+ - Modify your local copy of the files for your own use.
14
+ - Make as many local copies as needed within your team's projects, provided
15
+ everyone using them holds their own valid team membership.
16
+
17
+ This license terminates automatically if you violate the above terms or if
18
+ your team membership is revoked. Upon termination you must delete all
19
+ installed copies.
20
+
21
+ No warranty. The software is provided "AS IS".
@@ -0,0 +1,270 @@
1
+ <!doctype html>
2
+ <html lang="ru">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <title>zrg-studio — установка для продактов</title>
7
+ <style>
8
+ :root {
9
+ --bg: #0b0d10;
10
+ --card: #14181d;
11
+ --text: #e8eef5;
12
+ --muted: #97a3b3;
13
+ --accent: #ffb547;
14
+ --accent-2: #4ea0ff;
15
+ --ok: #5ddc97;
16
+ --warn: #ff6b6b;
17
+ --border: #1f262e;
18
+ --code-bg: #0f1318;
19
+ }
20
+ * { box-sizing: border-box; }
21
+ html, body { margin: 0; padding: 0; background: var(--bg); color: var(--text); font: 16px/1.65 -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif; }
22
+ .wrap { max-width: 780px; margin: 0 auto; padding: 48px 24px 96px; }
23
+ h1 { font-size: 38px; line-height: 1.15; margin: 0 0 8px; letter-spacing: -0.02em; }
24
+ h2 { font-size: 24px; margin: 56px 0 16px; letter-spacing: -0.01em; }
25
+ h3 { font-size: 18px; margin: 32px 0 8px; }
26
+ p { color: var(--text); }
27
+ .sub { color: var(--muted); font-size: 18px; margin: 0 0 32px; }
28
+ .step { background: var(--card); border: 1px solid var(--border); border-radius: 12px; padding: 24px; margin: 16px 0; position: relative; }
29
+ .step::before { content: counter(step); counter-increment: step; position: absolute; top: -14px; left: 20px; background: var(--accent); color: #0b0d10; font-weight: 700; width: 28px; height: 28px; border-radius: 50%; display: grid; place-items: center; font-size: 14px; }
30
+ body { counter-reset: step; }
31
+ .step h3 { margin-top: 0; }
32
+ code, pre { font-family: ui-monospace, "SF Mono", Menlo, monospace; }
33
+ code { background: var(--code-bg); padding: 2px 6px; border-radius: 4px; font-size: 14px; color: var(--accent); }
34
+ pre { background: var(--code-bg); padding: 16px 18px; border-radius: 8px; overflow-x: auto; border: 1px solid var(--border); font-size: 14px; line-height: 1.55; }
35
+ pre code { background: transparent; padding: 0; color: var(--text); }
36
+ .copy { position: relative; }
37
+ .copy-btn { position: absolute; top: 8px; right: 8px; background: var(--border); color: var(--muted); border: 0; padding: 4px 10px; font-size: 12px; border-radius: 4px; cursor: pointer; font-family: inherit; }
38
+ .copy-btn:hover { background: var(--accent-2); color: #fff; }
39
+ .copy-btn.done { background: var(--ok); color: #0b0d10; }
40
+ .note { border-left: 3px solid var(--accent-2); padding: 12px 16px; background: rgba(78,160,255,0.08); margin: 16px 0; border-radius: 4px; }
41
+ .warn { border-left: 3px solid var(--warn); padding: 12px 16px; background: rgba(255,107,107,0.08); margin: 16px 0; border-radius: 4px; }
42
+ .ok { border-left: 3px solid var(--ok); padding: 12px 16px; background: rgba(93,220,151,0.08); margin: 16px 0; border-radius: 4px; }
43
+ a { color: var(--accent-2); }
44
+ ul, ol { padding-left: 22px; }
45
+ li { margin: 6px 0; }
46
+ .kbd { background: #222; border: 1px solid #333; border-bottom-width: 2px; padding: 1px 7px; border-radius: 4px; font-family: ui-monospace, monospace; font-size: 13px; }
47
+ .hr { height: 1px; background: var(--border); margin: 48px 0; border: 0; }
48
+ .small { color: var(--muted); font-size: 14px; }
49
+ .platforms { display: flex; gap: 8px; margin: 12px 0 20px; }
50
+ .platforms button { flex: 1; background: var(--card); border: 1px solid var(--border); color: var(--muted); padding: 10px 14px; border-radius: 8px; cursor: pointer; font: inherit; font-size: 14px; }
51
+ .platforms button.active { background: var(--accent); color: #0b0d10; border-color: var(--accent); font-weight: 600; }
52
+ .platform-block { display: none; }
53
+ .platform-block.active { display: block; }
54
+ .toc { background: var(--card); border: 1px solid var(--border); border-radius: 8px; padding: 16px 24px; margin: 24px 0 40px; }
55
+ .toc ol { margin: 0; }
56
+ .toc a { color: var(--text); text-decoration: none; }
57
+ .toc a:hover { color: var(--accent); }
58
+ .emoji { font-size: 1.4em; vertical-align: -0.15em; margin-right: 4px; }
59
+ .footer { text-align: center; color: var(--muted); margin-top: 80px; font-size: 13px; }
60
+ </style>
61
+ </head>
62
+ <body>
63
+ <div class="wrap">
64
+
65
+ <h1>Установка zrg-studio</h1>
66
+ <p class="sub">Гайд для не-разработчиков. Всё делается один раз, дальше работает само.</p>
67
+
68
+ <div class="note">
69
+ <strong>Что вы получите в итоге:</strong> в любой папке проекта одной командой будут разворачиваться AI-агенты для написания продуктовых спек по DDD-методологии. Сами агенты работают внутри Claude Code.
70
+ </div>
71
+
72
+ <div class="toc">
73
+ <strong>Что предстоит сделать:</strong>
74
+ <ol>
75
+ <li><a href="#step1">Установить Node.js</a> (5 минут)</li>
76
+ <li><a href="#step2">Установить Claude Code</a> (3 минуты)</li>
77
+ <li><a href="#step3">Создать аккаунт на npm</a> (2 минуты)</li>
78
+ <li><a href="#step4">Войти в npm в терминале</a> (1 минута)</li>
79
+ <li><a href="#step5">Сообщить ваш ник продавцу</a> (1 минута + ожидание)</li>
80
+ <li><a href="#step6">Установить zrg-studio в проект</a> (30 секунд)</li>
81
+ <li><a href="#step7">Запустить первого агента</a></li>
82
+ </ol>
83
+ </div>
84
+
85
+ <h2 id="step1">Шаг 1. Установить Node.js</h2>
86
+ <p>Node.js — это программа, которая умеет запускать пакеты вроде нашего. Без неё ничего не заработает.</p>
87
+
88
+ <div class="step">
89
+ <h3>Что делать</h3>
90
+ <ol>
91
+ <li>Откройте сайт <a href="https://nodejs.org/" target="_blank">nodejs.org</a></li>
92
+ <li>На главной странице нажмите большую кнопку <strong>"LTS"</strong> (это «стабильная версия»). Она сама определит вашу операционную систему.</li>
93
+ <li>Откройте скачанный файл и пройдите установку, нажимая «Далее» / «Continue» на каждом шаге. Соглашайтесь со всем по умолчанию.</li>
94
+ </ol>
95
+
96
+ <h3 style="margin-top:24px">Как проверить что работает</h3>
97
+ <p>Откройте терминал:</p>
98
+ <ul>
99
+ <li><strong>Mac:</strong> нажмите <span class="kbd">⌘</span> + <span class="kbd">пробел</span>, наберите <em>Terminal</em>, <span class="kbd">Enter</span>.</li>
100
+ <li><strong>Windows:</strong> нажмите <span class="kbd">Win</span>, наберите <em>PowerShell</em>, <span class="kbd">Enter</span>.</li>
101
+ </ul>
102
+ <p>В открывшемся чёрном окне вставьте и нажмите <span class="kbd">Enter</span>:</p>
103
+ <div class="copy"><pre><code>node --version</code></pre><button class="copy-btn" data-copy="node --version">Копировать</button></div>
104
+ <p>Должно вывести что-то типа <code>v20.11.0</code>. Если так — Node стоит. Если ошибка «команда не найдена» — перезапустите терминал.</p>
105
+ </div>
106
+
107
+ <h2 id="step2">Шаг 2. Установить Claude Code</h2>
108
+ <p>Claude Code — это приложение от Anthropic, в котором будут жить наши агенты.</p>
109
+
110
+ <div class="step">
111
+ <h3>Что делать</h3>
112
+ <ol>
113
+ <li>Откройте <a href="https://claude.com/claude-code" target="_blank">claude.com/claude-code</a></li>
114
+ <li>Скачайте установщик для вашей системы (Mac / Windows).</li>
115
+ <li>Установите. При первом запуске войдите своим аккаунтом Claude / Anthropic. Если аккаунта нет — заведите там же, бесплатно.</li>
116
+ </ol>
117
+ <div class="note">
118
+ Платная подписка на Claude нужна только если хотите много гонять агентов. Для теста хватит free-tier.
119
+ </div>
120
+ </div>
121
+
122
+ <h2 id="step3">Шаг 3. Создать аккаунт на npm</h2>
123
+ <p>npm — это «магазин пакетов» для Node. Через него вы получите наш продукт.</p>
124
+
125
+ <div class="step">
126
+ <h3>Что делать</h3>
127
+ <ol>
128
+ <li>Откройте <a href="https://www.npmjs.com/signup" target="_blank">npmjs.com/signup</a></li>
129
+ <li>Заполните: <strong>username</strong> (короткий ник латиницей, например <code>anna-product</code>), email, пароль.</li>
130
+ <li>Подтвердите email через письмо, которое npm пришлёт.</li>
131
+ </ol>
132
+ <div class="warn">
133
+ <strong>Запомните или запишите ваш username</strong> — именно его вы сообщите продавцу. И email + пароль для следующего шага.
134
+ </div>
135
+ </div>
136
+
137
+ <h2 id="step4">Шаг 4. Войти в npm в терминале</h2>
138
+ <p>Один раз — чтобы потом установка работала автоматически.</p>
139
+
140
+ <div class="step">
141
+ <h3>Что делать</h3>
142
+ <p>В терминале выполните:</p>
143
+ <div class="copy"><pre><code>npm login</code></pre><button class="copy-btn" data-copy="npm login">Копировать</button></div>
144
+ <p>Откроется браузер, попросит подтвердить вход. Нажмите кнопку <strong>"Login"</strong> на странице, потом можно браузер закрыть.</p>
145
+ <p>В терминале появится строчка <code>Logged in as &lt;ваш-ник&gt; on https://registry.npmjs.org/</code> — значит готово.</p>
146
+
147
+ <h3 style="margin-top:24px">Проверка</h3>
148
+ <div class="copy"><pre><code>npm whoami</code></pre><button class="copy-btn" data-copy="npm whoami">Копировать</button></div>
149
+ <p>Должно вывести ваш ник.</p>
150
+ </div>
151
+
152
+ <h2 id="step5">Шаг 5. Сообщить ник продавцу</h2>
153
+
154
+ <div class="step">
155
+ <h3>Что делать</h3>
156
+ <ol>
157
+ <li>Напишите продавцу: <strong>«Мой npm username: <em>ваш-ник</em>. Пожалуйста, добавьте меня в команду.»</strong></li>
158
+ <li>После того как добавят — придёт письмо на ваш email от npm: <em>«You've been added to the team @zrg-sh:buyers»</em>.</li>
159
+ </ol>
160
+ <div class="ok">
161
+ Только после этого следующий шаг сработает. До этого момента будет ошибка <code>403 Forbidden</code> — это нормально, просто ещё не дали доступ.
162
+ </div>
163
+ </div>
164
+
165
+ <h2 id="step6">Шаг 6. Установить zrg-studio в проект</h2>
166
+
167
+ <div class="step">
168
+ <h3>Что делать</h3>
169
+ <ol>
170
+ <li>Создайте или откройте папку, где будет жить ваш проект продуктовой спеки. Например <code>~/Documents/my-product</code>.</li>
171
+ <li>В терминале перейдите в эту папку. Простой способ:
172
+ <ul>
173
+ <li><strong>Mac:</strong> наберите <code>cd </code> (с пробелом!), затем перетащите папку из Finder в окно терминала — путь подставится сам. Нажмите <span class="kbd">Enter</span>.</li>
174
+ <li><strong>Windows:</strong> в проводнике откройте папку, щёлкните по адресной строке, наберите <code>powershell</code> и <span class="kbd">Enter</span> — терминал откроется прямо в этой папке.</li>
175
+ </ul>
176
+ </li>
177
+ <li>Выполните <strong>одну команду</strong>:
178
+ <div class="copy"><pre><code>npx @zrg-sh/studio init</code></pre><button class="copy-btn" data-copy="npx @zrg-sh/studio init">Копировать</button></div>
179
+ Первый раз npm может спросить разрешение скачать пакет — отвечайте <code>y</code> и <span class="kbd">Enter</span>.
180
+ </li>
181
+ </ol>
182
+ <div class="ok">
183
+ Если в конце вывело <strong>"Done. Next steps:"</strong> — всё установилось. В папке появилось две вещи: <code>product-specs/</code> и <code>.claude/</code>.
184
+ </div>
185
+ <div class="warn">
186
+ Если ошибка <code>403 Forbidden</code> — продавец ещё не добавил вас в команду, см. Шаг 5.<br>
187
+ Если ошибка <code>npm: command not found</code> — Node не установился, см. Шаг 1.
188
+ </div>
189
+ </div>
190
+
191
+ <h2 id="step7">Шаг 7. Запустить первого агента</h2>
192
+
193
+ <div class="step">
194
+ <h3>Что делать</h3>
195
+ <ol>
196
+ <li>Откройте Claude Code.</li>
197
+ <li>В нём откройте ту же папку, где запускали установку (File → Open Folder → выберите свою папку проекта).</li>
198
+ <li>
199
+ В окне чата с Клодом напишите команду и нажмите <span class="kbd">Enter</span>.
200
+ <ul>
201
+ <li>Если это <strong>новый проект</strong> (или вы хотите описать существующий, чтобы агент его понял) — начните с <code>/studio-onboard</code>. Это «знакомство»: агент задаст вопросы про продукт, пользователей и домены, и сам заполнит базу. Идёт в несколько подходов, можно выйти и продолжить позже.</li>
202
+ <li>Если база уже заполнена и вы хотите <strong>добавить новую фичу</strong> — пишите <code>/studio-pm</code>.</li>
203
+ </ul>
204
+ </li>
205
+ <li>Агент задаст вам вопросы. Отвечайте словами на русском, как живому коллеге. Если устали — просто закройте Claude Code, в следующий раз продолжит с того же места.</li>
206
+ </ol>
207
+ <div class="note">
208
+ <strong>Команды, которые можно запускать в Claude Code:</strong><br>
209
+ <code>/studio-onboard</code> — <em>cold start</em>: заполнить видение продукта, карту возможностей и домены с нуля (или по существующему коду). Многоитерационный диалог.<br>
210
+ <code>/studio-pm</code> — начать новую фичу (когда основа уже есть)<br>
211
+ <code>/studio-analyst</code> — анализ рисков<br>
212
+ <code>/studio-scenario-writer</code> — пользовательские сценарии<br>
213
+ <code>/studio-domain-framer</code> — детальная модель одного домена<br>
214
+ <code>/studio-designer</code> — UX-наброски
215
+ </div>
216
+ <div class="ok">
217
+ <strong>С чего начать в первый раз:</strong> запустите <code>/studio-onboard</code>. Это самый длинный, но самый важный шаг — он расскажет агенту про ваш продукт. После этого все остальные команды будут понимать контекст.
218
+ </div>
219
+ </div>
220
+
221
+ <hr class="hr">
222
+
223
+ <h2>Частые проблемы</h2>
224
+
225
+ <h3>«npm: command not found»</h3>
226
+ <p>Node.js не установлен или терминал не был перезапущен после установки. Закройте все окна терминала, откройте заново и проверьте <code>node --version</code>.</p>
227
+
228
+ <h3>«403 Forbidden» или «E403» при <code>npx</code></h3>
229
+ <p>Вас ещё не добавили в команду на npm. Напишите продавцу и подождите письмо от npm.</p>
230
+
231
+ <h3>«EACCES» / «permission denied»</h3>
232
+ <p>На Mac: попробуйте префикс <code>sudo</code>, например <code>sudo npx @zrg-sh/studio init</code>. Введите пароль от компьютера. На Windows такого обычно нет.</p>
233
+
234
+ <h3>«ENOENT» при init</h3>
235
+ <p>Вы запустили команду не из той папки. Проверьте куда вы перешли командой <code>pwd</code> (на Mac) или <code>cd</code> (на Windows без аргументов).</p>
236
+
237
+ <h3>Сломалось всё — как откатить?</h3>
238
+ <p>Просто удалите папку <code>product-specs/</code> и <code>.claude/</code> в проекте. Никаких системных файлов мы не трогаем.</p>
239
+
240
+ <h3>Обновить до новой версии?</h3>
241
+ <p>Запустите в той же папке:</p>
242
+ <div class="copy"><pre><code>npx @zrg-sh/studio@latest init --force</code></pre><button class="copy-btn" data-copy="npx @zrg-sh/studio@latest init --force">Копировать</button></div>
243
+ <p><strong>Внимание:</strong> <code>--force</code> перезапишет файлы. Если вы что-то правили в <code>product-specs/</code> руками — сохраните их в другую папку перед обновлением.</p>
244
+
245
+ <p class="footer">© zrg-studio. Closed source, by invitation.</p>
246
+
247
+ </div>
248
+
249
+ <script>
250
+ // One-click copy for code blocks.
251
+ document.querySelectorAll('.copy-btn').forEach((btn) => {
252
+ btn.addEventListener('click', async () => {
253
+ const text = btn.getAttribute('data-copy');
254
+ try {
255
+ await navigator.clipboard.writeText(text);
256
+ const orig = btn.textContent;
257
+ btn.textContent = 'Скопировано';
258
+ btn.classList.add('done');
259
+ setTimeout(() => {
260
+ btn.textContent = orig;
261
+ btn.classList.remove('done');
262
+ }, 1500);
263
+ } catch {
264
+ btn.textContent = 'Ошибка';
265
+ }
266
+ });
267
+ });
268
+ </script>
269
+ </body>
270
+ </html>
package/README.md ADDED
@@ -0,0 +1,82 @@
1
+ # @zrg-sh/studio
2
+
3
+ DDD product-spec pipeline agents for Claude Code. Drop-in `studio-*` agents, slash commands, and hooks for going from raw idea → structured change → reviewed spec.
4
+
5
+ > **Closed source.** Access by invitation only. If you do not have a team membership, you cannot install this package.
6
+ >
7
+ > **Non-technical users:** open **[ONBOARDING.html](./ONBOARDING.html)** — pictures and click-by-click steps.
8
+
9
+ ## Quick install (developers)
10
+
11
+ ```bash
12
+ npm login # one-time, use your npm account
13
+ npx @zrg-sh/studio init # in any project root
14
+ ```
15
+
16
+ That's it. The CLI:
17
+
18
+ 1. Copies `product-specs/` into your current folder (skeleton + agent prompts + hooks).
19
+ 2. Copies 7 `studio-*` agents into `.claude/agents/`.
20
+ 3. Copies 5 `/studio-*` slash commands into `.claude/commands/`.
21
+ 4. Merges studio hooks into `.claude/settings.json` (idempotent).
22
+
23
+ Then open the folder in Claude Code and type `/studio-pm` to start.
24
+
25
+ ## Commands
26
+
27
+ ```text
28
+ npx @zrg-sh/studio init # install into current dir
29
+ npx @zrg-sh/studio init --force # overwrite existing files
30
+ npx @zrg-sh/studio init --no-hooks # don't touch .claude/settings.json
31
+ npx @zrg-sh/studio doctor # verify install
32
+ npx @zrg-sh/studio --version
33
+ ```
34
+
35
+ ## What you get
36
+
37
+ | Path | What |
38
+ |------|------|
39
+ | `product-specs/CLAUDE.md` | Pipeline overview |
40
+ | `product-specs/agents/studio-*.md` | 14 agent prompts (PM, analyst, scenario-writer, domain-framer, designer, reviewer, merger, …) |
41
+ | `product-specs/hooks/` | 6 hooks (stage-gate, conflict-detect, prompt-guard, …) |
42
+ | `product-specs/workflows/` | 7 workflows (pipeline-full, pipeline-resume, …) |
43
+ | `product-specs/rules/` | DDD + change management conventions |
44
+ | `product-specs/references/` | Model profiles, stage pipeline, gates |
45
+ | `product-specs/templates/` | Change/domain/meta scaffolds |
46
+ | `product-specs/docs/_meta/*.example.md` | Reference fillings from the original project — replace with your own |
47
+ | `.claude/agents/studio-*.md` | Claude Code agent definitions |
48
+ | `.claude/commands/studio-*.md` | `/studio-*` interactive slash commands |
49
+
50
+ ## Pipeline at a glance
51
+
52
+ ```text
53
+ /studio-onboard → Journey: заполнить _meta/ + domains/ с нуля (greenfield или brownfield)
54
+ /studio-pm → PRDCT draft (intent + readiness)
55
+ /studio-analyst → Risk + scope analysis
56
+ /studio-scenario-writer → User scenarios
57
+ /studio-domain-framer → Domain model (aggregates, VOs, events)
58
+ /studio-designer → UX surfaces + HTML mockups
59
+ studio-reviewer → Cross-doc consistency
60
+ studio-merger → Merge into canon
61
+ ```
62
+
63
+ **Cold start (новый проект):** запусти `/studio-onboard` — многоитерационный диалог, который заполнит базовое видение продукта, capability map, карту доменов и скелеты доменной документации. Можно прерывать в любой момент и возобновлять.
64
+
65
+ See `product-specs/references/stage-pipeline.md` for the full version.
66
+
67
+ ## Access
68
+
69
+ This is a private scoped package. To request access, contact the maintainer with your npm username.
70
+
71
+ After you've been added to the `@zrg-sh:buyers` team:
72
+
73
+ ```bash
74
+ npm login # use your npm account
75
+ npx @zrg-sh/studio init
76
+ ```
77
+
78
+ If `npm install` returns `403 Forbidden`, your account is not in the team yet.
79
+
80
+ ## License
81
+
82
+ Proprietary. UNLICENSED. Do not redistribute.
@@ -0,0 +1,67 @@
1
+ #!/usr/bin/env node
2
+ // Entry point for the @zrg-sh/studio CLI.
3
+ // Routes to subcommand handlers under src/commands/.
4
+
5
+ import { runInit } from '../src/commands/init.mjs';
6
+ import { runDoctor } from '../src/commands/doctor.mjs';
7
+ import { readFile } from 'node:fs/promises';
8
+ import { fileURLToPath } from 'node:url';
9
+ import { dirname, join } from 'node:path';
10
+
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+ const pkgPath = join(__dirname, '..', 'package.json');
13
+
14
+ const args = process.argv.slice(2);
15
+ const cmd = args[0];
16
+
17
+ function printHelp() {
18
+ console.log(`@zrg-sh/studio — DDD product-spec pipeline for Claude Code
19
+
20
+ Usage:
21
+ npx @zrg-sh/studio <command> [options]
22
+
23
+ Commands:
24
+ init Copy product-specs/ and .claude/{agents,commands}/studio-* into current dir
25
+ doctor Verify installed files are intact
26
+ --version, -v Print version
27
+ --help, -h Show this help
28
+
29
+ Init options:
30
+ --force Overwrite existing files
31
+ --no-hooks Skip merging studio hooks into .claude/settings.json
32
+ `);
33
+ }
34
+
35
+ async function printVersion() {
36
+ const pkg = JSON.parse(await readFile(pkgPath, 'utf8'));
37
+ console.log(pkg.version);
38
+ }
39
+
40
+ try {
41
+ switch (cmd) {
42
+ case undefined:
43
+ case '--help':
44
+ case '-h':
45
+ case 'help':
46
+ printHelp();
47
+ break;
48
+ case '--version':
49
+ case '-v':
50
+ await printVersion();
51
+ break;
52
+ case 'init':
53
+ await runInit(args.slice(1));
54
+ break;
55
+ case 'doctor':
56
+ await runDoctor();
57
+ break;
58
+ default:
59
+ console.error(`Unknown command: ${cmd}\n`);
60
+ printHelp();
61
+ process.exit(1);
62
+ }
63
+ } catch (err) {
64
+ console.error(`\nError: ${err.message}`);
65
+ if (process.env.DEBUG) console.error(err.stack);
66
+ process.exit(1);
67
+ }
package/package.json ADDED
@@ -0,0 +1,29 @@
1
+ {
2
+ "name": "@zrg-sh/studio",
3
+ "version": "0.1.0",
4
+ "description": "DDD product-spec pipeline agents and commands for Claude Code (studio-pm, studio-analyst, studio-domain-framer, etc.)",
5
+ "type": "module",
6
+ "bin": {
7
+ "zrg-studio": "bin/zrg-studio.mjs"
8
+ },
9
+ "files": [
10
+ "bin",
11
+ "src",
12
+ "template",
13
+ "README.md",
14
+ "ONBOARDING.html",
15
+ "LICENSE"
16
+ ],
17
+ "engines": {
18
+ "node": ">=18"
19
+ },
20
+ "publishConfig": {
21
+ "access": "public"
22
+ },
23
+ "scripts": {
24
+ "test": "node --test test/"
25
+ },
26
+ "license": "UNLICENSED",
27
+ "author": "matthew",
28
+ "keywords": ["claude-code", "ddd", "product-spec", "agents"]
29
+ }
@@ -0,0 +1,60 @@
1
+ // `doctor` command: sanity-checks an installed zrg-studio layout in cwd.
2
+
3
+ import { existsSync } from 'node:fs';
4
+ import { readdir } from 'node:fs/promises';
5
+ import { join } from 'node:path';
6
+
7
+ const REQUIRED_PATHS = [
8
+ 'product-specs/CLAUDE.md',
9
+ 'product-specs/agents',
10
+ 'product-specs/hooks',
11
+ 'product-specs/workflows',
12
+ 'product-specs/rules',
13
+ 'product-specs/references',
14
+ 'product-specs/templates',
15
+ 'product-specs/docs/_meta/doc-schema.md',
16
+ '.claude/agents',
17
+ '.claude/commands',
18
+ ];
19
+
20
+ const EXPECTED_STUDIO_AGENTS = 7;
21
+ const EXPECTED_STUDIO_COMMANDS = 6;
22
+
23
+ export async function runDoctor() {
24
+ const cwd = process.cwd();
25
+ const problems = [];
26
+
27
+ for (const rel of REQUIRED_PATHS) {
28
+ if (!existsSync(join(cwd, rel))) problems.push(`missing: ${rel}`);
29
+ }
30
+
31
+ // Count studio-* in .claude/{agents,commands}
32
+ try {
33
+ const agents = (await readdir(join(cwd, '.claude', 'agents')))
34
+ .filter((f) => f.startsWith('studio-') && f.endsWith('.md'));
35
+ if (agents.length < EXPECTED_STUDIO_AGENTS) {
36
+ problems.push(`expected >= ${EXPECTED_STUDIO_AGENTS} studio agents in .claude/agents, found ${agents.length}`);
37
+ }
38
+ } catch {
39
+ problems.push('.claude/agents not readable');
40
+ }
41
+
42
+ try {
43
+ const commands = (await readdir(join(cwd, '.claude', 'commands')))
44
+ .filter((f) => f.startsWith('studio-') && f.endsWith('.md'));
45
+ if (commands.length < EXPECTED_STUDIO_COMMANDS) {
46
+ problems.push(`expected >= ${EXPECTED_STUDIO_COMMANDS} studio commands in .claude/commands, found ${commands.length}`);
47
+ }
48
+ } catch {
49
+ problems.push('.claude/commands not readable');
50
+ }
51
+
52
+ if (problems.length === 0) {
53
+ console.log('OK — zrg-studio install looks healthy.');
54
+ } else {
55
+ console.log('Problems found:');
56
+ for (const p of problems) console.log(` - ${p}`);
57
+ console.log('\nRun `npx @zrg-sh/studio init --force` to repair.');
58
+ process.exit(1);
59
+ }
60
+ }
@@ -0,0 +1,44 @@
1
+ // `init` command: copies template/ into the user's current working directory
2
+ // and (unless --no-hooks) merges studio hooks into .claude/settings.json.
3
+
4
+ import { copyTree, TEMPLATE_ROOT } from '../lib/copy-template.mjs';
5
+ import { mergeClaudeSettings } from '../lib/merge-claude-settings.mjs';
6
+
7
+ export async function runInit(argv) {
8
+ const force = argv.includes('--force');
9
+ const noHooks = argv.includes('--no-hooks');
10
+ const cwd = process.cwd();
11
+
12
+ console.log(`\nInstalling @zrg-sh/studio into ${cwd}\n`);
13
+
14
+ const { copied, skipped } = await copyTree(TEMPLATE_ROOT, cwd, { force });
15
+
16
+ console.log(` Copied: ${copied.length} files`);
17
+ if (skipped.length > 0) {
18
+ console.log(` Skipped: ${skipped.length} (already exist; use --force to overwrite)`);
19
+ if (process.env.DEBUG) {
20
+ for (const p of skipped) console.log(` - ${p}`);
21
+ }
22
+ }
23
+
24
+ if (!noHooks) {
25
+ const { added, path } = await mergeClaudeSettings(cwd);
26
+ if (added > 0) {
27
+ console.log(` Hooks: added ${added} entries to ${path}`);
28
+ } else {
29
+ console.log(` Hooks: already configured in ${path}`);
30
+ }
31
+ } else {
32
+ console.log(` Hooks: skipped (--no-hooks)`);
33
+ }
34
+
35
+ console.log(`
36
+ Done. Next steps:
37
+
38
+ 1. Open this folder in Claude Code.
39
+ 2. First time? Run /studio-onboard — multi-turn journey that fills
40
+ product vision, capability map, and domains. Resumes if interrupted.
41
+ 3. Otherwise run /studio-pm to start a new feature.
42
+ 4. See product-specs/CLAUDE.md for the full pipeline overview.
43
+ `);
44
+ }
@@ -0,0 +1,42 @@
1
+ // Idempotent recursive copy from package's template/ into the user's cwd.
2
+ // Honors --force; otherwise skips files that already exist and reports them.
3
+
4
+ import { cp, mkdir, stat, readdir, copyFile } from 'node:fs/promises';
5
+ import { existsSync } from 'node:fs';
6
+ import { join, relative, dirname } from 'node:path';
7
+ import { fileURLToPath } from 'node:url';
8
+
9
+ const __dirname = dirname(fileURLToPath(import.meta.url));
10
+ export const TEMPLATE_ROOT = join(__dirname, '..', '..', 'template');
11
+
12
+ /**
13
+ * Recursively copies `src` to `dst`.
14
+ * Returns { copied: string[], skipped: string[] } (paths relative to dst root).
15
+ */
16
+ export async function copyTree(src, dst, { force = false, dstRoot = dst } = {}) {
17
+ const result = { copied: [], skipped: [] };
18
+ const entries = await readdir(src, { withFileTypes: true });
19
+
20
+ await mkdir(dst, { recursive: true });
21
+
22
+ for (const entry of entries) {
23
+ const s = join(src, entry.name);
24
+ const d = join(dst, entry.name);
25
+
26
+ if (entry.isDirectory()) {
27
+ const sub = await copyTree(s, d, { force, dstRoot });
28
+ result.copied.push(...sub.copied);
29
+ result.skipped.push(...sub.skipped);
30
+ } else if (entry.isFile()) {
31
+ const rel = relative(dstRoot, d);
32
+ if (existsSync(d) && !force) {
33
+ result.skipped.push(rel);
34
+ } else {
35
+ await copyFile(s, d);
36
+ result.copied.push(rel);
37
+ }
38
+ }
39
+ }
40
+
41
+ return result;
42
+ }