create-hq 5.0.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 (310) hide show
  1. package/dist/deps.d.ts +4 -0
  2. package/dist/deps.d.ts.map +1 -0
  3. package/dist/deps.js +65 -0
  4. package/dist/deps.js.map +1 -0
  5. package/dist/git.d.ts +3 -0
  6. package/dist/git.d.ts.map +1 -0
  7. package/dist/git.js +19 -0
  8. package/dist/git.js.map +1 -0
  9. package/dist/index.d.ts +3 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +23 -0
  12. package/dist/index.js.map +1 -0
  13. package/dist/scaffold.d.ts +8 -0
  14. package/dist/scaffold.d.ts.map +1 -0
  15. package/dist/scaffold.js +130 -0
  16. package/dist/scaffold.js.map +1 -0
  17. package/dist/ui.d.ts +7 -0
  18. package/dist/ui.d.ts.map +1 -0
  19. package/dist/ui.js +36 -0
  20. package/dist/ui.js.map +1 -0
  21. package/package.json +41 -0
  22. package/template/.claude/CLAUDE.md +202 -0
  23. package/template/.claude/commands/checkpoint.md +127 -0
  24. package/template/.claude/commands/cleanup.md +307 -0
  25. package/template/.claude/commands/execute-task.md +440 -0
  26. package/template/.claude/commands/exit-plan.md +41 -0
  27. package/template/.claude/commands/handoff.md +97 -0
  28. package/template/.claude/commands/learn.md +218 -0
  29. package/template/.claude/commands/metrics.md +118 -0
  30. package/template/.claude/commands/newworker.md +162 -0
  31. package/template/.claude/commands/nexttask.md +67 -0
  32. package/template/.claude/commands/prd.md +238 -0
  33. package/template/.claude/commands/reanchor.md +51 -0
  34. package/template/.claude/commands/remember.md +126 -0
  35. package/template/.claude/commands/run-project.md +348 -0
  36. package/template/.claude/commands/run.md +110 -0
  37. package/template/.claude/commands/search-reindex.md +62 -0
  38. package/template/.claude/commands/search.md +100 -0
  39. package/template/.claude/commands/setup.md +381 -0
  40. package/template/.claude/scripts/pure-ralph-loop.ps1 +312 -0
  41. package/template/.claude/scripts/pure-ralph-loop.sh +859 -0
  42. package/template/CHANGELOG.md +220 -0
  43. package/template/LICENSE +21 -0
  44. package/template/MIGRATION.md +259 -0
  45. package/template/README.md +368 -0
  46. package/template/data/journal/.gitkeep +0 -0
  47. package/template/docs/images/ascii-banner-options.md +122 -0
  48. package/template/docs/images/hq-banner.svg +105 -0
  49. package/template/knowledge/Ralph/01-overview.md +71 -0
  50. package/template/knowledge/Ralph/02-core-concepts.md +114 -0
  51. package/template/knowledge/Ralph/03-how-ralph-works.md +184 -0
  52. package/template/knowledge/Ralph/04-back-pressure.md +222 -0
  53. package/template/knowledge/Ralph/05-specifications.md +210 -0
  54. package/template/knowledge/Ralph/06-agents-md.md +222 -0
  55. package/template/knowledge/Ralph/07-implementation.md +316 -0
  56. package/template/knowledge/Ralph/08-economics.md +182 -0
  57. package/template/knowledge/Ralph/09-resources.md +145 -0
  58. package/template/knowledge/Ralph/10-claude-code-workflow.md +212 -0
  59. package/template/knowledge/Ralph/11-team-training-guide.md +383 -0
  60. package/template/knowledge/Ralph/README.md +40 -0
  61. package/template/knowledge/ai-security-framework/CONTRIBUTING.md +139 -0
  62. package/template/knowledge/ai-security-framework/GLOSSARY.md +176 -0
  63. package/template/knowledge/ai-security-framework/LICENSE +21 -0
  64. package/template/knowledge/ai-security-framework/QUICK-START.md +172 -0
  65. package/template/knowledge/ai-security-framework/README.md +232 -0
  66. package/template/knowledge/ai-security-framework/checklists/browser-security.md +301 -0
  67. package/template/knowledge/ai-security-framework/checklists/credential-isolation.md +322 -0
  68. package/template/knowledge/ai-security-framework/checklists/incident-response.md +288 -0
  69. package/template/knowledge/ai-security-framework/checklists/pre-flight.md +249 -0
  70. package/template/knowledge/ai-security-framework/checklists/weekly-audit.md +159 -0
  71. package/template/knowledge/ai-security-framework/configs/audit-logging.md +372 -0
  72. package/template/knowledge/ai-security-framework/configs/kill-switches.md +354 -0
  73. package/template/knowledge/ai-security-framework/docs/01-core-principles.md +256 -0
  74. package/template/knowledge/ai-security-framework/docs/02-threat-landscape.md +326 -0
  75. package/template/knowledge/ai-security-framework/docs/03-security-posture.md +250 -0
  76. package/template/knowledge/ai-security-framework/templates/agents-security.md +233 -0
  77. package/template/knowledge/design-styles/README.md +42 -0
  78. package/template/knowledge/design-styles/american-industrial.md +136 -0
  79. package/template/knowledge/design-styles/ethereal-abstract.md +133 -0
  80. package/template/knowledge/design-styles/liminal-portal.md +111 -0
  81. package/template/knowledge/design-styles/swipes/american-industrial/G-3m4YPW0AADdu2.jpeg +0 -0
  82. package/template/knowledge/design-styles/swipes/american-industrial/G-JJlt5WwAABK3K.png +0 -0
  83. package/template/knowledge/design-styles/swipes/american-industrial/G-JJmj5W0AEbJ-7.png +0 -0
  84. package/template/knowledge/design-styles/swipes/american-industrial/G59fgNuXkAAKLJQ (1).jpeg +0 -0
  85. package/template/knowledge/design-styles/swipes/american-industrial/G59fgNuXkAAKLJQ.jpeg +0 -0
  86. package/template/knowledge/design-styles/swipes/american-industrial/G7fVkn3WEAAM-ST.jpeg +0 -0
  87. package/template/knowledge/design-styles/swipes/american-industrial/G8ECO5JWEAIksyn.png +0 -0
  88. package/template/knowledge/design-styles/swipes/american-industrial/G9-3GQSWoAA8eqZ.png +0 -0
  89. package/template/knowledge/design-styles/swipes/american-industrial/G9xEOqrXkAEZRcs.png +0 -0
  90. package/template/knowledge/design-styles/swipes/american-industrial/G_MVeJrXQAA8sx4.jpeg +0 -0
  91. package/template/knowledge/design-styles/swipes/american-industrial/G_RSkmGXkAAgAVZ.png +0 -0
  92. package/template/knowledge/design-styles/swipes/american-industrial/README.md +31 -0
  93. package/template/knowledge/design-styles/swipes/american-industrial/qyqtg7Dq.png +0 -0
  94. package/template/knowledge/dev-team/README.md +35 -0
  95. package/template/knowledge/dev-team/patterns/README.md +34 -0
  96. package/template/knowledge/dev-team/patterns/frontend/react-best-practices.md +178 -0
  97. package/template/knowledge/dev-team/troubleshooting/README.md +31 -0
  98. package/template/knowledge/dev-team/workflows/README.md +49 -0
  99. package/template/knowledge/hq/checkpoint-schema.json +51 -0
  100. package/template/knowledge/hq/index-md-spec.md +74 -0
  101. package/template/knowledge/hq/thread-schema.md +153 -0
  102. package/template/knowledge/hq-core/checkpoint-schema.json +51 -0
  103. package/template/knowledge/hq-core/index-md-spec.md +74 -0
  104. package/template/knowledge/hq-core/thread-schema.md +153 -0
  105. package/template/knowledge/loom/README.md +51 -0
  106. package/template/knowledge/loom/architecture.md +125 -0
  107. package/template/knowledge/loom/code-style.md +169 -0
  108. package/template/knowledge/loom/llm-proxy.md +132 -0
  109. package/template/knowledge/loom/state-machine.md +131 -0
  110. package/template/knowledge/loom/thread-system.md +117 -0
  111. package/template/knowledge/loom/tools.md +94 -0
  112. package/template/knowledge/loom/weaver.md +96 -0
  113. package/template/knowledge/loom/web-frontend.md +131 -0
  114. package/template/knowledge/projects/README.md +72 -0
  115. package/template/knowledge/projects/templates/README.template.md +28 -0
  116. package/template/knowledge/workers/README.md +195 -0
  117. package/template/knowledge/workers/ralph-loop-pattern.md +157 -0
  118. package/template/knowledge/workers/skill-schema.md +182 -0
  119. package/template/knowledge/workers/state-machine.md +102 -0
  120. package/template/knowledge/workers/templates/base-worker.yaml +73 -0
  121. package/template/knowledge/workers/templates/code-worker.yaml +85 -0
  122. package/template/knowledge/workers/templates/skill.yaml +49 -0
  123. package/template/knowledge/workers/templates/social-worker.yaml +70 -0
  124. package/template/modules/examples/full-manifest.yaml +92 -0
  125. package/template/modules/examples/minimal.yaml +14 -0
  126. package/template/modules/modules.yaml +59 -0
  127. package/template/projects/.gitkeep +0 -0
  128. package/template/projects/incorporate-workers-into-pure-ralph/prd.json +88 -0
  129. package/template/projects/pure-ralph-branch-isolation/README.md +114 -0
  130. package/template/projects/pure-ralph-branch-isolation/prd.json +123 -0
  131. package/template/projects/purist-ralph-loop/README.md +148 -0
  132. package/template/projects/purist-ralph-loop/prd.json +135 -0
  133. package/template/projects/ralph-test/prd.json +50 -0
  134. package/template/prompts/pure-ralph-base.md +551 -0
  135. package/template/settings/.gitkeep +0 -0
  136. package/template/settings/pure-ralph.json +42 -0
  137. package/template/social-content/drafts/INDEX.md +21 -0
  138. package/template/social-content/drafts/linkedin/.gitkeep +1 -0
  139. package/template/social-content/drafts/x/.gitkeep +1 -0
  140. package/template/social-content/images/.gitkeep +1 -0
  141. package/template/starter-projects/code-worker/README.md +97 -0
  142. package/template/starter-projects/code-worker/prd.json +45 -0
  143. package/template/starter-projects/personal-assistant/README.md +42 -0
  144. package/template/starter-projects/personal-assistant/prd.json +43 -0
  145. package/template/starter-projects/social-media/README.md +60 -0
  146. package/template/starter-projects/social-media/prd.json +43 -0
  147. package/template/workers/content-brand/README.md +59 -0
  148. package/template/workers/content-brand/skills/messaging-alignment.md +91 -0
  149. package/template/workers/content-brand/skills/tone-check.md +76 -0
  150. package/template/workers/content-brand/skills/voice-analysis.md +68 -0
  151. package/template/workers/content-brand/worker.yaml +81 -0
  152. package/template/workers/content-legal/README.md +80 -0
  153. package/template/workers/content-legal/skills/claim-substantiation.md +150 -0
  154. package/template/workers/content-legal/skills/compliance-scan.md +123 -0
  155. package/template/workers/content-legal/skills/disclaimer-check.md +146 -0
  156. package/template/workers/content-legal/worker.yaml +118 -0
  157. package/template/workers/content-product/README.md +77 -0
  158. package/template/workers/content-product/skills/claim-verification.md +96 -0
  159. package/template/workers/content-product/skills/feature-accuracy.md +117 -0
  160. package/template/workers/content-product/skills/stats-check.md +128 -0
  161. package/template/workers/content-product/worker.yaml +97 -0
  162. package/template/workers/content-sales/README.md +70 -0
  163. package/template/workers/content-sales/skills/conversion-analysis.md +96 -0
  164. package/template/workers/content-sales/skills/cta-audit.md +107 -0
  165. package/template/workers/content-sales/skills/value-prop-check.md +114 -0
  166. package/template/workers/content-sales/worker.yaml +93 -0
  167. package/template/workers/content-shared/cli.ts +242 -0
  168. package/template/workers/content-shared/index.ts +234 -0
  169. package/template/workers/content-shared/lib/accuracy-analyzer.ts +661 -0
  170. package/template/workers/content-shared/lib/analyze.ts +370 -0
  171. package/template/workers/content-shared/lib/brand-analyzer.ts +526 -0
  172. package/template/workers/content-shared/lib/cms-integration.ts +446 -0
  173. package/template/workers/content-shared/lib/compliance-analyzer.ts +655 -0
  174. package/template/workers/content-shared/lib/conversion-analyzer.ts +555 -0
  175. package/template/workers/content-shared/lib/github-integration.ts +582 -0
  176. package/template/workers/content-shared/lib/output.ts +373 -0
  177. package/template/workers/content-shared/lib/parser.ts +771 -0
  178. package/template/workers/content-shared/lib/priority.ts +439 -0
  179. package/template/workers/content-shared/lib/recommendations.ts +512 -0
  180. package/template/workers/content-shared/lib/reporter.ts +749 -0
  181. package/template/workers/content-shared/lib/restructure.ts +664 -0
  182. package/template/workers/content-shared/lib/scorer.ts +140 -0
  183. package/template/workers/content-shared/lib/types.ts +227 -0
  184. package/template/workers/content-shared/lib/variants.ts +595 -0
  185. package/template/workers/content-shared/package.json +51 -0
  186. package/template/workers/content-shared/pnpm-lock.yaml +39 -0
  187. package/template/workers/content-shared/test/sample-page.json +115 -0
  188. package/template/workers/content-shared/tsconfig.json +20 -0
  189. package/template/workers/dev-team/README.md +166 -0
  190. package/template/workers/dev-team/_template.yaml +70 -0
  191. package/template/workers/dev-team/architect/package.json +27 -0
  192. package/template/workers/dev-team/architect/skills/api-design.md +89 -0
  193. package/template/workers/dev-team/architect/skills/refactor-plan.md +96 -0
  194. package/template/workers/dev-team/architect/skills/system-design.md +100 -0
  195. package/template/workers/dev-team/architect/src/index.ts +49 -0
  196. package/template/workers/dev-team/architect/src/mcp-server.ts +122 -0
  197. package/template/workers/dev-team/architect/src/skills/api-design.ts +316 -0
  198. package/template/workers/dev-team/architect/src/skills/refactor-plan.ts +264 -0
  199. package/template/workers/dev-team/architect/src/skills/system-design.ts +212 -0
  200. package/template/workers/dev-team/architect/tsconfig.json +19 -0
  201. package/template/workers/dev-team/architect/worker.yaml +128 -0
  202. package/template/workers/dev-team/backend-dev/package-lock.json +1252 -0
  203. package/template/workers/dev-team/backend-dev/package.json +27 -0
  204. package/template/workers/dev-team/backend-dev/skills/implement-endpoint.md +70 -0
  205. package/template/workers/dev-team/backend-dev/skills/implement-service.md +62 -0
  206. package/template/workers/dev-team/backend-dev/src/index.ts +51 -0
  207. package/template/workers/dev-team/backend-dev/src/mcp-server.ts +109 -0
  208. package/template/workers/dev-team/backend-dev/src/skills/implement-endpoint.ts +122 -0
  209. package/template/workers/dev-team/backend-dev/src/skills/implement-service.ts +126 -0
  210. package/template/workers/dev-team/backend-dev/tsconfig.json +19 -0
  211. package/template/workers/dev-team/backend-dev/worker.yaml +128 -0
  212. package/template/workers/dev-team/code-reviewer/package-lock.json +1080 -0
  213. package/template/workers/dev-team/code-reviewer/package.json +24 -0
  214. package/template/workers/dev-team/code-reviewer/skills/merge-to-production.md +61 -0
  215. package/template/workers/dev-team/code-reviewer/skills/merge-to-staging.md +54 -0
  216. package/template/workers/dev-team/code-reviewer/skills/request-changes.md +63 -0
  217. package/template/workers/dev-team/code-reviewer/skills/review-pr.md +77 -0
  218. package/template/workers/dev-team/code-reviewer/src/index.ts +56 -0
  219. package/template/workers/dev-team/code-reviewer/src/mcp-server.ts +101 -0
  220. package/template/workers/dev-team/code-reviewer/tsconfig.json +19 -0
  221. package/template/workers/dev-team/code-reviewer/worker.yaml +90 -0
  222. package/template/workers/dev-team/database-dev/package.json +22 -0
  223. package/template/workers/dev-team/database-dev/skills/create-schema.md +48 -0
  224. package/template/workers/dev-team/database-dev/src/index.ts +50 -0
  225. package/template/workers/dev-team/database-dev/src/mcp-server.ts +76 -0
  226. package/template/workers/dev-team/database-dev/tsconfig.json +18 -0
  227. package/template/workers/dev-team/database-dev/worker.yaml +90 -0
  228. package/template/workers/dev-team/frontend-dev/package.json +22 -0
  229. package/template/workers/dev-team/frontend-dev/skills/create-component.md +26 -0
  230. package/template/workers/dev-team/frontend-dev/src/index.ts +50 -0
  231. package/template/workers/dev-team/frontend-dev/src/mcp-server.ts +77 -0
  232. package/template/workers/dev-team/frontend-dev/tsconfig.json +18 -0
  233. package/template/workers/dev-team/frontend-dev/worker.yaml +132 -0
  234. package/template/workers/dev-team/infra-dev/package.json +24 -0
  235. package/template/workers/dev-team/infra-dev/skills/add-monitoring.md +73 -0
  236. package/template/workers/dev-team/infra-dev/skills/configure-deployment.md +80 -0
  237. package/template/workers/dev-team/infra-dev/skills/create-dockerfile.md +62 -0
  238. package/template/workers/dev-team/infra-dev/skills/setup-cicd.md +63 -0
  239. package/template/workers/dev-team/infra-dev/src/index.ts +55 -0
  240. package/template/workers/dev-team/infra-dev/src/mcp-server.ts +82 -0
  241. package/template/workers/dev-team/infra-dev/tsconfig.json +19 -0
  242. package/template/workers/dev-team/infra-dev/worker.yaml +92 -0
  243. package/template/workers/dev-team/knowledge-curator/package.json +24 -0
  244. package/template/workers/dev-team/knowledge-curator/skills/curate-troubleshooting.md +63 -0
  245. package/template/workers/dev-team/knowledge-curator/skills/process-learnings.md +61 -0
  246. package/template/workers/dev-team/knowledge-curator/skills/sync-documentation.md +76 -0
  247. package/template/workers/dev-team/knowledge-curator/skills/update-patterns.md +63 -0
  248. package/template/workers/dev-team/knowledge-curator/src/index.ts +53 -0
  249. package/template/workers/dev-team/knowledge-curator/src/mcp-server.ts +92 -0
  250. package/template/workers/dev-team/knowledge-curator/tsconfig.json +19 -0
  251. package/template/workers/dev-team/knowledge-curator/worker.yaml +80 -0
  252. package/template/workers/dev-team/motion-designer/package.json +22 -0
  253. package/template/workers/dev-team/motion-designer/skills/add-animation.md +25 -0
  254. package/template/workers/dev-team/motion-designer/skills/generate-image.md +36 -0
  255. package/template/workers/dev-team/motion-designer/src/index.ts +63 -0
  256. package/template/workers/dev-team/motion-designer/src/mcp-server.ts +79 -0
  257. package/template/workers/dev-team/motion-designer/tsconfig.json +18 -0
  258. package/template/workers/dev-team/motion-designer/worker.yaml +84 -0
  259. package/template/workers/dev-team/product-planner/queue.json +4 -0
  260. package/template/workers/dev-team/product-planner/worker.yaml +220 -0
  261. package/template/workers/dev-team/project-manager/package-lock.json +1252 -0
  262. package/template/workers/dev-team/project-manager/package.json +27 -0
  263. package/template/workers/dev-team/project-manager/skills/create-prd.md +66 -0
  264. package/template/workers/dev-team/project-manager/skills/next-issue.md +51 -0
  265. package/template/workers/dev-team/project-manager/skills/project-status.md +59 -0
  266. package/template/workers/dev-team/project-manager/skills/update-learnings.md +65 -0
  267. package/template/workers/dev-team/project-manager/src/index.ts +54 -0
  268. package/template/workers/dev-team/project-manager/src/mcp-server.ts +207 -0
  269. package/template/workers/dev-team/project-manager/src/skills/create-prd.ts +86 -0
  270. package/template/workers/dev-team/project-manager/src/skills/next-issue.ts +137 -0
  271. package/template/workers/dev-team/project-manager/src/skills/project-status.ts +131 -0
  272. package/template/workers/dev-team/project-manager/src/skills/update-learnings.ts +94 -0
  273. package/template/workers/dev-team/project-manager/tsconfig.json +19 -0
  274. package/template/workers/dev-team/project-manager/worker.yaml +96 -0
  275. package/template/workers/dev-team/qa-tester/package.json +24 -0
  276. package/template/workers/dev-team/qa-tester/skills/create-demo-account.md +36 -0
  277. package/template/workers/dev-team/qa-tester/skills/run-tests.md +36 -0
  278. package/template/workers/dev-team/qa-tester/skills/write-test.md +27 -0
  279. package/template/workers/dev-team/qa-tester/src/index.ts +61 -0
  280. package/template/workers/dev-team/qa-tester/src/mcp-server.ts +88 -0
  281. package/template/workers/dev-team/qa-tester/tsconfig.json +18 -0
  282. package/template/workers/dev-team/qa-tester/worker.yaml +116 -0
  283. package/template/workers/dev-team/task-executor/package-lock.json +1252 -0
  284. package/template/workers/dev-team/task-executor/package.json +27 -0
  285. package/template/workers/dev-team/task-executor/skills/analyze-issue.md +101 -0
  286. package/template/workers/dev-team/task-executor/skills/execute.md +133 -0
  287. package/template/workers/dev-team/task-executor/skills/report-learnings.md +106 -0
  288. package/template/workers/dev-team/task-executor/skills/validate-completion.md +121 -0
  289. package/template/workers/dev-team/task-executor/src/index.ts +54 -0
  290. package/template/workers/dev-team/task-executor/src/mcp-server.ts +139 -0
  291. package/template/workers/dev-team/task-executor/src/skills/analyze-issue.ts +219 -0
  292. package/template/workers/dev-team/task-executor/src/skills/execute.ts +132 -0
  293. package/template/workers/dev-team/task-executor/src/skills/report-learnings.ts +119 -0
  294. package/template/workers/dev-team/task-executor/src/skills/validate-completion.ts +142 -0
  295. package/template/workers/dev-team/task-executor/tsconfig.json +19 -0
  296. package/template/workers/dev-team/task-executor/worker.yaml +110 -0
  297. package/template/workers/registry.yaml +171 -0
  298. package/template/workers/security-scanner/README.md +73 -0
  299. package/template/workers/security-scanner/skills/pre-deploy-check.md +205 -0
  300. package/template/workers/security-scanner/worker.yaml +26 -0
  301. package/template/workspace/checkpoints/.gitkeep +0 -0
  302. package/template/workspace/content-ideas/inbox.jsonl +0 -0
  303. package/template/workspace/drafts/.gitkeep +0 -0
  304. package/template/workspace/learnings/.gitkeep +3 -0
  305. package/template/workspace/orchestrator/.gitkeep +0 -0
  306. package/template/workspace/ralph-test/COMPLETE.md +18 -0
  307. package/template/workspace/ralph-test/hello.txt +2 -0
  308. package/template/workspace/reports/.gitkeep +0 -0
  309. package/template/workspace/scratch/.gitkeep +0 -0
  310. package/template/workspace/threads/.gitkeep +3 -0
