gentyr 1.3.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 (599) hide show
  1. package/.claude/agents/antipattern-hunter.md +176 -0
  2. package/.claude/agents/code-reviewer.md +205 -0
  3. package/.claude/agents/code-writer.md +154 -0
  4. package/.claude/agents/deputy-cto.md +309 -0
  5. package/.claude/agents/feedback-agent.md +101 -0
  6. package/.claude/agents/investigator.md +136 -0
  7. package/.claude/agents/product-manager.md +97 -0
  8. package/.claude/agents/project-manager.md +116 -0
  9. package/.claude/agents/repo-hygiene-expert.md +626 -0
  10. package/.claude/agents/secret-manager.md +324 -0
  11. package/.claude/agents/test-writer.md +354 -0
  12. package/.claude/commands/configure-personas.md +144 -0
  13. package/.claude/commands/cto-report.md +36 -0
  14. package/.claude/commands/demo.md +89 -0
  15. package/.claude/commands/deputy-cto.md +345 -0
  16. package/.claude/commands/hotfix.md +31 -0
  17. package/.claude/commands/overdrive-gentyr.md +167 -0
  18. package/.claude/commands/product-manager.md +32 -0
  19. package/.claude/commands/push-migrations.md +86 -0
  20. package/.claude/commands/push-secrets.md +97 -0
  21. package/.claude/commands/services.json.example +30 -0
  22. package/.claude/commands/setup-gentyr.md +396 -0
  23. package/.claude/commands/show.md +42 -0
  24. package/.claude/commands/spawn-tasks.md +79 -0
  25. package/.claude/commands/toggle-automation-gentyr.md +75 -0
  26. package/.claude/commands/toggle-product-manager.md +19 -0
  27. package/.claude/commands/triage.md +69 -0
  28. package/.claude/hooks/README.md +686 -0
  29. package/.claude/hooks/__tests__/README.md +129 -0
  30. package/.claude/hooks/agent-tracker.js +434 -0
  31. package/.claude/hooks/antipattern-hunter-hook.js +401 -0
  32. package/.claude/hooks/api-key-watcher.js +289 -0
  33. package/.claude/hooks/block-no-verify.js +301 -0
  34. package/.claude/hooks/bypass-approval-hook.js +313 -0
  35. package/.claude/hooks/compliance-checker.js +1309 -0
  36. package/.claude/hooks/config-reader.js +143 -0
  37. package/.claude/hooks/credential-file-guard.js +1139 -0
  38. package/.claude/hooks/credential-health-check.js +168 -0
  39. package/.claude/hooks/credential-sync-hook.js +79 -0
  40. package/.claude/hooks/cto-notification-hook.js +656 -0
  41. package/.claude/hooks/feedback-launcher.js +424 -0
  42. package/.claude/hooks/feedback-orchestrator.js +367 -0
  43. package/.claude/hooks/gentyr-splash.js +47 -0
  44. package/.claude/hooks/gentyr-sync.js +389 -0
  45. package/.claude/hooks/hourly-automation.js +3340 -0
  46. package/.claude/hooks/key-sync.js +899 -0
  47. package/.claude/hooks/lib/approval-utils.js +731 -0
  48. package/.claude/hooks/lib/feature-branch-helper.js +102 -0
  49. package/.claude/hooks/lib/worktree-manager.js +330 -0
  50. package/.claude/hooks/mapping-validator.js +285 -0
  51. package/.claude/hooks/plan-executor.js +398 -0
  52. package/.claude/hooks/playwright-cli-guard.js +104 -0
  53. package/.claude/hooks/playwright-health-check.js +71 -0
  54. package/.claude/hooks/pre-commit-review.js +725 -0
  55. package/.claude/hooks/prompts/local-spec-enforcement.md +310 -0
  56. package/.claude/hooks/prompts/mapping-fix.md +92 -0
  57. package/.claude/hooks/prompts/mapping-review.md +140 -0
  58. package/.claude/hooks/prompts/schema-mapper.md +185 -0
  59. package/.claude/hooks/prompts/spec-enforcement.md +233 -0
  60. package/.claude/hooks/protected-action-approval-hook.js +336 -0
  61. package/.claude/hooks/protected-action-gate.js +562 -0
  62. package/.claude/hooks/protected-actions.json +208 -0
  63. package/.claude/hooks/protected-actions.json.template +122 -0
  64. package/.claude/hooks/quota-monitor.js +490 -0
  65. package/.claude/hooks/reporters/jest-failure-reporter.js +401 -0
  66. package/.claude/hooks/reporters/playwright-failure-reporter.js +446 -0
  67. package/.claude/hooks/reporters/vitest-failure-reporter.js +443 -0
  68. package/.claude/hooks/schema-mapper-hook.js +544 -0
  69. package/.claude/hooks/secret-leak-detector.js +216 -0
  70. package/.claude/hooks/session-reviver.js +514 -0
  71. package/.claude/hooks/slash-command-prefetch.js +1145 -0
  72. package/.claude/hooks/stale-work-detector.js +205 -0
  73. package/.claude/hooks/stop-continue-hook.js +414 -0
  74. package/.claude/hooks/todo-maintenance.js +522 -0
  75. package/.claude/hooks/todo-processing-prompt.md +75 -0
  76. package/.claude/hooks/usage-optimizer.js +791 -0
  77. package/.claude/mcp/README.md +246 -0
  78. package/.claude/settings.json.template +168 -0
  79. package/.mcp.json.template +207 -0
  80. package/CLAUDE.md +340 -0
  81. package/CLAUDE.md.gentyr-section +89 -0
  82. package/LICENSE +21 -0
  83. package/README.md +297 -0
  84. package/cli/commands/init.js +471 -0
  85. package/cli/commands/migrate.js +132 -0
  86. package/cli/commands/protect.js +271 -0
  87. package/cli/commands/scaffold.js +48 -0
  88. package/cli/commands/status.js +133 -0
  89. package/cli/commands/sync.js +101 -0
  90. package/cli/commands/uninstall.js +207 -0
  91. package/cli/index.js +111 -0
  92. package/cli/lib/config-gen.js +214 -0
  93. package/cli/lib/resolve-framework.js +97 -0
  94. package/cli/lib/state.js +140 -0
  95. package/cli/lib/symlinks.js +260 -0
  96. package/docs/AUTOMATION-SYSTEMS.md +484 -0
  97. package/docs/BINARY-PATCHING.md +212 -0
  98. package/docs/CHANGELOG.md +2830 -0
  99. package/docs/CREDENTIAL-DETECTION.md +151 -0
  100. package/docs/CTO-DASHBOARD.md +476 -0
  101. package/docs/DEPLOYMENT-FLOW.md +477 -0
  102. package/docs/DEVELOPER.md +116 -0
  103. package/docs/Executive.md +372 -0
  104. package/docs/SECRET-PATHS.md +77 -0
  105. package/docs/SETUP-GUIDE.md +419 -0
  106. package/docs/STACK.md +109 -0
  107. package/docs/TESTING.md +440 -0
  108. package/docs/assets/claude-logo.svg +3 -0
  109. package/docs/sessions/2026-01-24-spec-suite-implementation.md +190 -0
  110. package/docs/sessions/2026-02-15-feedback-e2e-audit.md +484 -0
  111. package/docs/sessions/2026-02-20-credential-rotation-experiments.md +340 -0
  112. package/docs/sessions/TEST-COVERAGE-REPORT-2026-02-20.md +168 -0
  113. package/docs/shared/EPHEMERAL-STATE-FILES.md +115 -0
  114. package/docs/shared/PROTECTION-SYSTEM.md +341 -0
  115. package/husky/post-commit +10 -0
  116. package/husky/pre-commit +40 -0
  117. package/husky/pre-push +94 -0
  118. package/package.json +43 -0
  119. package/packages/cto-dashboard/package-lock.json +3510 -0
  120. package/packages/cto-dashboard/package.json +41 -0
  121. package/packages/cto-dashboard/pnpm-lock.yaml +2168 -0
  122. package/packages/mcp-servers/dist/__testUtils__/fixtures.d.ts +220 -0
  123. package/packages/mcp-servers/dist/__testUtils__/fixtures.d.ts.map +1 -0
  124. package/packages/mcp-servers/dist/__testUtils__/fixtures.js +376 -0
  125. package/packages/mcp-servers/dist/__testUtils__/fixtures.js.map +1 -0
  126. package/packages/mcp-servers/dist/__testUtils__/index.d.ts +121 -0
  127. package/packages/mcp-servers/dist/__testUtils__/index.d.ts.map +1 -0
  128. package/packages/mcp-servers/dist/__testUtils__/index.js +180 -0
  129. package/packages/mcp-servers/dist/__testUtils__/index.js.map +1 -0
  130. package/packages/mcp-servers/dist/__testUtils__/schemas.d.ts +84 -0
  131. package/packages/mcp-servers/dist/__testUtils__/schemas.d.ts.map +1 -0
  132. package/packages/mcp-servers/dist/__testUtils__/schemas.js +309 -0
  133. package/packages/mcp-servers/dist/__testUtils__/schemas.js.map +1 -0
  134. package/packages/mcp-servers/dist/agent-reports/index.d.ts +7 -0
  135. package/packages/mcp-servers/dist/agent-reports/index.d.ts.map +1 -0
  136. package/packages/mcp-servers/dist/agent-reports/index.js +8 -0
  137. package/packages/mcp-servers/dist/agent-reports/index.js.map +1 -0
  138. package/packages/mcp-servers/dist/agent-reports/server.d.ts +22 -0
  139. package/packages/mcp-servers/dist/agent-reports/server.d.ts.map +1 -0
  140. package/packages/mcp-servers/dist/agent-reports/server.js +535 -0
  141. package/packages/mcp-servers/dist/agent-reports/server.js.map +1 -0
  142. package/packages/mcp-servers/dist/agent-reports/types.d.ts +258 -0
  143. package/packages/mcp-servers/dist/agent-reports/types.d.ts.map +1 -0
  144. package/packages/mcp-servers/dist/agent-reports/types.js +81 -0
  145. package/packages/mcp-servers/dist/agent-reports/types.js.map +1 -0
  146. package/packages/mcp-servers/dist/agent-tracker/index.d.ts +5 -0
  147. package/packages/mcp-servers/dist/agent-tracker/index.d.ts.map +1 -0
  148. package/packages/mcp-servers/dist/agent-tracker/index.js +5 -0
  149. package/packages/mcp-servers/dist/agent-tracker/index.js.map +1 -0
  150. package/packages/mcp-servers/dist/agent-tracker/server.d.ts +12 -0
  151. package/packages/mcp-servers/dist/agent-tracker/server.d.ts.map +1 -0
  152. package/packages/mcp-servers/dist/agent-tracker/server.js +919 -0
  153. package/packages/mcp-servers/dist/agent-tracker/server.js.map +1 -0
  154. package/packages/mcp-servers/dist/agent-tracker/types.d.ts +328 -0
  155. package/packages/mcp-servers/dist/agent-tracker/types.d.ts.map +1 -0
  156. package/packages/mcp-servers/dist/agent-tracker/types.js +128 -0
  157. package/packages/mcp-servers/dist/agent-tracker/types.js.map +1 -0
  158. package/packages/mcp-servers/dist/chrome-bridge/browser-tips.d.ts +27 -0
  159. package/packages/mcp-servers/dist/chrome-bridge/browser-tips.d.ts.map +1 -0
  160. package/packages/mcp-servers/dist/chrome-bridge/browser-tips.js +167 -0
  161. package/packages/mcp-servers/dist/chrome-bridge/browser-tips.js.map +1 -0
  162. package/packages/mcp-servers/dist/chrome-bridge/index.d.ts +6 -0
  163. package/packages/mcp-servers/dist/chrome-bridge/index.d.ts.map +1 -0
  164. package/packages/mcp-servers/dist/chrome-bridge/index.js +6 -0
  165. package/packages/mcp-servers/dist/chrome-bridge/index.js.map +1 -0
  166. package/packages/mcp-servers/dist/chrome-bridge/server.d.ts +13 -0
  167. package/packages/mcp-servers/dist/chrome-bridge/server.d.ts.map +1 -0
  168. package/packages/mcp-servers/dist/chrome-bridge/server.js +959 -0
  169. package/packages/mcp-servers/dist/chrome-bridge/server.js.map +1 -0
  170. package/packages/mcp-servers/dist/chrome-bridge/types.d.ts +41 -0
  171. package/packages/mcp-servers/dist/chrome-bridge/types.d.ts.map +1 -0
  172. package/packages/mcp-servers/dist/chrome-bridge/types.js +8 -0
  173. package/packages/mcp-servers/dist/chrome-bridge/types.js.map +1 -0
  174. package/packages/mcp-servers/dist/cloudflare/index.d.ts +8 -0
  175. package/packages/mcp-servers/dist/cloudflare/index.d.ts.map +1 -0
  176. package/packages/mcp-servers/dist/cloudflare/index.js +8 -0
  177. package/packages/mcp-servers/dist/cloudflare/index.js.map +1 -0
  178. package/packages/mcp-servers/dist/cloudflare/server.d.ts +16 -0
  179. package/packages/mcp-servers/dist/cloudflare/server.d.ts.map +1 -0
  180. package/packages/mcp-servers/dist/cloudflare/server.js +253 -0
  181. package/packages/mcp-servers/dist/cloudflare/server.js.map +1 -0
  182. package/packages/mcp-servers/dist/cloudflare/types.d.ts +141 -0
  183. package/packages/mcp-servers/dist/cloudflare/types.d.ts.map +1 -0
  184. package/packages/mcp-servers/dist/cloudflare/types.js +53 -0
  185. package/packages/mcp-servers/dist/cloudflare/types.js.map +1 -0
  186. package/packages/mcp-servers/dist/codecov/index.d.ts +7 -0
  187. package/packages/mcp-servers/dist/codecov/index.d.ts.map +1 -0
  188. package/packages/mcp-servers/dist/codecov/index.js +7 -0
  189. package/packages/mcp-servers/dist/codecov/index.js.map +1 -0
  190. package/packages/mcp-servers/dist/codecov/server.d.ts +21 -0
  191. package/packages/mcp-servers/dist/codecov/server.d.ts.map +1 -0
  192. package/packages/mcp-servers/dist/codecov/server.js +376 -0
  193. package/packages/mcp-servers/dist/codecov/server.js.map +1 -0
  194. package/packages/mcp-servers/dist/codecov/types.d.ts +269 -0
  195. package/packages/mcp-servers/dist/codecov/types.d.ts.map +1 -0
  196. package/packages/mcp-servers/dist/codecov/types.js +128 -0
  197. package/packages/mcp-servers/dist/codecov/types.js.map +1 -0
  198. package/packages/mcp-servers/dist/cto-report/index.d.ts +9 -0
  199. package/packages/mcp-servers/dist/cto-report/index.d.ts.map +1 -0
  200. package/packages/mcp-servers/dist/cto-report/index.js +9 -0
  201. package/packages/mcp-servers/dist/cto-report/index.js.map +1 -0
  202. package/packages/mcp-servers/dist/cto-report/server.d.ts +14 -0
  203. package/packages/mcp-servers/dist/cto-report/server.d.ts.map +1 -0
  204. package/packages/mcp-servers/dist/cto-report/server.js +859 -0
  205. package/packages/mcp-servers/dist/cto-report/server.js.map +1 -0
  206. package/packages/mcp-servers/dist/cto-report/types.d.ts +213 -0
  207. package/packages/mcp-servers/dist/cto-report/types.d.ts.map +1 -0
  208. package/packages/mcp-servers/dist/cto-report/types.js +29 -0
  209. package/packages/mcp-servers/dist/cto-report/types.js.map +1 -0
  210. package/packages/mcp-servers/dist/cto-reports/index.d.ts +7 -0
  211. package/packages/mcp-servers/dist/cto-reports/index.d.ts.map +1 -0
  212. package/packages/mcp-servers/dist/cto-reports/index.js +8 -0
  213. package/packages/mcp-servers/dist/cto-reports/index.js.map +1 -0
  214. package/packages/mcp-servers/dist/cto-reports/server.d.ts +20 -0
  215. package/packages/mcp-servers/dist/cto-reports/server.d.ts.map +1 -0
  216. package/packages/mcp-servers/dist/cto-reports/server.js +538 -0
  217. package/packages/mcp-servers/dist/cto-reports/server.js.map +1 -0
  218. package/packages/mcp-servers/dist/cto-reports/types.d.ts +236 -0
  219. package/packages/mcp-servers/dist/cto-reports/types.d.ts.map +1 -0
  220. package/packages/mcp-servers/dist/cto-reports/types.js +77 -0
  221. package/packages/mcp-servers/dist/cto-reports/types.js.map +1 -0
  222. package/packages/mcp-servers/dist/deputy-cto/index.d.ts +7 -0
  223. package/packages/mcp-servers/dist/deputy-cto/index.d.ts.map +1 -0
  224. package/packages/mcp-servers/dist/deputy-cto/index.js +8 -0
  225. package/packages/mcp-servers/dist/deputy-cto/index.js.map +1 -0
  226. package/packages/mcp-servers/dist/deputy-cto/server.d.ts +23 -0
  227. package/packages/mcp-servers/dist/deputy-cto/server.d.ts.map +1 -0
  228. package/packages/mcp-servers/dist/deputy-cto/server.js +1700 -0
  229. package/packages/mcp-servers/dist/deputy-cto/server.js.map +1 -0
  230. package/packages/mcp-servers/dist/deputy-cto/types.d.ts +439 -0
  231. package/packages/mcp-servers/dist/deputy-cto/types.d.ts.map +1 -0
  232. package/packages/mcp-servers/dist/deputy-cto/types.js +102 -0
  233. package/packages/mcp-servers/dist/deputy-cto/types.js.map +1 -0
  234. package/packages/mcp-servers/dist/elastic-logs/index.d.ts +5 -0
  235. package/packages/mcp-servers/dist/elastic-logs/index.d.ts.map +1 -0
  236. package/packages/mcp-servers/dist/elastic-logs/index.js +5 -0
  237. package/packages/mcp-servers/dist/elastic-logs/index.js.map +1 -0
  238. package/packages/mcp-servers/dist/elastic-logs/server.d.ts +18 -0
  239. package/packages/mcp-servers/dist/elastic-logs/server.d.ts.map +1 -0
  240. package/packages/mcp-servers/dist/elastic-logs/server.js +259 -0
  241. package/packages/mcp-servers/dist/elastic-logs/server.js.map +1 -0
  242. package/packages/mcp-servers/dist/elastic-logs/types.d.ts +107 -0
  243. package/packages/mcp-servers/dist/elastic-logs/types.d.ts.map +1 -0
  244. package/packages/mcp-servers/dist/elastic-logs/types.js +31 -0
  245. package/packages/mcp-servers/dist/elastic-logs/types.js.map +1 -0
  246. package/packages/mcp-servers/dist/feedback-explorer/index.d.ts +2 -0
  247. package/packages/mcp-servers/dist/feedback-explorer/index.d.ts.map +1 -0
  248. package/packages/mcp-servers/dist/feedback-explorer/index.js +2 -0
  249. package/packages/mcp-servers/dist/feedback-explorer/index.js.map +1 -0
  250. package/packages/mcp-servers/dist/feedback-explorer/server.d.ts +21 -0
  251. package/packages/mcp-servers/dist/feedback-explorer/server.d.ts.map +1 -0
  252. package/packages/mcp-servers/dist/feedback-explorer/server.js +580 -0
  253. package/packages/mcp-servers/dist/feedback-explorer/server.js.map +1 -0
  254. package/packages/mcp-servers/dist/feedback-explorer/types.d.ts +331 -0
  255. package/packages/mcp-servers/dist/feedback-explorer/types.d.ts.map +1 -0
  256. package/packages/mcp-servers/dist/feedback-explorer/types.js +40 -0
  257. package/packages/mcp-servers/dist/feedback-explorer/types.js.map +1 -0
  258. package/packages/mcp-servers/dist/feedback-reporter/index.d.ts +9 -0
  259. package/packages/mcp-servers/dist/feedback-reporter/index.d.ts.map +1 -0
  260. package/packages/mcp-servers/dist/feedback-reporter/index.js +9 -0
  261. package/packages/mcp-servers/dist/feedback-reporter/index.js.map +1 -0
  262. package/packages/mcp-servers/dist/feedback-reporter/server.d.ts +36 -0
  263. package/packages/mcp-servers/dist/feedback-reporter/server.d.ts.map +1 -0
  264. package/packages/mcp-servers/dist/feedback-reporter/server.js +392 -0
  265. package/packages/mcp-servers/dist/feedback-reporter/server.js.map +1 -0
  266. package/packages/mcp-servers/dist/feedback-reporter/types.d.ts +152 -0
  267. package/packages/mcp-servers/dist/feedback-reporter/types.d.ts.map +1 -0
  268. package/packages/mcp-servers/dist/feedback-reporter/types.js +67 -0
  269. package/packages/mcp-servers/dist/feedback-reporter/types.js.map +1 -0
  270. package/packages/mcp-servers/dist/github/index.d.ts +7 -0
  271. package/packages/mcp-servers/dist/github/index.d.ts.map +1 -0
  272. package/packages/mcp-servers/dist/github/index.js +7 -0
  273. package/packages/mcp-servers/dist/github/index.js.map +1 -0
  274. package/packages/mcp-servers/dist/github/server.d.ts +15 -0
  275. package/packages/mcp-servers/dist/github/server.d.ts.map +1 -0
  276. package/packages/mcp-servers/dist/github/server.js +686 -0
  277. package/packages/mcp-servers/dist/github/server.js.map +1 -0
  278. package/packages/mcp-servers/dist/github/types.d.ts +660 -0
  279. package/packages/mcp-servers/dist/github/types.d.ts.map +1 -0
  280. package/packages/mcp-servers/dist/github/types.js +209 -0
  281. package/packages/mcp-servers/dist/github/types.js.map +1 -0
  282. package/packages/mcp-servers/dist/index.d.ts +30 -0
  283. package/packages/mcp-servers/dist/index.d.ts.map +1 -0
  284. package/packages/mcp-servers/dist/index.js +32 -0
  285. package/packages/mcp-servers/dist/index.js.map +1 -0
  286. package/packages/mcp-servers/dist/makerkit-docs/index.d.ts +5 -0
  287. package/packages/mcp-servers/dist/makerkit-docs/index.d.ts.map +1 -0
  288. package/packages/mcp-servers/dist/makerkit-docs/index.js +5 -0
  289. package/packages/mcp-servers/dist/makerkit-docs/index.js.map +1 -0
  290. package/packages/mcp-servers/dist/makerkit-docs/server.d.ts +15 -0
  291. package/packages/mcp-servers/dist/makerkit-docs/server.d.ts.map +1 -0
  292. package/packages/mcp-servers/dist/makerkit-docs/server.js +252 -0
  293. package/packages/mcp-servers/dist/makerkit-docs/server.js.map +1 -0
  294. package/packages/mcp-servers/dist/makerkit-docs/types.d.ts +74 -0
  295. package/packages/mcp-servers/dist/makerkit-docs/types.d.ts.map +1 -0
  296. package/packages/mcp-servers/dist/makerkit-docs/types.js +20 -0
  297. package/packages/mcp-servers/dist/makerkit-docs/types.js.map +1 -0
  298. package/packages/mcp-servers/dist/onepassword/index.d.ts +2 -0
  299. package/packages/mcp-servers/dist/onepassword/index.d.ts.map +1 -0
  300. package/packages/mcp-servers/dist/onepassword/index.js +2 -0
  301. package/packages/mcp-servers/dist/onepassword/index.js.map +1 -0
  302. package/packages/mcp-servers/dist/onepassword/server.d.ts +2 -0
  303. package/packages/mcp-servers/dist/onepassword/server.d.ts.map +1 -0
  304. package/packages/mcp-servers/dist/onepassword/server.js +159 -0
  305. package/packages/mcp-servers/dist/onepassword/server.js.map +1 -0
  306. package/packages/mcp-servers/dist/onepassword/types.d.ts +55 -0
  307. package/packages/mcp-servers/dist/onepassword/types.d.ts.map +1 -0
  308. package/packages/mcp-servers/dist/onepassword/types.js +22 -0
  309. package/packages/mcp-servers/dist/onepassword/types.js.map +1 -0
  310. package/packages/mcp-servers/dist/playwright/helpers.d.ts +20 -0
  311. package/packages/mcp-servers/dist/playwright/helpers.d.ts.map +1 -0
  312. package/packages/mcp-servers/dist/playwright/helpers.js +31 -0
  313. package/packages/mcp-servers/dist/playwright/helpers.js.map +1 -0
  314. package/packages/mcp-servers/dist/playwright/index.d.ts +5 -0
  315. package/packages/mcp-servers/dist/playwright/index.d.ts.map +1 -0
  316. package/packages/mcp-servers/dist/playwright/index.js +5 -0
  317. package/packages/mcp-servers/dist/playwright/index.js.map +1 -0
  318. package/packages/mcp-servers/dist/playwright/server.d.ts +13 -0
  319. package/packages/mcp-servers/dist/playwright/server.d.ts.map +1 -0
  320. package/packages/mcp-servers/dist/playwright/server.js +1201 -0
  321. package/packages/mcp-servers/dist/playwright/server.js.map +1 -0
  322. package/packages/mcp-servers/dist/playwright/types.d.ts +216 -0
  323. package/packages/mcp-servers/dist/playwright/types.d.ts.map +1 -0
  324. package/packages/mcp-servers/dist/playwright/types.js +172 -0
  325. package/packages/mcp-servers/dist/playwright/types.js.map +1 -0
  326. package/packages/mcp-servers/dist/playwright-feedback/browser-manager.d.ts +39 -0
  327. package/packages/mcp-servers/dist/playwright-feedback/browser-manager.d.ts.map +1 -0
  328. package/packages/mcp-servers/dist/playwright-feedback/browser-manager.js +71 -0
  329. package/packages/mcp-servers/dist/playwright-feedback/browser-manager.js.map +1 -0
  330. package/packages/mcp-servers/dist/playwright-feedback/index.d.ts +5 -0
  331. package/packages/mcp-servers/dist/playwright-feedback/index.d.ts.map +1 -0
  332. package/packages/mcp-servers/dist/playwright-feedback/index.js +5 -0
  333. package/packages/mcp-servers/dist/playwright-feedback/index.js.map +1 -0
  334. package/packages/mcp-servers/dist/playwright-feedback/server.d.ts +34 -0
  335. package/packages/mcp-servers/dist/playwright-feedback/server.d.ts.map +1 -0
  336. package/packages/mcp-servers/dist/playwright-feedback/server.js +538 -0
  337. package/packages/mcp-servers/dist/playwright-feedback/server.js.map +1 -0
  338. package/packages/mcp-servers/dist/playwright-feedback/types.d.ts +305 -0
  339. package/packages/mcp-servers/dist/playwright-feedback/types.d.ts.map +1 -0
  340. package/packages/mcp-servers/dist/playwright-feedback/types.js +123 -0
  341. package/packages/mcp-servers/dist/playwright-feedback/types.js.map +1 -0
  342. package/packages/mcp-servers/dist/product-manager/server.d.ts +17 -0
  343. package/packages/mcp-servers/dist/product-manager/server.d.ts.map +1 -0
  344. package/packages/mcp-servers/dist/product-manager/server.js +690 -0
  345. package/packages/mcp-servers/dist/product-manager/server.js.map +1 -0
  346. package/packages/mcp-servers/dist/product-manager/types.d.ts +286 -0
  347. package/packages/mcp-servers/dist/product-manager/types.d.ts.map +1 -0
  348. package/packages/mcp-servers/dist/product-manager/types.js +99 -0
  349. package/packages/mcp-servers/dist/product-manager/types.js.map +1 -0
  350. package/packages/mcp-servers/dist/programmatic-feedback/index.d.ts +7 -0
  351. package/packages/mcp-servers/dist/programmatic-feedback/index.d.ts.map +1 -0
  352. package/packages/mcp-servers/dist/programmatic-feedback/index.js +7 -0
  353. package/packages/mcp-servers/dist/programmatic-feedback/index.js.map +1 -0
  354. package/packages/mcp-servers/dist/programmatic-feedback/sandbox.d.ts +19 -0
  355. package/packages/mcp-servers/dist/programmatic-feedback/sandbox.d.ts.map +1 -0
  356. package/packages/mcp-servers/dist/programmatic-feedback/sandbox.js +174 -0
  357. package/packages/mcp-servers/dist/programmatic-feedback/sandbox.js.map +1 -0
  358. package/packages/mcp-servers/dist/programmatic-feedback/server.d.ts +35 -0
  359. package/packages/mcp-servers/dist/programmatic-feedback/server.d.ts.map +1 -0
  360. package/packages/mcp-servers/dist/programmatic-feedback/server.js +465 -0
  361. package/packages/mcp-servers/dist/programmatic-feedback/server.js.map +1 -0
  362. package/packages/mcp-servers/dist/programmatic-feedback/types.d.ts +127 -0
  363. package/packages/mcp-servers/dist/programmatic-feedback/types.d.ts.map +1 -0
  364. package/packages/mcp-servers/dist/programmatic-feedback/types.js +80 -0
  365. package/packages/mcp-servers/dist/programmatic-feedback/types.js.map +1 -0
  366. package/packages/mcp-servers/dist/render/index.d.ts +8 -0
  367. package/packages/mcp-servers/dist/render/index.d.ts.map +1 -0
  368. package/packages/mcp-servers/dist/render/index.js +8 -0
  369. package/packages/mcp-servers/dist/render/index.js.map +1 -0
  370. package/packages/mcp-servers/dist/render/server.d.ts +15 -0
  371. package/packages/mcp-servers/dist/render/server.d.ts.map +1 -0
  372. package/packages/mcp-servers/dist/render/server.js +428 -0
  373. package/packages/mcp-servers/dist/render/server.js.map +1 -0
  374. package/packages/mcp-servers/dist/render/types.d.ts +273 -0
  375. package/packages/mcp-servers/dist/render/types.d.ts.map +1 -0
  376. package/packages/mcp-servers/dist/render/types.js +102 -0
  377. package/packages/mcp-servers/dist/render/types.js.map +1 -0
  378. package/packages/mcp-servers/dist/resend/index.d.ts +7 -0
  379. package/packages/mcp-servers/dist/resend/index.d.ts.map +1 -0
  380. package/packages/mcp-servers/dist/resend/index.js +7 -0
  381. package/packages/mcp-servers/dist/resend/index.js.map +1 -0
  382. package/packages/mcp-servers/dist/resend/server.d.ts +15 -0
  383. package/packages/mcp-servers/dist/resend/server.d.ts.map +1 -0
  384. package/packages/mcp-servers/dist/resend/server.js +298 -0
  385. package/packages/mcp-servers/dist/resend/server.js.map +1 -0
  386. package/packages/mcp-servers/dist/resend/types.d.ts +222 -0
  387. package/packages/mcp-servers/dist/resend/types.d.ts.map +1 -0
  388. package/packages/mcp-servers/dist/resend/types.js +58 -0
  389. package/packages/mcp-servers/dist/resend/types.js.map +1 -0
  390. package/packages/mcp-servers/dist/review-queue/index.d.ts +6 -0
  391. package/packages/mcp-servers/dist/review-queue/index.d.ts.map +1 -0
  392. package/packages/mcp-servers/dist/review-queue/index.js +6 -0
  393. package/packages/mcp-servers/dist/review-queue/index.js.map +1 -0
  394. package/packages/mcp-servers/dist/review-queue/server.d.ts +17 -0
  395. package/packages/mcp-servers/dist/review-queue/server.d.ts.map +1 -0
  396. package/packages/mcp-servers/dist/review-queue/server.js +348 -0
  397. package/packages/mcp-servers/dist/review-queue/server.js.map +1 -0
  398. package/packages/mcp-servers/dist/review-queue/types.d.ts +162 -0
  399. package/packages/mcp-servers/dist/review-queue/types.d.ts.map +1 -0
  400. package/packages/mcp-servers/dist/review-queue/types.js +56 -0
  401. package/packages/mcp-servers/dist/review-queue/types.js.map +1 -0
  402. package/packages/mcp-servers/dist/secret-sync/server.d.ts +19 -0
  403. package/packages/mcp-servers/dist/secret-sync/server.d.ts.map +1 -0
  404. package/packages/mcp-servers/dist/secret-sync/server.js +1139 -0
  405. package/packages/mcp-servers/dist/secret-sync/server.js.map +1 -0
  406. package/packages/mcp-servers/dist/secret-sync/types.d.ts +442 -0
  407. package/packages/mcp-servers/dist/secret-sync/types.d.ts.map +1 -0
  408. package/packages/mcp-servers/dist/secret-sync/types.js +113 -0
  409. package/packages/mcp-servers/dist/secret-sync/types.js.map +1 -0
  410. package/packages/mcp-servers/dist/session-events/index.d.ts +5 -0
  411. package/packages/mcp-servers/dist/session-events/index.d.ts.map +1 -0
  412. package/packages/mcp-servers/dist/session-events/index.js +5 -0
  413. package/packages/mcp-servers/dist/session-events/index.js.map +1 -0
  414. package/packages/mcp-servers/dist/session-events/server.d.ts +11 -0
  415. package/packages/mcp-servers/dist/session-events/server.d.ts.map +1 -0
  416. package/packages/mcp-servers/dist/session-events/server.js +290 -0
  417. package/packages/mcp-servers/dist/session-events/server.js.map +1 -0
  418. package/packages/mcp-servers/dist/session-events/types.d.ts +213 -0
  419. package/packages/mcp-servers/dist/session-events/types.d.ts.map +1 -0
  420. package/packages/mcp-servers/dist/session-events/types.js +69 -0
  421. package/packages/mcp-servers/dist/session-events/types.js.map +1 -0
  422. package/packages/mcp-servers/dist/session-restart/index.d.ts +9 -0
  423. package/packages/mcp-servers/dist/session-restart/index.d.ts.map +1 -0
  424. package/packages/mcp-servers/dist/session-restart/index.js +9 -0
  425. package/packages/mcp-servers/dist/session-restart/index.js.map +1 -0
  426. package/packages/mcp-servers/dist/session-restart/server.d.ts +20 -0
  427. package/packages/mcp-servers/dist/session-restart/server.d.ts.map +1 -0
  428. package/packages/mcp-servers/dist/session-restart/server.js +411 -0
  429. package/packages/mcp-servers/dist/session-restart/server.js.map +1 -0
  430. package/packages/mcp-servers/dist/session-restart/types.d.ts +26 -0
  431. package/packages/mcp-servers/dist/session-restart/types.d.ts.map +1 -0
  432. package/packages/mcp-servers/dist/session-restart/types.js +16 -0
  433. package/packages/mcp-servers/dist/session-restart/types.js.map +1 -0
  434. package/packages/mcp-servers/dist/setup-helper/index.d.ts +5 -0
  435. package/packages/mcp-servers/dist/setup-helper/index.d.ts.map +1 -0
  436. package/packages/mcp-servers/dist/setup-helper/index.js +5 -0
  437. package/packages/mcp-servers/dist/setup-helper/index.js.map +1 -0
  438. package/packages/mcp-servers/dist/setup-helper/server.d.ts +14 -0
  439. package/packages/mcp-servers/dist/setup-helper/server.d.ts.map +1 -0
  440. package/packages/mcp-servers/dist/setup-helper/server.js +454 -0
  441. package/packages/mcp-servers/dist/setup-helper/server.js.map +1 -0
  442. package/packages/mcp-servers/dist/setup-helper/types.d.ts +81 -0
  443. package/packages/mcp-servers/dist/setup-helper/types.d.ts.map +1 -0
  444. package/packages/mcp-servers/dist/setup-helper/types.js +41 -0
  445. package/packages/mcp-servers/dist/setup-helper/types.js.map +1 -0
  446. package/packages/mcp-servers/dist/shared/audited-server.d.ts +31 -0
  447. package/packages/mcp-servers/dist/shared/audited-server.d.ts.map +1 -0
  448. package/packages/mcp-servers/dist/shared/audited-server.js +126 -0
  449. package/packages/mcp-servers/dist/shared/audited-server.js.map +1 -0
  450. package/packages/mcp-servers/dist/shared/constants.d.ts +26 -0
  451. package/packages/mcp-servers/dist/shared/constants.d.ts.map +1 -0
  452. package/packages/mcp-servers/dist/shared/constants.js +41 -0
  453. package/packages/mcp-servers/dist/shared/constants.js.map +1 -0
  454. package/packages/mcp-servers/dist/shared/index.d.ts +6 -0
  455. package/packages/mcp-servers/dist/shared/index.d.ts.map +1 -0
  456. package/packages/mcp-servers/dist/shared/index.js +6 -0
  457. package/packages/mcp-servers/dist/shared/index.js.map +1 -0
  458. package/packages/mcp-servers/dist/shared/readonly-db.d.ts +11 -0
  459. package/packages/mcp-servers/dist/shared/readonly-db.d.ts.map +1 -0
  460. package/packages/mcp-servers/dist/shared/readonly-db.js +47 -0
  461. package/packages/mcp-servers/dist/shared/readonly-db.js.map +1 -0
  462. package/packages/mcp-servers/dist/shared/resolve-framework.d.ts +20 -0
  463. package/packages/mcp-servers/dist/shared/resolve-framework.d.ts.map +1 -0
  464. package/packages/mcp-servers/dist/shared/resolve-framework.js +65 -0
  465. package/packages/mcp-servers/dist/shared/resolve-framework.js.map +1 -0
  466. package/packages/mcp-servers/dist/shared/server.d.ts +86 -0
  467. package/packages/mcp-servers/dist/shared/server.d.ts.map +1 -0
  468. package/packages/mcp-servers/dist/shared/server.js +291 -0
  469. package/packages/mcp-servers/dist/shared/server.js.map +1 -0
  470. package/packages/mcp-servers/dist/shared/types.d.ts +113 -0
  471. package/packages/mcp-servers/dist/shared/types.d.ts.map +1 -0
  472. package/packages/mcp-servers/dist/shared/types.js +36 -0
  473. package/packages/mcp-servers/dist/shared/types.js.map +1 -0
  474. package/packages/mcp-servers/dist/show/server.d.ts +12 -0
  475. package/packages/mcp-servers/dist/show/server.d.ts.map +1 -0
  476. package/packages/mcp-servers/dist/show/server.js +97 -0
  477. package/packages/mcp-servers/dist/show/server.js.map +1 -0
  478. package/packages/mcp-servers/dist/show/types.d.ts +19 -0
  479. package/packages/mcp-servers/dist/show/types.d.ts.map +1 -0
  480. package/packages/mcp-servers/dist/show/types.js +32 -0
  481. package/packages/mcp-servers/dist/show/types.js.map +1 -0
  482. package/packages/mcp-servers/dist/specs-browser/index.d.ts +5 -0
  483. package/packages/mcp-servers/dist/specs-browser/index.d.ts.map +1 -0
  484. package/packages/mcp-servers/dist/specs-browser/index.js +5 -0
  485. package/packages/mcp-servers/dist/specs-browser/index.js.map +1 -0
  486. package/packages/mcp-servers/dist/specs-browser/server.d.ts +13 -0
  487. package/packages/mcp-servers/dist/specs-browser/server.d.ts.map +1 -0
  488. package/packages/mcp-servers/dist/specs-browser/server.js +692 -0
  489. package/packages/mcp-servers/dist/specs-browser/server.js.map +1 -0
  490. package/packages/mcp-servers/dist/specs-browser/types.d.ts +337 -0
  491. package/packages/mcp-servers/dist/specs-browser/types.d.ts.map +1 -0
  492. package/packages/mcp-servers/dist/specs-browser/types.js +134 -0
  493. package/packages/mcp-servers/dist/specs-browser/types.js.map +1 -0
  494. package/packages/mcp-servers/dist/supabase/index.d.ts +10 -0
  495. package/packages/mcp-servers/dist/supabase/index.d.ts.map +1 -0
  496. package/packages/mcp-servers/dist/supabase/index.js +10 -0
  497. package/packages/mcp-servers/dist/supabase/index.js.map +1 -0
  498. package/packages/mcp-servers/dist/supabase/server.d.ts +20 -0
  499. package/packages/mcp-servers/dist/supabase/server.d.ts.map +1 -0
  500. package/packages/mcp-servers/dist/supabase/server.js +451 -0
  501. package/packages/mcp-servers/dist/supabase/server.js.map +1 -0
  502. package/packages/mcp-servers/dist/supabase/types.d.ts +196 -0
  503. package/packages/mcp-servers/dist/supabase/types.d.ts.map +1 -0
  504. package/packages/mcp-servers/dist/supabase/types.js +76 -0
  505. package/packages/mcp-servers/dist/supabase/types.js.map +1 -0
  506. package/packages/mcp-servers/dist/todo-db/index.d.ts +5 -0
  507. package/packages/mcp-servers/dist/todo-db/index.d.ts.map +1 -0
  508. package/packages/mcp-servers/dist/todo-db/index.js +5 -0
  509. package/packages/mcp-servers/dist/todo-db/index.js.map +1 -0
  510. package/packages/mcp-servers/dist/todo-db/server.d.ts +13 -0
  511. package/packages/mcp-servers/dist/todo-db/server.d.ts.map +1 -0
  512. package/packages/mcp-servers/dist/todo-db/server.js +649 -0
  513. package/packages/mcp-servers/dist/todo-db/server.js.map +1 -0
  514. package/packages/mcp-servers/dist/todo-db/types.d.ts +225 -0
  515. package/packages/mcp-servers/dist/todo-db/types.d.ts.map +1 -0
  516. package/packages/mcp-servers/dist/todo-db/types.js +69 -0
  517. package/packages/mcp-servers/dist/todo-db/types.js.map +1 -0
  518. package/packages/mcp-servers/dist/user-feedback/index.d.ts +7 -0
  519. package/packages/mcp-servers/dist/user-feedback/index.d.ts.map +1 -0
  520. package/packages/mcp-servers/dist/user-feedback/index.js +8 -0
  521. package/packages/mcp-servers/dist/user-feedback/index.js.map +1 -0
  522. package/packages/mcp-servers/dist/user-feedback/server.d.ts +25 -0
  523. package/packages/mcp-servers/dist/user-feedback/server.d.ts.map +1 -0
  524. package/packages/mcp-servers/dist/user-feedback/server.js +914 -0
  525. package/packages/mcp-servers/dist/user-feedback/server.js.map +1 -0
  526. package/packages/mcp-servers/dist/user-feedback/types.d.ts +415 -0
  527. package/packages/mcp-servers/dist/user-feedback/types.d.ts.map +1 -0
  528. package/packages/mcp-servers/dist/user-feedback/types.js +132 -0
  529. package/packages/mcp-servers/dist/user-feedback/types.js.map +1 -0
  530. package/packages/mcp-servers/dist/vercel/index.d.ts +9 -0
  531. package/packages/mcp-servers/dist/vercel/index.d.ts.map +1 -0
  532. package/packages/mcp-servers/dist/vercel/index.js +9 -0
  533. package/packages/mcp-servers/dist/vercel/index.js.map +1 -0
  534. package/packages/mcp-servers/dist/vercel/server.d.ts +17 -0
  535. package/packages/mcp-servers/dist/vercel/server.d.ts.map +1 -0
  536. package/packages/mcp-servers/dist/vercel/server.js +265 -0
  537. package/packages/mcp-servers/dist/vercel/server.js.map +1 -0
  538. package/packages/mcp-servers/dist/vercel/types.d.ts +189 -0
  539. package/packages/mcp-servers/dist/vercel/types.d.ts.map +1 -0
  540. package/packages/mcp-servers/dist/vercel/types.js +65 -0
  541. package/packages/mcp-servers/dist/vercel/types.js.map +1 -0
  542. package/packages/mcp-servers/package-lock.json +3765 -0
  543. package/packages/mcp-servers/package.json +64 -0
  544. package/packages/mcp-servers/test/reporters/test-failure-reporter.ts +372 -0
  545. package/packages/mcp-servers/vitest.config.ts +27 -0
  546. package/scripts/__tests__/README.md +163 -0
  547. package/scripts/apply-credential-hardening.sh +271 -0
  548. package/scripts/credential-providers/manual.js +56 -0
  549. package/scripts/credential-providers/onepassword.js +85 -0
  550. package/scripts/credential-providers/provider-interface.js +104 -0
  551. package/scripts/encrypt-credential.js +337 -0
  552. package/scripts/feedback-launcher.js +338 -0
  553. package/scripts/feedback-orchestrator.js +373 -0
  554. package/scripts/fix-mcp-launcher-issues.sh +97 -0
  555. package/scripts/force-spawn-tasks.js +651 -0
  556. package/scripts/force-triage-reports.js +560 -0
  557. package/scripts/generate-protected-actions-spec.js +142 -0
  558. package/scripts/generate-proxy-certs.sh +158 -0
  559. package/scripts/grant-chrome-ext-permissions.sh +242 -0
  560. package/scripts/mcp-launcher.js +125 -0
  561. package/scripts/merge-settings.cjs +167 -0
  562. package/scripts/patch-clawd.py +844 -0
  563. package/scripts/patch-credential-cache.py +313 -0
  564. package/scripts/patches/credential-file-guard-patched.mjs +573 -0
  565. package/scripts/patches/credential-file-guard.js.patched +573 -0
  566. package/scripts/patches/verify-tokenizer.mjs +132 -0
  567. package/scripts/protect-framework.sh +478 -0
  568. package/scripts/readme-chrome.template +12 -0
  569. package/scripts/reap-completed-agents.js +439 -0
  570. package/scripts/reinstall.sh +86 -0
  571. package/scripts/resign-node.sh +185 -0
  572. package/scripts/rotation-proxy.js +656 -0
  573. package/scripts/rotation-stress-monitor.mjs +862 -0
  574. package/scripts/setup-automation-service.sh +648 -0
  575. package/scripts/setup-check.js +251 -0
  576. package/scripts/watch-claude-version.js +142 -0
  577. package/specs/framework/CORE-INVARIANTS.md +161 -0
  578. package/specs/patterns/AGENT-PATTERNS.md +223 -0
  579. package/specs/patterns/HOOK-PATTERNS.md +242 -0
  580. package/specs/patterns/MCP-SERVER-PATTERNS.md +144 -0
  581. package/templates/config/gitignore.template +14 -0
  582. package/templates/config/merge-chain-check.yml.template +51 -0
  583. package/templates/config/package.json.template +18 -0
  584. package/templates/config/pnpm-workspace.yaml +5 -0
  585. package/templates/config/services.json.template +18 -0
  586. package/templates/config/tsconfig.base.json +17 -0
  587. package/templates/scaffold/integrations/_template/.gitkeep +0 -0
  588. package/templates/scaffold/packages/logger/package.json +17 -0
  589. package/templates/scaffold/packages/logger/src/logger.ts +44 -0
  590. package/templates/scaffold/packages/shared/package.json +17 -0
  591. package/templates/scaffold/packages/shared/src/errors.ts +43 -0
  592. package/templates/scaffold/products/_product/apps/backend/package.json +21 -0
  593. package/templates/scaffold/products/_product/apps/backend/src/index.ts +17 -0
  594. package/templates/scaffold/products/_product/apps/extension/.gitkeep +0 -0
  595. package/templates/scaffold/products/_product/apps/web/.gitkeep +0 -0
  596. package/templates/scaffold/specs/global/.gitkeep +0 -0
  597. package/templates/scaffold/specs/local/.gitkeep +0 -0
  598. package/templates/scaffold/specs/reference/.gitkeep +0 -0
  599. package/version.json +15 -0
@@ -0,0 +1,690 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Product Manager MCP Server
4
+ *
5
+ * Manages product-market-fit analysis with:
6
+ * - 6 sequential sections (market space, buyer personas, competitor
7
+ * differentiation, pricing models, niche strengths, user sentiment)
8
+ * - CTO approval gate
9
+ * - Pain-point-to-persona mapping and compliance reporting
10
+ * - Auto-generated markdown summary
11
+ *
12
+ * Protocol: JSON-RPC 2.0 over stdin/stdout (stdio MCP)
13
+ *
14
+ * @version 1.0.0
15
+ */
16
+ import * as fs from 'fs';
17
+ import * as path from 'path';
18
+ import { randomUUID } from 'crypto';
19
+ import Database from 'better-sqlite3';
20
+ import { McpServer } from '../shared/server.js';
21
+ import { LIST_SECTIONS, GetAnalysisStatusArgsSchema, InitiateAnalysisArgsSchema, ApproveAnalysisArgsSchema, ReadSectionArgsSchema, WriteSectionArgsSchema, AddEntryArgsSchema, UpdateEntryArgsSchema, DeleteEntryArgsSchema, ListPainPointsArgsSchema, MapPainPointPersonaArgsSchema, GetComplianceReportArgsSchema, ClearAndRespawnArgsSchema, RegenerateMdArgsSchema, } from './types.js';
22
+ // ============================================================================
23
+ // Configuration
24
+ // ============================================================================
25
+ const PROJECT_DIR = path.resolve(process.env.CLAUDE_PROJECT_DIR || process.cwd());
26
+ const DB_PATH = path.join(PROJECT_DIR, '.claude', 'state', 'product-manager.db');
27
+ const TODO_DB_PATH = path.join(PROJECT_DIR, '.claude', 'todo.db');
28
+ const USER_FEEDBACK_DB_PATH = path.join(PROJECT_DIR, '.claude', 'user-feedback.db');
29
+ // ============================================================================
30
+ // Database Schema
31
+ // ============================================================================
32
+ const SCHEMA = `
33
+ CREATE TABLE IF NOT EXISTS analysis_meta (
34
+ id TEXT PRIMARY KEY,
35
+ status TEXT NOT NULL DEFAULT 'not_started',
36
+ initiated_at TEXT,
37
+ initiated_by TEXT,
38
+ approved_at TEXT,
39
+ approved_by TEXT,
40
+ last_updated_at TEXT,
41
+ md_path TEXT NOT NULL DEFAULT '.claude/product-market-fit.md',
42
+ CONSTRAINT valid_status CHECK (status IN (
43
+ 'not_started','pending_approval','approved','in_progress','completed'
44
+ ))
45
+ );
46
+
47
+ CREATE TABLE IF NOT EXISTS sections (
48
+ id TEXT PRIMARY KEY,
49
+ section_number INTEGER NOT NULL UNIQUE,
50
+ section_key TEXT NOT NULL UNIQUE,
51
+ title TEXT NOT NULL,
52
+ content TEXT,
53
+ populated_at TEXT,
54
+ populated_by TEXT,
55
+ updated_at TEXT,
56
+ CONSTRAINT valid_section CHECK (section_number BETWEEN 1 AND 6)
57
+ );
58
+
59
+ CREATE TABLE IF NOT EXISTS section_entries (
60
+ id TEXT PRIMARY KEY,
61
+ section_number INTEGER NOT NULL,
62
+ title TEXT NOT NULL,
63
+ content TEXT NOT NULL,
64
+ metadata TEXT DEFAULT '{}',
65
+ created_at TEXT NOT NULL,
66
+ created_timestamp INTEGER NOT NULL,
67
+ updated_at TEXT NOT NULL,
68
+ CONSTRAINT valid_entry_section CHECK (section_number IN (2, 6))
69
+ );
70
+
71
+ CREATE INDEX IF NOT EXISTS idx_entries_section ON section_entries(section_number);
72
+
73
+ CREATE TABLE IF NOT EXISTS pain_point_personas (
74
+ pain_point_id TEXT NOT NULL,
75
+ persona_id TEXT NOT NULL,
76
+ created_at TEXT NOT NULL,
77
+ created_by TEXT NOT NULL,
78
+ PRIMARY KEY (pain_point_id, persona_id)
79
+ );
80
+
81
+ CREATE INDEX IF NOT EXISTS idx_ppp_pain_point ON pain_point_personas(pain_point_id);
82
+ `;
83
+ // ============================================================================
84
+ // Section seed data
85
+ // ============================================================================
86
+ const SECTION_SEEDS = [
87
+ { number: 1, key: 'market_space', title: 'Market Space & Players' },
88
+ { number: 2, key: 'buyer_personas', title: 'Buyer Personas' },
89
+ { number: 3, key: 'competitor_differentiation', title: 'Competitor Differentiation' },
90
+ { number: 4, key: 'pricing_models', title: 'Pricing Models' },
91
+ { number: 5, key: 'niche_strengths', title: 'Niche Strengths & Weaknesses' },
92
+ { number: 6, key: 'user_sentiment', title: 'User Sentiment' },
93
+ ];
94
+ // ============================================================================
95
+ // Database Management
96
+ // ============================================================================
97
+ let _db = null;
98
+ function initializeDatabase() {
99
+ const dbDir = path.dirname(DB_PATH);
100
+ if (!fs.existsSync(dbDir)) {
101
+ fs.mkdirSync(dbDir, { recursive: true });
102
+ }
103
+ const db = new Database(DB_PATH);
104
+ db.pragma('journal_mode = WAL');
105
+ db.pragma('foreign_keys = ON');
106
+ db.exec(SCHEMA);
107
+ // Seed sections if empty
108
+ const sectionCount = db.prepare('SELECT COUNT(*) as c FROM sections').get().c;
109
+ if (sectionCount === 0) {
110
+ const insertSection = db.prepare('INSERT INTO sections (id, section_number, section_key, title) VALUES (?, ?, ?, ?)');
111
+ for (const seed of SECTION_SEEDS) {
112
+ insertSection.run(randomUUID(), seed.number, seed.key, seed.title);
113
+ }
114
+ }
115
+ // Seed analysis_meta if empty
116
+ const metaCount = db.prepare('SELECT COUNT(*) as c FROM analysis_meta').get().c;
117
+ if (metaCount === 0) {
118
+ db.prepare('INSERT INTO analysis_meta (id, status, md_path) VALUES (?, ?, ?)').run('default', 'not_started', '.claude/product-market-fit.md');
119
+ }
120
+ return db;
121
+ }
122
+ function getDb() {
123
+ if (!_db) {
124
+ _db = initializeDatabase();
125
+ }
126
+ return _db;
127
+ }
128
+ function closeDb() {
129
+ if (_db) {
130
+ _db.close();
131
+ _db = null;
132
+ }
133
+ }
134
+ // ============================================================================
135
+ // Helper Functions
136
+ // ============================================================================
137
+ function isListSection(sectionNumber) {
138
+ return LIST_SECTIONS.includes(sectionNumber);
139
+ }
140
+ function isSectionPopulated(db, sectionNumber) {
141
+ if (isListSection(sectionNumber)) {
142
+ const count = db.prepare('SELECT COUNT(*) as c FROM section_entries WHERE section_number = ?').get(sectionNumber).c;
143
+ return count > 0;
144
+ }
145
+ const sec = db.prepare('SELECT content FROM sections WHERE section_number = ?').get(sectionNumber);
146
+ return !!sec?.content;
147
+ }
148
+ function assertPreviousSectionsPopulated(db, targetNumber) {
149
+ for (let n = 1; n < targetNumber; n++) {
150
+ if (!isSectionPopulated(db, n)) {
151
+ return `Section ${n} must be populated first`;
152
+ }
153
+ }
154
+ return null;
155
+ }
156
+ function updateLastUpdated(db) {
157
+ db.prepare("UPDATE analysis_meta SET last_updated_at = ? WHERE id = 'default'").run(new Date().toISOString());
158
+ }
159
+ function getPopulatedCount(db) {
160
+ let count = 0;
161
+ for (let n = 1; n <= 6; n++) {
162
+ if (isSectionPopulated(db, n))
163
+ count++;
164
+ }
165
+ return count;
166
+ }
167
+ function getComplianceStats(db) {
168
+ const total = db.prepare("SELECT COUNT(*) as c FROM section_entries WHERE section_number = 6").get().c;
169
+ if (total === 0)
170
+ return null;
171
+ const mapped = db.prepare("SELECT COUNT(DISTINCT pain_point_id) as c FROM pain_point_personas").get().c;
172
+ return {
173
+ total_pain_points: total,
174
+ mapped,
175
+ unmapped: total - mapped,
176
+ pct: Math.round((mapped / total) * 100),
177
+ };
178
+ }
179
+ // ============================================================================
180
+ // Markdown Generation
181
+ // ============================================================================
182
+ function regenerateMarkdown(db) {
183
+ const meta = db.prepare("SELECT * FROM analysis_meta WHERE id = 'default'").get();
184
+ const mdPath = path.join(PROJECT_DIR, meta.md_path);
185
+ const sections = db.prepare('SELECT * FROM sections ORDER BY section_number').all();
186
+ const now = new Date();
187
+ const timestamp = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, '0')}-${String(now.getDate()).padStart(2, '0')} ${String(now.getHours()).padStart(2, '0')}:${String(now.getMinutes()).padStart(2, '0')}`;
188
+ let md = `# Product-Market-Fit Analysis\n\n*Last updated: ${timestamp}*\n\n`;
189
+ for (const section of sections) {
190
+ md += `## Section ${section.section_number}: ${section.title}\n\n`;
191
+ if (isListSection(section.section_number)) {
192
+ const entries = db.prepare('SELECT * FROM section_entries WHERE section_number = ? ORDER BY created_timestamp ASC').all(section.section_number);
193
+ if (entries.length === 0) {
194
+ md += '*Not yet populated*\n\n';
195
+ }
196
+ else {
197
+ for (const entry of entries) {
198
+ md += `### ${entry.title}\n\n${entry.content}\n\n`;
199
+ }
200
+ }
201
+ }
202
+ else {
203
+ if (section.content) {
204
+ md += `${section.content}\n\n`;
205
+ }
206
+ else {
207
+ md += '*Not yet populated*\n\n';
208
+ }
209
+ }
210
+ }
211
+ // Write markdown file
212
+ const mdDir = path.dirname(mdPath);
213
+ if (!fs.existsSync(mdDir)) {
214
+ fs.mkdirSync(mdDir, { recursive: true });
215
+ }
216
+ fs.writeFileSync(mdPath, md, 'utf8');
217
+ return mdPath;
218
+ }
219
+ // ============================================================================
220
+ // Tool Implementations
221
+ // ============================================================================
222
+ function getAnalysisStatus(_args) {
223
+ const db = getDb();
224
+ const meta = db.prepare("SELECT * FROM analysis_meta WHERE id = 'default'").get();
225
+ if (!meta) {
226
+ return { error: 'Analysis metadata not found' };
227
+ }
228
+ const sections = db.prepare('SELECT * FROM sections ORDER BY section_number').all();
229
+ const sectionResults = sections.map(s => {
230
+ const populated = isSectionPopulated(db, s.section_number);
231
+ const result = {
232
+ number: s.section_number,
233
+ key: s.section_key,
234
+ title: s.title,
235
+ populated,
236
+ };
237
+ if (isListSection(s.section_number)) {
238
+ result.entry_count = db.prepare('SELECT COUNT(*) as c FROM section_entries WHERE section_number = ?').get(s.section_number).c;
239
+ }
240
+ return result;
241
+ });
242
+ return {
243
+ status: meta.status,
244
+ initiated_at: meta.initiated_at,
245
+ initiated_by: meta.initiated_by,
246
+ approved_at: meta.approved_at,
247
+ approved_by: meta.approved_by,
248
+ last_updated_at: meta.last_updated_at,
249
+ sections_populated: getPopulatedCount(db),
250
+ total_sections: 6,
251
+ sections: sectionResults,
252
+ compliance: getComplianceStats(db),
253
+ };
254
+ }
255
+ function initiateAnalysis(args) {
256
+ const db = getDb();
257
+ const meta = db.prepare("SELECT * FROM analysis_meta WHERE id = 'default'").get();
258
+ if (meta.status !== 'not_started') {
259
+ return { error: `Analysis already initiated (status: ${meta.status}). Use clear_and_respawn to restart.` };
260
+ }
261
+ const now = new Date().toISOString();
262
+ db.prepare("UPDATE analysis_meta SET status = 'pending_approval', initiated_at = ?, initiated_by = ?, last_updated_at = ? WHERE id = 'default'").run(now, args.initiated_by, now);
263
+ return {
264
+ status: 'pending_approval',
265
+ initiated_at: now,
266
+ initiated_by: args.initiated_by,
267
+ };
268
+ }
269
+ function approveAnalysis(args) {
270
+ const db = getDb();
271
+ const meta = db.prepare("SELECT * FROM analysis_meta WHERE id = 'default'").get();
272
+ if (meta.status !== 'pending_approval') {
273
+ return { error: `Cannot approve: current status is '${meta.status}', expected 'pending_approval'` };
274
+ }
275
+ const now = new Date().toISOString();
276
+ db.prepare("UPDATE analysis_meta SET status = 'approved', approved_at = ?, approved_by = ?, last_updated_at = ? WHERE id = 'default'").run(now, args.approved_by, now);
277
+ return {
278
+ status: 'approved',
279
+ approved_at: now,
280
+ approved_by: args.approved_by,
281
+ };
282
+ }
283
+ function readSection(args) {
284
+ const db = getDb();
285
+ const sectionNumber = args.section;
286
+ if (sectionNumber < 1 || sectionNumber > 6) {
287
+ return { error: `Invalid section number: ${sectionNumber}. Must be 1-6.` };
288
+ }
289
+ // Build context cascade: all sections 1..N-1
290
+ const previousContext = [];
291
+ for (let n = 1; n < sectionNumber; n++) {
292
+ const sec = db.prepare('SELECT * FROM sections WHERE section_number = ?').get(n);
293
+ const ctx = {
294
+ number: sec.section_number,
295
+ title: sec.title,
296
+ content: sec.content,
297
+ };
298
+ if (isListSection(n)) {
299
+ ctx.entries = db.prepare('SELECT title, content FROM section_entries WHERE section_number = ? ORDER BY created_timestamp ASC').all(n);
300
+ }
301
+ previousContext.push(ctx);
302
+ }
303
+ // Requested section
304
+ const sec = db.prepare('SELECT * FROM sections WHERE section_number = ?').get(sectionNumber);
305
+ const requested = {
306
+ number: sec.section_number,
307
+ key: sec.section_key,
308
+ title: sec.title,
309
+ content: sec.content,
310
+ };
311
+ if (isListSection(sectionNumber)) {
312
+ requested.entries = db.prepare('SELECT id, title, content, metadata FROM section_entries WHERE section_number = ? ORDER BY created_timestamp ASC').all(sectionNumber);
313
+ }
314
+ return {
315
+ previous_context: previousContext,
316
+ requested_section: requested,
317
+ };
318
+ }
319
+ function writeSection(args) {
320
+ const db = getDb();
321
+ const sectionNumber = args.section;
322
+ if (isListSection(sectionNumber)) {
323
+ return { error: `Section ${sectionNumber} is a list section. Use add_entry instead.` };
324
+ }
325
+ // Check meta status
326
+ const meta = db.prepare("SELECT status FROM analysis_meta WHERE id = 'default'").get();
327
+ if (meta.status !== 'approved' && meta.status !== 'in_progress') {
328
+ return { error: `Analysis must be approved or in-progress to write sections. Current status: ${meta.status}` };
329
+ }
330
+ // Sequential lock
331
+ const lockError = assertPreviousSectionsPopulated(db, sectionNumber);
332
+ if (lockError) {
333
+ return { error: lockError };
334
+ }
335
+ const now = new Date().toISOString();
336
+ db.prepare('UPDATE sections SET content = ?, populated_at = ?, populated_by = ?, updated_at = ? WHERE section_number = ?').run(args.content, now, args.populated_by ?? null, now, sectionNumber);
337
+ // Update meta status to in_progress if it was approved
338
+ if (meta.status === 'approved') {
339
+ db.prepare("UPDATE analysis_meta SET status = 'in_progress', last_updated_at = ? WHERE id = 'default'").run(now);
340
+ }
341
+ else {
342
+ updateLastUpdated(db);
343
+ }
344
+ // Check if all sections populated -> mark completed
345
+ if (getPopulatedCount(db) === 6) {
346
+ db.prepare("UPDATE analysis_meta SET status = 'completed', last_updated_at = ? WHERE id = 'default'").run(now);
347
+ }
348
+ regenerateMarkdown(db);
349
+ const sec = db.prepare('SELECT title FROM sections WHERE section_number = ?').get(sectionNumber);
350
+ return {
351
+ section_number: sectionNumber,
352
+ title: sec.title,
353
+ populated_at: now,
354
+ };
355
+ }
356
+ function addEntry(args) {
357
+ const db = getDb();
358
+ const sectionNumber = args.section;
359
+ if (!isListSection(sectionNumber)) {
360
+ return { error: `Section ${sectionNumber} is not a list section. Use write_section instead.` };
361
+ }
362
+ // Check meta status
363
+ const meta = db.prepare("SELECT status FROM analysis_meta WHERE id = 'default'").get();
364
+ if (meta.status !== 'approved' && meta.status !== 'in_progress') {
365
+ return { error: `Analysis must be approved or in-progress to add entries. Current status: ${meta.status}` };
366
+ }
367
+ // Sequential lock
368
+ const lockError = assertPreviousSectionsPopulated(db, sectionNumber);
369
+ if (lockError) {
370
+ return { error: lockError };
371
+ }
372
+ const id = randomUUID();
373
+ const now = new Date();
374
+ const created_at = now.toISOString();
375
+ const created_timestamp = Math.floor(now.getTime() / 1000);
376
+ db.prepare('INSERT INTO section_entries (id, section_number, title, content, metadata, created_at, created_timestamp, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)').run(id, sectionNumber, args.title, args.content, args.metadata ?? '{}', created_at, created_timestamp, created_at);
377
+ // Update meta status
378
+ if (meta.status === 'approved') {
379
+ db.prepare("UPDATE analysis_meta SET status = 'in_progress', last_updated_at = ? WHERE id = 'default'").run(created_at);
380
+ }
381
+ else {
382
+ updateLastUpdated(db);
383
+ }
384
+ // Check completion
385
+ if (getPopulatedCount(db) === 6) {
386
+ db.prepare("UPDATE analysis_meta SET status = 'completed', last_updated_at = ? WHERE id = 'default'").run(created_at);
387
+ }
388
+ regenerateMarkdown(db);
389
+ return {
390
+ id,
391
+ section_number: sectionNumber,
392
+ title: args.title,
393
+ created_at,
394
+ };
395
+ }
396
+ function updateEntry(args) {
397
+ const db = getDb();
398
+ const entry = db.prepare('SELECT * FROM section_entries WHERE id = ?').get(args.id);
399
+ if (!entry) {
400
+ return { error: `Entry not found: ${args.id}` };
401
+ }
402
+ const now = new Date().toISOString();
403
+ const title = args.title ?? entry.title;
404
+ const content = args.content ?? entry.content;
405
+ const metadata = args.metadata ?? entry.metadata;
406
+ db.prepare('UPDATE section_entries SET title = ?, content = ?, metadata = ?, updated_at = ? WHERE id = ?').run(title, content, metadata, now, args.id);
407
+ updateLastUpdated(db);
408
+ regenerateMarkdown(db);
409
+ return {
410
+ id: args.id,
411
+ updated_at: now,
412
+ };
413
+ }
414
+ function deleteEntry(args) {
415
+ const db = getDb();
416
+ const entry = db.prepare('SELECT * FROM section_entries WHERE id = ?').get(args.id);
417
+ if (!entry) {
418
+ return { error: `Entry not found: ${args.id}` };
419
+ }
420
+ // Also clean up any pain_point_persona mappings for this entry
421
+ db.prepare('DELETE FROM pain_point_personas WHERE pain_point_id = ?').run(args.id);
422
+ db.prepare('DELETE FROM section_entries WHERE id = ?').run(args.id);
423
+ updateLastUpdated(db);
424
+ regenerateMarkdown(db);
425
+ return {
426
+ deleted: true,
427
+ id: args.id,
428
+ };
429
+ }
430
+ function listPainPoints(args) {
431
+ const db = getDb();
432
+ const entries = db.prepare('SELECT * FROM section_entries WHERE section_number = 6 ORDER BY created_timestamp ASC').all();
433
+ const mappings = db.prepare('SELECT * FROM pain_point_personas').all();
434
+ // Build mapping lookup
435
+ const mappingsByPainPoint = new Map();
436
+ for (const m of mappings) {
437
+ const list = mappingsByPainPoint.get(m.pain_point_id) ?? [];
438
+ list.push(m.persona_id);
439
+ mappingsByPainPoint.set(m.pain_point_id, list);
440
+ }
441
+ let painPoints = entries.map(e => ({
442
+ id: e.id,
443
+ title: e.title,
444
+ content: e.content,
445
+ metadata: e.metadata,
446
+ created_at: e.created_at,
447
+ mapped_personas: mappingsByPainPoint.get(e.id) ?? [],
448
+ }));
449
+ const unmappedCount = painPoints.filter(p => p.mapped_personas.length === 0).length;
450
+ if (args.unmapped_only) {
451
+ painPoints = painPoints.filter(p => p.mapped_personas.length === 0);
452
+ }
453
+ return {
454
+ pain_points: painPoints,
455
+ total: entries.length,
456
+ unmapped_count: unmappedCount,
457
+ };
458
+ }
459
+ function mapPainPointPersona(args) {
460
+ const db = getDb();
461
+ // Verify pain point exists
462
+ const entry = db.prepare('SELECT id FROM section_entries WHERE id = ? AND section_number = 6').get(args.pain_point_id);
463
+ if (!entry) {
464
+ return { error: `Pain point not found: ${args.pain_point_id}` };
465
+ }
466
+ // Verify persona exists via readonly read of user-feedback.db
467
+ if (fs.existsSync(USER_FEEDBACK_DB_PATH)) {
468
+ try {
469
+ const feedbackDb = new Database(USER_FEEDBACK_DB_PATH, { readonly: true });
470
+ const persona = feedbackDb.prepare('SELECT id FROM personas WHERE id = ?').get(args.persona_id);
471
+ feedbackDb.close();
472
+ if (!persona) {
473
+ return { error: `Persona not found in user-feedback.db: ${args.persona_id}` };
474
+ }
475
+ }
476
+ catch (err) {
477
+ const message = err instanceof Error ? err.message : String(err);
478
+ return { error: `Could not verify persona in user-feedback.db: ${message}` };
479
+ }
480
+ }
481
+ // Check if mapping already exists
482
+ const existing = db.prepare('SELECT pain_point_id FROM pain_point_personas WHERE pain_point_id = ? AND persona_id = ?').get(args.pain_point_id, args.persona_id);
483
+ if (existing) {
484
+ return { error: `Mapping already exists: pain_point=${args.pain_point_id}, persona=${args.persona_id}` };
485
+ }
486
+ const now = new Date().toISOString();
487
+ db.prepare('INSERT INTO pain_point_personas (pain_point_id, persona_id, created_at, created_by) VALUES (?, ?, ?, ?)').run(args.pain_point_id, args.persona_id, now, args.created_by);
488
+ updateLastUpdated(db);
489
+ return {
490
+ pain_point_id: args.pain_point_id,
491
+ persona_id: args.persona_id,
492
+ created_at: now,
493
+ };
494
+ }
495
+ function getComplianceReport(_args) {
496
+ const db = getDb();
497
+ const entries = db.prepare('SELECT * FROM section_entries WHERE section_number = 6 ORDER BY created_timestamp ASC').all();
498
+ if (entries.length === 0) {
499
+ return {
500
+ total_pain_points: 0,
501
+ mapped: 0,
502
+ unmapped: 0,
503
+ compliance_pct: 100,
504
+ pain_points: [],
505
+ };
506
+ }
507
+ const mappings = db.prepare('SELECT * FROM pain_point_personas').all();
508
+ const mappingsByPainPoint = new Map();
509
+ for (const m of mappings) {
510
+ const list = mappingsByPainPoint.get(m.pain_point_id) ?? [];
511
+ list.push(m.persona_id);
512
+ mappingsByPainPoint.set(m.pain_point_id, list);
513
+ }
514
+ const painPoints = entries.map(e => ({
515
+ id: e.id,
516
+ title: e.title,
517
+ mapped_personas: mappingsByPainPoint.get(e.id) ?? [],
518
+ }));
519
+ const mapped = painPoints.filter(p => p.mapped_personas.length > 0).length;
520
+ const unmapped = entries.length - mapped;
521
+ return {
522
+ total_pain_points: entries.length,
523
+ mapped,
524
+ unmapped,
525
+ compliance_pct: Math.round((mapped / entries.length) * 100),
526
+ pain_points: painPoints,
527
+ };
528
+ }
529
+ function clearAndRespawn(args) {
530
+ const db = getDb();
531
+ // Clear all section content
532
+ db.prepare('UPDATE sections SET content = NULL, populated_at = NULL, populated_by = NULL, updated_at = NULL').run();
533
+ db.prepare('DELETE FROM section_entries').run();
534
+ db.prepare('DELETE FROM pain_point_personas').run();
535
+ // Update meta
536
+ const now = new Date().toISOString();
537
+ db.prepare("UPDATE analysis_meta SET status = 'in_progress', last_updated_at = ? WHERE id = 'default'").run(now);
538
+ regenerateMarkdown(db);
539
+ // Create first task in PRODUCT-MANAGER section via todo.db
540
+ let taskId = 'no-todo-db';
541
+ if (fs.existsSync(TODO_DB_PATH)) {
542
+ try {
543
+ const todoDb = new Database(TODO_DB_PATH);
544
+ todoDb.pragma('journal_mode = WAL');
545
+ taskId = randomUUID();
546
+ const created_timestamp = Math.floor(Date.now() / 1000);
547
+ const followupPrompt = `Section 1 (Market Space & Players) has been assigned to you. Research and populate it using web search and codebase analysis.
548
+
549
+ Steps:
550
+ 1. Call mcp__product-manager__read_section({section: 1}) to see the current state
551
+ 2. Research the market space via WebSearch
552
+ 3. Call mcp__product-manager__write_section({section: 1, content: "..."}) with your findings
553
+ 4. Mark this task complete
554
+
555
+ After completion, the follow-up chain will create Section 2's task.`;
556
+ const section2Prompt = `Section 2 (Buyer Personas) is ready. Populate it using add_entry for each buyer persona.
557
+
558
+ Steps:
559
+ 1. Call mcp__product-manager__read_section({section: 2}) to see context from Section 1
560
+ 2. For each buyer persona, call mcp__product-manager__add_entry({section: 2, title: "...", content: "..."})
561
+ 3. Mark this task complete
562
+
563
+ After completion, the follow-up chain will create Section 3's task.`;
564
+ // Create Section 1 task with follow-up chain
565
+ // Section 1 -> follow-up creates Section 2 -> ... -> Section 6 -> persona eval
566
+ // We only create Section 1 now; the rest chain via followup_prompt
567
+ todoDb.prepare(`
568
+ INSERT INTO tasks (id, section, status, title, description, assigned_by, created_at, created_timestamp, followup_enabled, followup_section, followup_prompt)
569
+ VALUES (?, 'PRODUCT-MANAGER', 'pending', ?, ?, ?, ?, ?, 1, 'PRODUCT-MANAGER', ?)
570
+ `).run(taskId, '[PMF] Populate Section 1: Market Space & Players', followupPrompt, args.initiated_by, now, created_timestamp, section2Prompt);
571
+ todoDb.close();
572
+ }
573
+ catch (err) {
574
+ const message = err instanceof Error ? err.message : String(err);
575
+ process.stderr.write(`[product-manager] Warning: Could not create todo task: ${message}\n`);
576
+ }
577
+ }
578
+ return {
579
+ cleared: true,
580
+ task_id: taskId,
581
+ message: 'All section data cleared. Section 1 task created in PRODUCT-MANAGER queue.',
582
+ };
583
+ }
584
+ function regenerateMd(_args) {
585
+ const db = getDb();
586
+ const mdPath = regenerateMarkdown(db);
587
+ return {
588
+ path: mdPath,
589
+ regenerated_at: new Date().toISOString(),
590
+ };
591
+ }
592
+ // ============================================================================
593
+ // Server Setup
594
+ // ============================================================================
595
+ const tools = [
596
+ {
597
+ name: 'get_analysis_status',
598
+ description: 'Get current PMF analysis status, section progress, and compliance stats.',
599
+ schema: GetAnalysisStatusArgsSchema,
600
+ handler: getAnalysisStatus,
601
+ },
602
+ {
603
+ name: 'initiate_analysis',
604
+ description: 'Initiate a new PMF analysis. Sets status to pending_approval. Agent should then report to deputy-CTO for approval.',
605
+ schema: InitiateAnalysisArgsSchema,
606
+ handler: initiateAnalysis,
607
+ },
608
+ {
609
+ name: 'approve_analysis',
610
+ description: 'Approve a pending PMF analysis. Called by deputy-CTO during triage.',
611
+ schema: ApproveAnalysisArgsSchema,
612
+ handler: approveAnalysis,
613
+ },
614
+ {
615
+ name: 'read_section',
616
+ description: 'Read a section with context cascade. Returns all prior sections (1..N-1) as context plus the requested section N.',
617
+ schema: ReadSectionArgsSchema,
618
+ handler: readSection,
619
+ },
620
+ {
621
+ name: 'write_section',
622
+ description: 'Write content to a single-content section (1, 3, 4, 5). Enforces sequential lock: all prior sections must be populated.',
623
+ schema: WriteSectionArgsSchema,
624
+ handler: writeSection,
625
+ },
626
+ {
627
+ name: 'add_entry',
628
+ description: 'Add an entry to a list section (2 or 6). Enforces sequential lock.',
629
+ schema: AddEntryArgsSchema,
630
+ handler: addEntry,
631
+ },
632
+ {
633
+ name: 'update_entry',
634
+ description: 'Update an existing entry in a list section.',
635
+ schema: UpdateEntryArgsSchema,
636
+ handler: updateEntry,
637
+ },
638
+ {
639
+ name: 'delete_entry',
640
+ description: 'Delete an entry from a list section. Also removes any pain-point-persona mappings.',
641
+ schema: DeleteEntryArgsSchema,
642
+ handler: deleteEntry,
643
+ },
644
+ {
645
+ name: 'list_pain_points',
646
+ description: 'List Section 6 (User Sentiment) entries with their persona mappings. Optionally filter to unmapped only.',
647
+ schema: ListPainPointsArgsSchema,
648
+ handler: listPainPoints,
649
+ },
650
+ {
651
+ name: 'map_pain_point_persona',
652
+ description: 'Map a Section 6 pain point to a persona. Validates persona exists in user-feedback.db.',
653
+ schema: MapPainPointPersonaArgsSchema,
654
+ handler: mapPainPointPersona,
655
+ },
656
+ {
657
+ name: 'get_compliance_report',
658
+ description: 'Get per-pain-point mapping status, unmapped count, and compliance percentage.',
659
+ schema: GetComplianceReportArgsSchema,
660
+ handler: getComplianceReport,
661
+ },
662
+ {
663
+ name: 'clear_and_respawn',
664
+ description: 'Clear all section data and create a follow-up task chain for sequential population of all 6 sections.',
665
+ schema: ClearAndRespawnArgsSchema,
666
+ handler: clearAndRespawn,
667
+ },
668
+ {
669
+ name: 'regenerate_md',
670
+ description: 'Force-regenerate the .claude/product-market-fit.md file from current database state.',
671
+ schema: RegenerateMdArgsSchema,
672
+ handler: regenerateMd,
673
+ },
674
+ ];
675
+ const server = new McpServer({
676
+ name: 'product-manager',
677
+ version: '1.0.0',
678
+ tools,
679
+ });
680
+ // Handle cleanup on exit
681
+ process.on('SIGINT', () => {
682
+ closeDb();
683
+ process.exit(0);
684
+ });
685
+ process.on('SIGTERM', () => {
686
+ closeDb();
687
+ process.exit(0);
688
+ });
689
+ server.start();
690
+ //# sourceMappingURL=server.js.map