@@ -0,0 +1,137 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+ import { execSync } from 'child_process';
4
+
5
+ interface Story {
6
+ id: string;
7
+ title: string;
8
+ description?: string;
9
+ acceptance_criteria: string[];
10
+ priority: number;
11
+ passes: boolean;
12
+ dependsOn?: string[];
13
+ worker_hints?: string[];
14
+ }
15
+
16
+ interface Epic {
17
+ id: string;
18
+ title: string;
19
+ stories: Story[];
20
+ }
21
+
22
+ interface PRD {
23
+ project: string;
24
+ epics: Epic[];
25
+ }
26
+
27
+ interface NextIssueOptions {
28
+ project: string;
29
+ filter?: string;
30
+ priority?: string;
31
+ }
32
+
33
+ export async function nextIssue(options: NextIssueOptions): Promise<void> {
34
+ const { project, filter, priority } = options;
35
+
36
+ // Find PRD file
37
+ const prdPath = path.join(process.cwd(), '..', '..', '..', 'projects', project, 'prd.json');
38
+
39
+ if (!fs.existsSync(prdPath)) {
40
+ console.error(`PRD not found at ${prdPath}`);
41
+ console.log('\nTo create a new PRD, run:');
42
+ console.log(` project-manager create-prd --name ${project} --input requirements.md`);
43
+ process.exit(1);
44
+ }
45
+
46
+ const prd: PRD = JSON.parse(fs.readFileSync(prdPath, 'utf-8'));
47
+
48
+ // Collect all stories with their pass status
49
+ const allStories: (Story & { epicId: string; epicTitle: string })[] = [];
50
+ for (const epic of prd.epics) {
51
+ for (const story of epic.stories) {
52
+ allStories.push({ ...story, epicId: epic.id, epicTitle: epic.title });
53
+ }
54
+ }
55
+
56
+ // Build pass map for dependency checking
57
+ const passMap = new Map<string, boolean>();
58
+ for (const story of allStories) {
59
+ passMap.set(story.id, story.passes);
60
+ }
61
+
62
+ // Filter to incomplete stories with met dependencies
63
+ let candidates = allStories.filter(story => {
64
+ if (story.passes) return false;
65
+
66
+ // Check dependencies
67
+ if (story.dependsOn && story.dependsOn.length > 0) {
68
+ for (const dep of story.dependsOn) {
69
+ if (!passMap.get(dep)) return false;
70
+ }
71
+ }
72
+
73
+ return true;
74
+ });
75
+
76
+ // Apply optional filters
77
+ if (priority) {
78
+ const priorityMap: Record<string, number> = { high: 1, medium: 2, low: 3 };
79
+ const priorityValue = priorityMap[priority.toLowerCase()];
80
+ if (priorityValue) {
81
+ candidates = candidates.filter(s => s.priority <= priorityValue);
82
+ }
83
+ }
84
+
85
+ if (candidates.length === 0) {
86
+ console.log('No eligible issues found.');
87
+ console.log('\nPossible reasons:');
88
+ console.log(' - All stories are complete (passes: true)');
89
+ console.log(' - Remaining stories have unmet dependencies');
90
+ process.exit(0);
91
+ }
92
+
93
+ // Score and sort candidates
94
+ candidates.sort((a, b) => {
95
+ // Priority first (lower number = higher priority)
96
+ if (a.priority !== b.priority) return a.priority - b.priority;
97
+
98
+ // Then by number of stories blocked by this one
99
+ const aBlocks = allStories.filter(s => s.dependsOn?.includes(a.id)).length;
100
+ const bBlocks = allStories.filter(s => s.dependsOn?.includes(b.id)).length;
101
+ return bBlocks - aBlocks;
102
+ });
103
+
104
+ // Present top candidates
105
+ const top = candidates.slice(0, 3);
106
+ const recommended = top[0];
107
+
108
+ console.log(`\n=== Next Issue Selection for ${project} ===\n`);
109
+ console.log(`Recommended: ${recommended.id} "${recommended.title}"`);
110
+ console.log(` Epic: ${recommended.epicTitle}`);
111
+ console.log(` Priority: ${recommended.priority}`);
112
+
113
+ const blocksCount = allStories.filter(s => s.dependsOn?.includes(recommended.id)).length;
114
+ if (blocksCount > 0) {
115
+ console.log(` Blocks: ${blocksCount} other stories`);
116
+ }
117
+
118
+ if (recommended.worker_hints && recommended.worker_hints.length > 0) {
119
+ console.log(` Workers: ${recommended.worker_hints.join(' → ')}`);
120
+ }
121
+
122
+ console.log('\n Acceptance Criteria:');
123
+ for (const criterion of recommended.acceptance_criteria) {
124
+ console.log(` - ${criterion}`);
125
+ }
126
+
127
+ if (top.length > 1) {
128
+ console.log('\nAlternatives:');
129
+ for (let i = 1; i < top.length; i++) {
130
+ const alt = top[i];
131
+ console.log(` - ${alt.id}: "${alt.title}" (Priority: ${alt.priority})`);
132
+ }
133
+ }
134
+
135
+ console.log('\n[Human approval required to proceed]');
136
+ console.log('To execute, run task-executor with the selected issue.');
137
+ }
@@ -0,0 +1,131 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+
4
+ interface Story {
5
+ id: string;
6
+ title: string;
7
+ passes: boolean;
8
+ dependsOn?: string[];
9
+ }
10
+
11
+ interface Epic {
12
+ id: string;
13
+ title: string;
14
+ stories: Story[];
15
+ }
16
+
17
+ interface PRD {
18
+ project: string;
19
+ epics: Epic[];
20
+ }
21
+
22
+ interface ProjectStatusOptions {
23
+ project: string;
24
+ verbose?: boolean;
25
+ format?: string;
26
+ }
27
+
28
+ export async function projectStatus(options: ProjectStatusOptions): Promise<void> {
29
+ const { project, verbose, format = 'table' } = options;
30
+
31
+ const prdPath = path.join(process.cwd(), '..', '..', '..', 'projects', project, 'prd.json');
32
+
33
+ if (!fs.existsSync(prdPath)) {
34
+ console.error(`PRD not found at ${prdPath}`);
35
+ process.exit(1);
36
+ }
37
+
38
+ const prd: PRD = JSON.parse(fs.readFileSync(prdPath, 'utf-8'));
39
+
40
+ // Collect all stories
41
+ const allStories: (Story & { epicTitle: string })[] = [];
42
+ for (const epic of prd.epics) {
43
+ for (const story of epic.stories) {
44
+ allStories.push({ ...story, epicTitle: epic.title });
45
+ }
46
+ }
47
+
48
+ // Calculate stats
49
+ const total = allStories.length;
50
+ const completed = allStories.filter(s => s.passes).length;
51
+ const pending = allStories.filter(s => !s.passes).length;
52
+ const percentage = Math.round((completed / total) * 100);
53
+
54
+ // Build pass map for dependency checking
55
+ const passMap = new Map<string, boolean>();
56
+ for (const story of allStories) {
57
+ passMap.set(story.id, story.passes);
58
+ }
59
+
60
+ // Find blocked stories
61
+ const blocked = allStories.filter(story => {
62
+ if (story.passes) return false;
63
+ if (!story.dependsOn || story.dependsOn.length === 0) return false;
64
+ return story.dependsOn.some(dep => !passMap.get(dep));
65
+ });
66
+
67
+ // Find ready stories (not passed, dependencies met)
68
+ const ready = allStories.filter(story => {
69
+ if (story.passes) return false;
70
+ if (!story.dependsOn || story.dependsOn.length === 0) return true;
71
+ return story.dependsOn.every(dep => passMap.get(dep));
72
+ });
73
+
74
+ // Output
75
+ if (format === 'json') {
76
+ console.log(JSON.stringify({
77
+ project,
78
+ total,
79
+ completed,
80
+ pending,
81
+ percentage,
82
+ blocked: blocked.map(s => s.id),
83
+ ready: ready.map(s => s.id)
84
+ }, null, 2));
85
+ return;
86
+ }
87
+
88
+ // Progress bar
89
+ const barLength = 20;
90
+ const filledLength = Math.round((percentage / 100) * barLength);
91
+ const bar = '█'.repeat(filledLength) + '░'.repeat(barLength - filledLength);
92
+
93
+ console.log(`\n=== ${project} ===`);
94
+ console.log(`Progress: ${bar} ${percentage}% (${completed}/${total} stories)\n`);
95
+
96
+ if (completed > 0) {
97
+ console.log(`✅ Completed (${completed}):`);
98
+ for (const story of allStories.filter(s => s.passes)) {
99
+ console.log(` - ${story.id}: ${story.title}`);
100
+ }
101
+ console.log();
102
+ }
103
+
104
+ if (ready.length > 0) {
105
+ console.log(`⏳ Ready (${ready.length}):`);
106
+ for (const story of ready) {
107
+ console.log(` - ${story.id}: ${story.title}`);
108
+ }
109
+ console.log();
110
+ }
111
+
112
+ if (blocked.length > 0) {
113
+ console.log(`🚫 Blocked (${blocked.length}):`);
114
+ for (const story of blocked) {
115
+ const blockedBy = story.dependsOn?.filter(dep => !passMap.get(dep)) || [];
116
+ console.log(` - ${story.id}: ${story.title}`);
117
+ console.log(` blocked by: ${blockedBy.join(', ')}`);
118
+ }
119
+ console.log();
120
+ }
121
+
122
+ // Next recommendation
123
+ if (ready.length > 0) {
124
+ console.log(`Next: Run task-executor on ${ready[0].id}`);
125
+ console.log(` task-executor execute --issue ${ready[0].id} --project ${project}`);
126
+ } else if (pending > 0) {
127
+ console.log('⚠️ All pending stories are blocked. Resolve dependencies first.');
128
+ } else {
129
+ console.log('🎉 All stories complete!');
130
+ }
131
+ }
@@ -0,0 +1,94 @@
1
+ import * as fs from 'fs';
2
+ import * as path from 'path';
3
+
4
+ interface Learning {
5
+ type: 'project' | 'pattern' | 'troubleshoot' | 'workflow';
6
+ category?: string;
7
+ content: string;
8
+ task?: string;
9
+ }
10
+
11
+ interface UpdateLearningsOptions {
12
+ project?: string;
13
+ dryRun?: boolean;
14
+ }
15
+
16
+ const KNOWLEDGE_BASE = path.join(process.cwd(), '..', '..', '..', 'knowledge', 'dev-team');
17
+
18
+ export async function updateLearnings(options: UpdateLearningsOptions): Promise<void> {
19
+ const { project, dryRun } = options;
20
+
21
+ // Read learnings from stdin or prompt
22
+ console.log('=== Update Learnings ===\n');
23
+ console.log('Paste learning report (JSON format), then press Ctrl+D:\n');
24
+
25
+ // In practice, this would read from stdin or a file
26
+ // For now, show the expected format
27
+ console.log('Expected format:');
28
+ console.log(JSON.stringify({
29
+ task: 'US-001',
30
+ learnings: [
31
+ { type: 'pattern', category: 'backend', content: 'Use retry wrapper for external APIs' },
32
+ { type: 'troubleshoot', content: 'Redis must connect before auth middleware' }
33
+ ]
34
+ }, null, 2));
35
+
36
+ console.log('\n[This skill processes learnings from task-executor]');
37
+ console.log('\nRouting destinations:');
38
+ console.log(' - project → projects/{name}/learnings/');
39
+ console.log(' - pattern → knowledge/dev-team/patterns/{category}/');
40
+ console.log(' - troubleshoot → knowledge/dev-team/troubleshooting/');
41
+ console.log(' - workflow → knowledge/dev-team/workflows/');
42
+
43
+ if (dryRun) {
44
+ console.log('\n[Dry run mode - no files will be written]');
45
+ }
46
+ }
47
+
48
+ export function routeLearning(learning: Learning, project?: string): string {
49
+ const date = new Date().toISOString().split('T')[0];
50
+ const slug = learning.content
51
+ .toLowerCase()
52
+ .replace(/[^a-z0-9]+/g, '-')
53
+ .substring(0, 40);
54
+
55
+ switch (learning.type) {
56
+ case 'project':
57
+ if (!project) throw new Error('Project required for project-specific learnings');
58
+ return path.join('projects', project, 'learnings', `${date}-${slug}.md`);
59
+
60
+ case 'pattern':
61
+ const category = learning.category || 'general';
62
+ return path.join(KNOWLEDGE_BASE, 'patterns', category, `${slug}.md`);
63
+
64
+ case 'troubleshoot':
65
+ return path.join(KNOWLEDGE_BASE, 'troubleshooting', `${slug}.md`);
66
+
67
+ case 'workflow':
68
+ return path.join(KNOWLEDGE_BASE, 'workflows', `${slug}.md`);
69
+
70
+ default:
71
+ throw new Error(`Unknown learning type: ${learning.type}`);
72
+ }
73
+ }
74
+
75
+ export function formatLearning(learning: Learning, task?: string): string {
76
+ const lines = [
77
+ `# ${learning.content.split('.')[0]}`,
78
+ '',
79
+ `## Content`,
80
+ learning.content,
81
+ ''
82
+ ];
83
+
84
+ if (task) {
85
+ lines.push(`## Source`);
86
+ lines.push(`Learned from task: ${task}`);
87
+ lines.push('');
88
+ }
89
+
90
+ lines.push(`## Date`);
91
+ lines.push(new Date().toISOString().split('T')[0]);
92
+
93
+ return lines.join('\n');
94
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "compilerOptions": {
3
+ "target": "ES2022",
4
+ "module": "commonjs",
5
+ "lib": ["ES2022"],
6
+ "outDir": "./dist",
7
+ "rootDir": "./src",
8
+ "strict": true,
9
+ "esModuleInterop": true,
10
+ "skipLibCheck": true,
11
+ "forceConsistentCasingInFileNames": true,
12
+ "resolveJsonModule": true,
13
+ "declaration": true,
14
+ "declarationMap": true,
15
+ "sourceMap": true
16
+ },
17
+ "include": ["src/**/*"],
18
+ "exclude": ["node_modules", "dist"]
19
+ }
@@ -0,0 +1,96 @@
1
+ worker:
2
+ id: project-manager
3
+ name: "Project Manager"
4
+ type: OpsWorker
5
+ version: "1.0"
6
+
7
+ execution:
8
+ mode: on_demand
9
+ max_runtime: 10m
10
+ retry_attempts: 1
11
+
12
+ context:
13
+ base:
14
+ - workers/public/dev-team/project-manager/
15
+ - workers/public/dev-team/project-manager/skills/
16
+ - knowledge/public/dev-team/workflows/
17
+ dynamic:
18
+ - pattern: "projects/{project}/"
19
+ when: always
20
+ exclude:
21
+ - node_modules/
22
+ - dist/
23
+ - "*.log"
24
+
25
+ verification:
26
+ post_execute:
27
+ - check: typescript
28
+ command: npm run typecheck
29
+ approval_required: true
30
+
31
+ output:
32
+ destination: workspace/reports/dev-team/
33
+ format: both
34
+ naming: "{date}-project-manager-{skill}.{ext}"
35
+
36
+ mcp:
37
+ server:
38
+ command: node
39
+ args:
40
+ - dist/mcp-server.js
41
+ cwd: workers/public/dev-team/project-manager
42
+ tools:
43
+ - next_issue
44
+ - create_prd
45
+ - update_learnings
46
+ - project_status
47
+
48
+ # State Machine (Loom pattern)
49
+ state_machine:
50
+ enabled: true
51
+ max_retries: 1
52
+ hooks:
53
+ post_execute:
54
+ - auto_checkpoint
55
+ - log_metrics
56
+ on_error:
57
+ - log_error
58
+ - checkpoint_error_state
59
+
60
+ instructions: |
61
+ # Project Manager
62
+
63
+ Orchestrates project execution: PRD lifecycle, issue selection, learning aggregation.
64
+
65
+ ## Skills
66
+
67
+ | Skill | Description |
68
+ |-------|-------------|
69
+ | next-issue | Select next issue from PRD/beads to work on |
70
+ | create-prd | Create new PRD from requirements |
71
+ | update-learnings | Route learnings to appropriate knowledge locations |
72
+ | project-status | Show project progress and blockers |
73
+
74
+ ## CLI Usage
75
+
76
+ ```bash
77
+ cd workers/public/dev-team/project-manager
78
+ node dist/index.js next-issue --project my-feature
79
+ node dist/index.js create-prd --name "New Feature" --input requirements.md
80
+ node dist/index.js project-status --project my-feature
81
+ ```
82
+
83
+ ## Workflow
84
+
85
+ 1. Read PRD/beads for project
86
+ 2. Select next issue (passes=false, dependencies met)
87
+ 3. Spawn task-executor with selected issue
88
+ 4. Receive learnings from task-executor
89
+ 5. Route learnings via update-learnings skill
90
+ 6. Repeat until all issues pass
91
+
92
+ ## Human-in-the-loop
93
+
94
+ - Before issue selection: Show candidates, get approval
95
+ - After task completion: Show learnings, confirm routing
96
+ - On project completion: Summarize outcomes
@@ -0,0 +1,24 @@
1
+ {
2
+ "name": "@hq/qa-tester",
3
+ "version": "1.0.0",
4
+ "description": "Testing, browser automation, and accessibility verification",
5
+ "main": "dist/index.js",
6
+ "bin": { "qa-tester": "dist/index.js" },
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "typecheck": "tsc --noEmit",
10
+ "dev": "ts-node src/index.ts",
11
+ "mcp": "node dist/mcp-server.js"
12
+ },
13
+ "dependencies": {
14
+ "@modelcontextprotocol/sdk": "^1.0.0",
15
+ "@playwright/test": "^1.57.0",
16
+ "@axe-core/playwright": "^4.10.0",
17
+ "commander": "^12.1.0"
18
+ },
19
+ "devDependencies": {
20
+ "@types/node": "^22.10.0",
21
+ "typescript": "^5.7.2",
22
+ "ts-node": "^10.9.2"
23
+ }
24
+ }
@@ -0,0 +1,36 @@
1
+ # create-demo-account
2
+
3
+ Create a demo account for testing purposes.
4
+
5
+ ## Arguments
6
+
7
+ `$ARGUMENTS` = `--platform <shopify|stripe|etc>` (required)
8
+
9
+ Optional:
10
+ - `--name <string>` - Account name
11
+ - `--project <name>` - Project context
12
+
13
+ ## Process
14
+
15
+ 1. Identify platform requirements
16
+ 2. Generate demo credentials
17
+ 3. Create account via API/UI
18
+ 4. Store credentials safely
19
+ 5. Verify account works
20
+
21
+ ## Output
22
+
23
+ Demo account details stored in:
24
+ `projects/{project}/test-env/demo-accounts.json`
25
+
26
+ ## Platforms Supported
27
+
28
+ - Shopify (development store)
29
+ - Stripe (test mode)
30
+ - Custom platforms (via config)
31
+
32
+ ## Human-in-the-loop
33
+
34
+ - Approve account creation
35
+ - Confirm platform selection
36
+ - Review stored credentials
@@ -0,0 +1,36 @@
1
+ # run-tests
2
+
3
+ Run test suite and report results.
4
+
5
+ ## Arguments
6
+
7
+ `$ARGUMENTS` = `--suite <name>` or `--file <path>` (optional)
8
+
9
+ Optional:
10
+ - `--repo <path>` - Target repository
11
+ - `--type <unit|e2e|all>` - Test type
12
+ - `--watch` - Watch mode
13
+
14
+ ## Process
15
+
16
+ 1. Detect test framework (Jest, Vitest, Playwright)
17
+ 2. Run specified tests
18
+ 3. Capture results
19
+ 4. Format report
20
+ 5. Surface failures with context
21
+
22
+ ## Output
23
+
24
+ Test report:
25
+ ```
26
+ ✅ 42 passed
27
+ ❌ 2 failed
28
+ ⏭️ 3 skipped
29
+
30
+ Failed tests:
31
+ 1. src/api/auth.test.ts:42 - login should return token
32
+ Error: Expected 200, got 401
33
+
34
+ 2. src/components/Button.test.tsx:18 - renders correctly
35
+ Error: Snapshot mismatch
36
+ ```
@@ -0,0 +1,27 @@
1
+ # write-test
2
+
3
+ Write a new test for a feature or function.
4
+
5
+ ## Arguments
6
+
7
+ `$ARGUMENTS` = `--target <file|function>` (required)
8
+
9
+ Optional:
10
+ - `--repo <path>` - Target repository
11
+ - `--type <unit|integration|e2e>` - Test type
12
+
13
+ ## Process
14
+
15
+ 1. Analyze target code
16
+ 2. Identify test cases
17
+ 3. Generate test file
18
+ 4. Add to test suite
19
+ 5. Verify tests pass
20
+
21
+ ## Output
22
+
23
+ New test file with:
24
+ - Setup/teardown
25
+ - Happy path tests
26
+ - Edge cases
27
+ - Error handling tests
@@ -0,0 +1,61 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+
4
+ const program = new Command();
5
+
6
+ program
7
+ .name('qa-tester')
8
+ .description('Testing, browser automation, and accessibility verification')
9
+ .version('1.0.0');
10
+
11
+ program
12
+ .command('run-tests')
13
+ .description('Run test suite')
14
+ .option('--suite <name>', 'Test suite name')
15
+ .option('--file <path>', 'Specific test file')
16
+ .option('--repo <path>', 'Target repository')
17
+ .option('--type <type>', 'Test type: unit|e2e|all')
18
+ .option('--watch', 'Watch mode')
19
+ .action(async (options) => {
20
+ console.log('run-tests:', options);
21
+ });
22
+
23
+ program
24
+ .command('write-test')
25
+ .description('Write new test for feature')
26
+ .requiredOption('--target <path>', 'Target file or function')
27
+ .option('--repo <path>', 'Target repository')
28
+ .option('--type <type>', 'Test type: unit|integration|e2e')
29
+ .action(async (options) => {
30
+ console.log('write-test:', options);
31
+ });
32
+
33
+ program
34
+ .command('visual-regression')
35
+ .description('Run visual regression tests')
36
+ .option('--url <url>', 'Target URL')
37
+ .option('--repo <path>', 'Target repository')
38
+ .action(async (options) => {
39
+ console.log('visual-regression:', options);
40
+ });
41
+
42
+ program
43
+ .command('accessibility-scan')
44
+ .description('Run accessibility audit')
45
+ .requiredOption('--url <url>', 'Target URL')
46
+ .option('--standard <wcag>', 'WCAG standard: 2.0|2.1|2.2')
47
+ .action(async (options) => {
48
+ console.log('accessibility-scan:', options);
49
+ });
50
+
51
+ program
52
+ .command('create-demo-account')
53
+ .description('Create demo account for testing')
54
+ .requiredOption('--platform <name>', 'Platform: shopify|stripe|etc')
55
+ .option('--name <string>', 'Account name')
56
+ .option('--project <name>', 'Project context')
57
+ .action(async (options) => {
58
+ console.log('create-demo-account:', options);
59
+ });
60
+
61
+ program.parse();