@xhulz/nina 0.52.0 → 0.53.1

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 (275) hide show
  1. package/README.md +4 -0
  2. package/bin/nina.mjs +29 -5
  3. package/package.json +1 -1
  4. package/releases/0.53.0/core/GAPS.md +125 -0
  5. package/releases/0.53.0/core/answered.json +68 -0
  6. package/releases/0.53.0/core/defaults/tree/.claude/agents/architect.md +1 -0
  7. package/releases/0.53.0/core/defaults/tree/.claude/agents/dba.md +3 -0
  8. package/releases/0.53.0/core/defaults/tree/.claude/agents/devops.md +1 -0
  9. package/releases/0.53.0/core/defaults/tree/.claude/agents/implementer.md +1 -0
  10. package/releases/0.53.0/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
  11. package/releases/0.53.0/core/defaults/tree/.claude/agents/qa.md +7 -0
  12. package/releases/0.53.0/core/defaults/tree/.claude/agents/reviewer.md +3 -0
  13. package/releases/0.53.0/core/defaults/tree/.claude/agents/secops.md +3 -0
  14. package/releases/0.53.0/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
  15. package/releases/0.53.0/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
  16. package/releases/0.53.0/core/tree/.claude/agents/architect.md +129 -0
  17. package/releases/0.53.0/core/tree/.claude/agents/dba.md +117 -0
  18. package/releases/0.53.0/core/tree/.claude/agents/devops.md +118 -0
  19. package/releases/0.53.0/core/tree/.claude/agents/implementer.md +163 -0
  20. package/releases/0.53.0/core/tree/.claude/agents/integration-tester.md +168 -0
  21. package/releases/0.53.0/core/tree/.claude/agents/planner.md +132 -0
  22. package/releases/0.53.0/core/tree/.claude/agents/qa.md +150 -0
  23. package/releases/0.53.0/core/tree/.claude/agents/reviewer.md +184 -0
  24. package/releases/0.53.0/core/tree/.claude/agents/secops.md +120 -0
  25. package/releases/0.53.0/core/tree/.claude/agents/solidity-auditor.md +126 -0
  26. package/releases/0.53.0/core/tree/.claude/agents/solidity-dev.md +123 -0
  27. package/releases/0.53.0/core/tree/.claude/agents-overview.md +64 -0
  28. package/releases/0.53.0/core/tree/.claude/frontend.md +10 -0
  29. package/releases/0.53.0/core/tree/.claude/graph.md +75 -0
  30. package/releases/0.53.0/core/tree/.claude/patterns.md +251 -0
  31. package/releases/0.53.0/core/tree/.claude/pills/README.md +150 -0
  32. package/releases/0.53.0/core/tree/.claude/pipeline.md +101 -0
  33. package/releases/0.53.0/core/tree/.claude/retrieval.md +103 -0
  34. package/releases/0.53.0/core/tree/.claude/router.md +202 -0
  35. package/releases/0.53.0/core/tree/.claude/templates/integration.md +46 -0
  36. package/releases/0.53.0/core/tree/CLAUDE.md +164 -0
  37. package/releases/0.53.0/core/tree/scripts/cost-watch.mjs +25 -0
  38. package/releases/0.53.0/core/tree/scripts/edit-guard.mjs +24 -0
  39. package/releases/0.53.0/core/tree/scripts/harness-check.mjs +71 -0
  40. package/releases/0.53.0/core/tree/scripts/loop-gate.mjs +19 -0
  41. package/releases/0.53.0/core/vocabulary.json +13 -0
  42. package/releases/0.53.0/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
  43. package/releases/0.53.0/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
  44. package/releases/0.53.0/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
  45. package/releases/0.53.0/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
  46. package/releases/0.53.0/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
  47. package/releases/0.53.0/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
  48. package/releases/0.53.0/surfaces/blockchain/tree/.claude/graph.md +11 -0
  49. package/releases/0.53.0/surfaces/blockchain/tree/.claude/router.md +6 -0
  50. package/releases/0.53.0/surfaces/blockchain/tree/CLAUDE.md +12 -0
  51. package/releases/0.53.0/surfaces/d1/tree/.claude/agents/dba.md +15 -0
  52. package/releases/0.53.0/surfaces/d1/tree/.claude/agents/devops.md +2 -0
  53. package/releases/0.53.0/surfaces/d1/tree/.claude/agents/implementer.md +2 -0
  54. package/releases/0.53.0/surfaces/d1/tree/.claude/patterns.md +8 -0
  55. package/releases/0.53.0/surfaces/d1/tree/CLAUDE.md +2 -0
  56. package/releases/0.53.0/surfaces/db/tree/.claude/agents/architect.md +5 -0
  57. package/releases/0.53.0/surfaces/db/tree/.claude/agents/dba.md +54 -0
  58. package/releases/0.53.0/surfaces/db/tree/.claude/agents/devops.md +5 -0
  59. package/releases/0.53.0/surfaces/db/tree/.claude/agents/implementer.md +2 -0
  60. package/releases/0.53.0/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
  61. package/releases/0.53.0/surfaces/db/tree/.claude/agents/planner.md +2 -0
  62. package/releases/0.53.0/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
  63. package/releases/0.53.0/surfaces/db/tree/.claude/agents/secops.md +2 -0
  64. package/releases/0.53.0/surfaces/db/tree/.claude/agents-overview.md +5 -0
  65. package/releases/0.53.0/surfaces/db/tree/.claude/graph.md +8 -0
  66. package/releases/0.53.0/surfaces/db/tree/.claude/patterns.md +22 -0
  67. package/releases/0.53.0/surfaces/db/tree/.claude/pipeline.md +13 -0
  68. package/releases/0.53.0/surfaces/db/tree/.claude/retrieval.md +5 -0
  69. package/releases/0.53.0/surfaces/db/tree/.claude/router.md +4 -0
  70. package/releases/0.53.0/surfaces/db/tree/CLAUDE.md +17 -0
  71. package/releases/0.53.0/surfaces/drizzle/tree/.claude/agents/dba.md +9 -0
  72. package/releases/0.53.0/surfaces/drizzle/tree/.claude/agents/devops.md +5 -0
  73. package/releases/0.53.0/surfaces/drizzle/tree/.claude/agents/implementer.md +2 -0
  74. package/releases/0.53.0/surfaces/drizzle/tree/.claude/patterns.md +7 -0
  75. package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
  76. package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
  77. package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/devops.md +29 -0
  78. package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
  79. package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
  80. package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
  81. package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
  82. package/releases/0.53.0/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
  83. package/releases/0.53.0/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
  84. package/releases/0.53.0/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
  85. package/releases/0.53.0/surfaces/edge-cf/tree/CLAUDE.md +27 -0
  86. package/releases/0.53.0/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
  87. package/releases/0.53.0/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
  88. package/releases/0.53.0/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
  89. package/releases/0.53.0/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
  90. package/releases/0.53.0/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
  91. package/releases/0.53.0/surfaces/frontend/tree/.claude/patterns.md +8 -0
  92. package/releases/0.53.0/surfaces/frontend/tree/.claude/retrieval.md +2 -0
  93. package/releases/0.53.0/surfaces/frontend/tree/.claude/router.md +14 -0
  94. package/releases/0.53.0/surfaces/frontend/tree/CLAUDE.md +5 -0
  95. package/releases/0.53.0/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
  96. package/releases/0.53.0/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
  97. package/releases/0.53.0/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
  98. package/releases/0.53.0/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
  99. package/releases/0.53.0/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
  100. package/releases/0.53.0/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
  101. package/releases/0.53.0/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
  102. package/releases/0.53.0/surfaces/integrations/tree/.claude/graph.md +10 -0
  103. package/releases/0.53.0/surfaces/integrations/tree/.claude/patterns.md +38 -0
  104. package/releases/0.53.0/surfaces/integrations/tree/.claude/pipeline.md +16 -0
  105. package/releases/0.53.0/surfaces/integrations/tree/.claude/retrieval.md +16 -0
  106. package/releases/0.53.0/surfaces/integrations/tree/.claude/router.md +6 -0
  107. package/releases/0.53.0/surfaces/integrations/tree/CLAUDE.md +17 -0
  108. package/releases/0.53.0/surfaces/money/tree/.claude/agents/architect.md +12 -0
  109. package/releases/0.53.0/surfaces/money/tree/.claude/agents/dba.md +14 -0
  110. package/releases/0.53.0/surfaces/money/tree/.claude/agents/implementer.md +11 -0
  111. package/releases/0.53.0/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
  112. package/releases/0.53.0/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
  113. package/releases/0.53.0/surfaces/money/tree/.claude/agents/secops.md +5 -0
  114. package/releases/0.53.0/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
  115. package/releases/0.53.0/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
  116. package/releases/0.53.0/surfaces/money/tree/.claude/graph.md +2 -0
  117. package/releases/0.53.0/surfaces/money/tree/.claude/patterns.md +49 -0
  118. package/releases/0.53.0/surfaces/money/tree/.claude/pipeline.md +2 -0
  119. package/releases/0.53.0/surfaces/money/tree/.claude/retrieval.md +2 -0
  120. package/releases/0.53.0/surfaces/money/tree/CLAUDE.md +11 -0
  121. package/releases/0.53.0/surfaces/pii/tree/.claude/agents/dba.md +2 -0
  122. package/releases/0.53.0/surfaces/pii/tree/.claude/agents/devops.md +8 -0
  123. package/releases/0.53.0/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
  124. package/releases/0.53.0/surfaces/pii/tree/.claude/agents/secops.md +2 -0
  125. package/releases/0.53.0/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
  126. package/releases/0.53.0/surfaces/pii/tree/CLAUDE.md +5 -0
  127. package/releases/0.53.0/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
  128. package/releases/0.53.0/surfaces/prisma/tree/.claude/agents/dba.md +42 -0
  129. package/releases/0.53.0/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
  130. package/releases/0.53.0/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
  131. package/releases/0.53.0/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
  132. package/releases/0.53.0/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
  133. package/releases/0.53.0/surfaces/prisma/tree/.claude/patterns.md +15 -0
  134. package/releases/0.53.0/surfaces/prisma/tree/CLAUDE.md +5 -0
  135. package/releases/0.53.1/core/GAPS.md +125 -0
  136. package/releases/0.53.1/core/answered.json +68 -0
  137. package/releases/0.53.1/core/defaults/tree/.claude/agents/architect.md +1 -0
  138. package/releases/0.53.1/core/defaults/tree/.claude/agents/dba.md +3 -0
  139. package/releases/0.53.1/core/defaults/tree/.claude/agents/devops.md +1 -0
  140. package/releases/0.53.1/core/defaults/tree/.claude/agents/implementer.md +1 -0
  141. package/releases/0.53.1/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
  142. package/releases/0.53.1/core/defaults/tree/.claude/agents/qa.md +7 -0
  143. package/releases/0.53.1/core/defaults/tree/.claude/agents/reviewer.md +3 -0
  144. package/releases/0.53.1/core/defaults/tree/.claude/agents/secops.md +3 -0
  145. package/releases/0.53.1/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
  146. package/releases/0.53.1/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
  147. package/releases/0.53.1/core/tree/.claude/agents/architect.md +129 -0
  148. package/releases/0.53.1/core/tree/.claude/agents/dba.md +117 -0
  149. package/releases/0.53.1/core/tree/.claude/agents/devops.md +118 -0
  150. package/releases/0.53.1/core/tree/.claude/agents/implementer.md +163 -0
  151. package/releases/0.53.1/core/tree/.claude/agents/integration-tester.md +168 -0
  152. package/releases/0.53.1/core/tree/.claude/agents/planner.md +132 -0
  153. package/releases/0.53.1/core/tree/.claude/agents/qa.md +150 -0
  154. package/releases/0.53.1/core/tree/.claude/agents/reviewer.md +184 -0
  155. package/releases/0.53.1/core/tree/.claude/agents/secops.md +120 -0
  156. package/releases/0.53.1/core/tree/.claude/agents/solidity-auditor.md +126 -0
  157. package/releases/0.53.1/core/tree/.claude/agents/solidity-dev.md +123 -0
  158. package/releases/0.53.1/core/tree/.claude/agents-overview.md +64 -0
  159. package/releases/0.53.1/core/tree/.claude/frontend.md +10 -0
  160. package/releases/0.53.1/core/tree/.claude/graph.md +75 -0
  161. package/releases/0.53.1/core/tree/.claude/patterns.md +251 -0
  162. package/releases/0.53.1/core/tree/.claude/pills/README.md +150 -0
  163. package/releases/0.53.1/core/tree/.claude/pipeline.md +101 -0
  164. package/releases/0.53.1/core/tree/.claude/retrieval.md +103 -0
  165. package/releases/0.53.1/core/tree/.claude/router.md +202 -0
  166. package/releases/0.53.1/core/tree/.claude/templates/integration.md +46 -0
  167. package/releases/0.53.1/core/tree/CLAUDE.md +164 -0
  168. package/releases/0.53.1/core/tree/scripts/cost-watch.mjs +25 -0
  169. package/releases/0.53.1/core/tree/scripts/edit-guard.mjs +24 -0
  170. package/releases/0.53.1/core/tree/scripts/harness-check.mjs +71 -0
  171. package/releases/0.53.1/core/tree/scripts/loop-gate.mjs +19 -0
  172. package/releases/0.53.1/core/vocabulary.json +13 -0
  173. package/releases/0.53.1/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
  174. package/releases/0.53.1/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
  175. package/releases/0.53.1/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
  176. package/releases/0.53.1/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
  177. package/releases/0.53.1/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
  178. package/releases/0.53.1/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
  179. package/releases/0.53.1/surfaces/blockchain/tree/.claude/graph.md +11 -0
  180. package/releases/0.53.1/surfaces/blockchain/tree/.claude/router.md +6 -0
  181. package/releases/0.53.1/surfaces/blockchain/tree/CLAUDE.md +12 -0
  182. package/releases/0.53.1/surfaces/d1/tree/.claude/agents/dba.md +15 -0
  183. package/releases/0.53.1/surfaces/d1/tree/.claude/agents/devops.md +2 -0
  184. package/releases/0.53.1/surfaces/d1/tree/.claude/agents/implementer.md +2 -0
  185. package/releases/0.53.1/surfaces/d1/tree/.claude/patterns.md +8 -0
  186. package/releases/0.53.1/surfaces/d1/tree/CLAUDE.md +2 -0
  187. package/releases/0.53.1/surfaces/db/tree/.claude/agents/architect.md +5 -0
  188. package/releases/0.53.1/surfaces/db/tree/.claude/agents/dba.md +54 -0
  189. package/releases/0.53.1/surfaces/db/tree/.claude/agents/devops.md +5 -0
  190. package/releases/0.53.1/surfaces/db/tree/.claude/agents/implementer.md +2 -0
  191. package/releases/0.53.1/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
  192. package/releases/0.53.1/surfaces/db/tree/.claude/agents/planner.md +2 -0
  193. package/releases/0.53.1/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
  194. package/releases/0.53.1/surfaces/db/tree/.claude/agents/secops.md +2 -0
  195. package/releases/0.53.1/surfaces/db/tree/.claude/agents-overview.md +5 -0
  196. package/releases/0.53.1/surfaces/db/tree/.claude/graph.md +8 -0
  197. package/releases/0.53.1/surfaces/db/tree/.claude/patterns.md +22 -0
  198. package/releases/0.53.1/surfaces/db/tree/.claude/pipeline.md +13 -0
  199. package/releases/0.53.1/surfaces/db/tree/.claude/retrieval.md +5 -0
  200. package/releases/0.53.1/surfaces/db/tree/.claude/router.md +4 -0
  201. package/releases/0.53.1/surfaces/db/tree/CLAUDE.md +17 -0
  202. package/releases/0.53.1/surfaces/drizzle/tree/.claude/agents/dba.md +9 -0
  203. package/releases/0.53.1/surfaces/drizzle/tree/.claude/agents/devops.md +5 -0
  204. package/releases/0.53.1/surfaces/drizzle/tree/.claude/agents/implementer.md +2 -0
  205. package/releases/0.53.1/surfaces/drizzle/tree/.claude/patterns.md +7 -0
  206. package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
  207. package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
  208. package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/devops.md +29 -0
  209. package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
  210. package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
  211. package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
  212. package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
  213. package/releases/0.53.1/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
  214. package/releases/0.53.1/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
  215. package/releases/0.53.1/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
  216. package/releases/0.53.1/surfaces/edge-cf/tree/CLAUDE.md +27 -0
  217. package/releases/0.53.1/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
  218. package/releases/0.53.1/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
  219. package/releases/0.53.1/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
  220. package/releases/0.53.1/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
  221. package/releases/0.53.1/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
  222. package/releases/0.53.1/surfaces/frontend/tree/.claude/patterns.md +8 -0
  223. package/releases/0.53.1/surfaces/frontend/tree/.claude/retrieval.md +2 -0
  224. package/releases/0.53.1/surfaces/frontend/tree/.claude/router.md +14 -0
  225. package/releases/0.53.1/surfaces/frontend/tree/CLAUDE.md +5 -0
  226. package/releases/0.53.1/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
  227. package/releases/0.53.1/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
  228. package/releases/0.53.1/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
  229. package/releases/0.53.1/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
  230. package/releases/0.53.1/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
  231. package/releases/0.53.1/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
  232. package/releases/0.53.1/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
  233. package/releases/0.53.1/surfaces/integrations/tree/.claude/graph.md +10 -0
  234. package/releases/0.53.1/surfaces/integrations/tree/.claude/patterns.md +38 -0
  235. package/releases/0.53.1/surfaces/integrations/tree/.claude/pipeline.md +16 -0
  236. package/releases/0.53.1/surfaces/integrations/tree/.claude/retrieval.md +16 -0
  237. package/releases/0.53.1/surfaces/integrations/tree/.claude/router.md +6 -0
  238. package/releases/0.53.1/surfaces/integrations/tree/CLAUDE.md +17 -0
  239. package/releases/0.53.1/surfaces/money/tree/.claude/agents/architect.md +12 -0
  240. package/releases/0.53.1/surfaces/money/tree/.claude/agents/dba.md +14 -0
  241. package/releases/0.53.1/surfaces/money/tree/.claude/agents/implementer.md +11 -0
  242. package/releases/0.53.1/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
  243. package/releases/0.53.1/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
  244. package/releases/0.53.1/surfaces/money/tree/.claude/agents/secops.md +5 -0
  245. package/releases/0.53.1/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
  246. package/releases/0.53.1/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
  247. package/releases/0.53.1/surfaces/money/tree/.claude/graph.md +2 -0
  248. package/releases/0.53.1/surfaces/money/tree/.claude/patterns.md +49 -0
  249. package/releases/0.53.1/surfaces/money/tree/.claude/pipeline.md +2 -0
  250. package/releases/0.53.1/surfaces/money/tree/.claude/retrieval.md +2 -0
  251. package/releases/0.53.1/surfaces/money/tree/CLAUDE.md +11 -0
  252. package/releases/0.53.1/surfaces/pii/tree/.claude/agents/dba.md +2 -0
  253. package/releases/0.53.1/surfaces/pii/tree/.claude/agents/devops.md +8 -0
  254. package/releases/0.53.1/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
  255. package/releases/0.53.1/surfaces/pii/tree/.claude/agents/secops.md +2 -0
  256. package/releases/0.53.1/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
  257. package/releases/0.53.1/surfaces/pii/tree/CLAUDE.md +5 -0
  258. package/releases/0.53.1/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
  259. package/releases/0.53.1/surfaces/prisma/tree/.claude/agents/dba.md +42 -0
  260. package/releases/0.53.1/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
  261. package/releases/0.53.1/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
  262. package/releases/0.53.1/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
  263. package/releases/0.53.1/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
  264. package/releases/0.53.1/surfaces/prisma/tree/.claude/patterns.md +15 -0
  265. package/releases/0.53.1/surfaces/prisma/tree/CLAUDE.md +5 -0
  266. package/src/commands/dashboard.mjs +33 -0
  267. package/src/commands/learn.mjs +51 -19
  268. package/src/commands/pills.mjs +55 -28
  269. package/src/commands/pipeline.mjs +62 -33
  270. package/src/commands/runs.mjs +14 -3
  271. package/src/commands/stats.mjs +199 -107
  272. package/src/dashboard.html +331 -0
  273. package/src/dashboard.mjs +191 -0
  274. package/src/office.mjs +48 -83
  275. package/src/serve.mjs +108 -0
package/src/office.mjs CHANGED
@@ -22,7 +22,6 @@
22
22
  * a click on a link, beside the conversation once `workbench.browser.openLocalhostLinks` is on (1.140).
23
23
  */
24
24
 
25
- import { spawn } from 'node:child_process';
26
25
  import { readFileSync, statSync } from 'node:fs';
27
26
  import { createServer } from 'node:http';
28
27
  import { basename, dirname, join } from 'node:path';
@@ -34,6 +33,7 @@ import { projectStoreFile, readStoreFile } from './store.mjs';
34
33
  import { IN_FLIGHT, cyclesOf } from './commands/stats.mjs';
35
34
  import { isLoopBack } from './transcripts.mjs';
36
35
  import { shapeOf } from './commands/pipeline.mjs';
36
+ import { listenHere, openInBrowser, refuseElsewhere, untilStopped } from './serve.mjs';
37
37
 
38
38
  /** The page, one self-contained file: the room, the sprites and the animation, with nothing fetched from anywhere. */
39
39
  const PAGE = join(dirname(fileURLToPath(import.meta.url)), 'office.html');
@@ -307,14 +307,14 @@ export function officeRoom(target) {
307
307
  const send = (res, event, data) => res.write(`event: ${event}\ndata: ${JSON.stringify(data)}\n\n`);
308
308
 
309
309
  /**
310
- * Serves the office: the page at `/`, its beats at `/events` as server-sent events. Live, each client is handed the
311
- * session's beats so far to set the room by, at once, and then each new one as the gate writes it, following the
312
- * newest session unless one was named; a replay plays one session from its start, its gaps shortened.
310
+ * The office's paths, for a server to mount: the page and its stream of beats and timeline, polling the ledger while
311
+ * anyone watches live. `serveOffice` mounts them at the root; the dashboard (`nina dashboard`) at `/office/`, where the
312
+ * page's relative `events` reaches `/office/events`.
313
313
  *
314
- * @param {{target: string, wanted?: string, replay?: boolean, port?: number}} options
315
- * @returns {Promise<{url: string, close: () => Promise<void>}>}
314
+ * @param {{target: string, wanted?: string, replay?: boolean}} options
315
+ * @returns {{handle: (req: import('node:http').IncomingMessage, res: import('node:http').ServerResponse, path: string) => boolean, close: () => void}}
316
316
  */
317
- export async function serveOffice({ target, wanted, replay = false, port = OFFICE_PORT }) {
317
+ export function officeRoutes({ target, wanted, replay = false }) {
318
318
  const room = officeRoom(target);
319
319
  const graph = parseGraph(readFileSync(join(target, '.claude', 'graph.md'), 'utf8'));
320
320
  // A function, so a `$&` or `$'` in a project's name or its owner's is text and not a replacement pattern.
@@ -418,20 +418,16 @@ export async function serveOffice({ target, wanted, replay = false, port = OFFIC
418
418
  next();
419
419
  };
420
420
 
421
- const server = createServer((req, res) => {
422
- // Only this machine's own names for itself: a page elsewhere that rebinds its domain to the loopback address
423
- // reaches the port, and is refused here. Any port, since a forwarded one — an editor's port forwarding, a
424
- // container's — reaches this one under another number.
425
- if (!/^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(String(req.headers.host ?? ''))) {
426
- res.writeHead(403, { 'content-type': 'text/plain' });
427
- res.end('not from here\n');
428
- return;
429
- }
430
- const path = new URL(req.url ?? '/', 'http://localhost').pathname;
421
+ /**
422
+ * Serves the office's own paths — `/` and `/events`, relative to where it is mounted — and says whether it did.
423
+ *
424
+ * @returns {boolean}
425
+ */
426
+ const handle = (req, res, path) => {
431
427
  if (path === '/') {
432
428
  res.writeHead(200, { 'content-type': 'text/html; charset=utf-8', 'cache-control': 'no-store' });
433
429
  res.end(page);
434
- return;
430
+ return true;
435
431
  }
436
432
  if (path === '/events') {
437
433
  res.writeHead(200, { 'content-type': 'text/event-stream', 'cache-control': 'no-store', connection: 'keep-alive' });
@@ -441,79 +437,53 @@ export async function serveOffice({ target, wanted, replay = false, port = OFFIC
441
437
  req.on('close', () => clients.delete(client));
442
438
  if (replay) play(client);
443
439
  else tick();
444
- return;
440
+ return true;
445
441
  }
442
+ return false;
443
+ };
444
+
445
+ const poll = setInterval(tick, POLL_MS);
446
+ const close = () => {
447
+ clearInterval(poll);
448
+ for (const timer of timers) clearTimeout(timer);
449
+ for (const client of clients) client.res.end();
450
+ clients.clear();
451
+ };
452
+ return { handle, close };
453
+ }
454
+
455
+ /**
456
+ * Serves the office on its own: the page at `/`, its beats at `/events` as server-sent events (`officeRoutes`). Live,
457
+ * each client is handed the session's beats so far to set the room by, at once, and then each new one as the gate
458
+ * writes it, following the newest session unless one was named; a replay plays one session from its start, its gaps
459
+ * shortened.
460
+ *
461
+ * @param {{target: string, wanted?: string, replay?: boolean, port?: number}} options
462
+ * @returns {Promise<{url: string, close: () => Promise<void>}>}
463
+ */
464
+ export async function serveOffice({ target, wanted, replay = false, port = OFFICE_PORT }) {
465
+ const routes = officeRoutes({ target, wanted, replay });
466
+ const server = createServer((req, res) => {
467
+ if (refuseElsewhere(req, res)) return;
468
+ if (routes.handle(req, res, new URL(req.url ?? '/', 'http://localhost').pathname)) return;
446
469
  res.writeHead(404, { 'content-type': 'text/plain' });
447
470
  res.end('not here\n');
448
471
  });
449
-
450
- const poll = setInterval(tick, POLL_MS);
451
- const listen = (p) =>
452
- new Promise((resolveListen, reject) => {
453
- const onError = (error) => {
454
- server.off('listening', onListening);
455
- reject(error);
456
- };
457
- const onListening = () => {
458
- server.off('error', onError);
459
- resolveListen();
460
- };
461
- server.once('error', onError);
462
- server.once('listening', onListening);
463
- server.listen(p, '127.0.0.1');
464
- });
472
+ let url;
465
473
  try {
466
- await listen(port);
474
+ url = await listenHere(server, port);
467
475
  } catch (error) {
468
- if (error?.code !== 'EADDRINUSE' || port === 0) {
469
- clearInterval(poll);
470
- throw error;
471
- }
472
- await listen(0);
476
+ routes.close();
477
+ throw error;
473
478
  }
474
- const url = `http://127.0.0.1:${server.address().port}`;
475
479
  const close = () =>
476
480
  new Promise((resolveClose) => {
477
- clearInterval(poll);
478
- for (const timer of timers) clearTimeout(timer);
479
- for (const client of clients) client.res.end();
480
- clients.clear();
481
+ routes.close();
481
482
  server.close(() => resolveClose());
482
483
  });
483
484
  return { url, close };
484
485
  }
485
486
 
486
- /**
487
- * Hands an address to the system's opener. One that is not there fails at once, and one with no display to open on
488
- * exits with an error soon after; one still running after two seconds is taken to have opened it. Windows' explorer
489
- * answers 1 even when it opened the page.
490
- *
491
- * @param {string} url
492
- * @returns {Promise<boolean>} Whether the browser was opened.
493
- */
494
- function openInBrowser(url) {
495
- const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'explorer' : 'xdg-open';
496
- return new Promise((resolveOpen) => {
497
- let child;
498
- try {
499
- child = spawn(opener, [url], { stdio: 'ignore', detached: true });
500
- } catch {
501
- resolveOpen(false);
502
- return;
503
- }
504
- const timer = setTimeout(() => resolveOpen(true), 2000);
505
- child.once('error', () => {
506
- clearTimeout(timer);
507
- resolveOpen(false);
508
- });
509
- child.once('exit', (code) => {
510
- clearTimeout(timer);
511
- resolveOpen(code === 0 || process.platform === 'win32');
512
- });
513
- child.unref();
514
- });
515
- }
516
-
517
487
  /**
518
488
  * Runs the office until Ctrl+C: serves it, says where for a click, and opens it in the system's browser when asked.
519
489
  *
@@ -538,12 +508,7 @@ export async function viewOffice({ target, wanted, replay = false, port = OFFICE
538
508
  console.error(` the office could not open a port — ${error?.message ?? error}\n`);
539
509
  return 1;
540
510
  }
541
- // Listening for Ctrl+C before saying it closes the office: pressed in between, with no listener yet, it would kill
542
- // the process outright instead.
543
- const stopped = new Promise((resolveStop) => {
544
- process.once('SIGINT', resolveStop);
545
- process.once('SIGTERM', resolveStop);
546
- });
511
+ const stopped = untilStopped();
547
512
  const what = replay ? `replaying session ${sessionLedgers(target, wanted).picked.session.slice(0, 8)}` : wanted ? `live, session ${wanted}` : 'live, following the newest session';
548
513
  const opened = open ? await openInBrowser(office.url) : false;
549
514
  // The address ends its line, with nothing after it, so a terminal makes it a link.
package/src/serve.mjs ADDED
@@ -0,0 +1,108 @@
1
+ /**
2
+ * What every page NINA serves on this machine shares: the loopback address, the check that refuses a request named
3
+ * for another host, a port asked for and any free one when it is taken, and the system's opener for `--open`.
4
+ *
5
+ * The office (`nina pipeline --view`) came first and held all of it; the dashboard (`nina dashboard`) serves the
6
+ * office too, and a second copy of the host check is the kind of fact this repository has shipped drifting before.
7
+ */
8
+
9
+ import { spawn } from 'node:child_process';
10
+
11
+ /**
12
+ * Whether a request names this machine for itself: a page elsewhere that rebinds its domain to the loopback address
13
+ * reaches the port, and is refused. Any port, since a forwarded one — an editor's port forwarding, a container's —
14
+ * reaches this one under another number.
15
+ *
16
+ * @param {import('node:http').IncomingMessage} req
17
+ * @returns {boolean}
18
+ */
19
+ export const fromHere = (req) => /^(127\.0\.0\.1|localhost|\[::1\])(:\d+)?$/i.test(String(req.headers.host ?? ''));
20
+
21
+ /**
22
+ * Answers a request for another host with 403, and says whether it did.
23
+ *
24
+ * @param {import('node:http').IncomingMessage} req
25
+ * @param {import('node:http').ServerResponse} res
26
+ * @returns {boolean} True when the request was refused.
27
+ */
28
+ export function refuseElsewhere(req, res) {
29
+ if (fromHere(req)) return false;
30
+ res.writeHead(403, { 'content-type': 'text/plain' });
31
+ res.end('not from here\n');
32
+ return true;
33
+ }
34
+
35
+ /**
36
+ * Listens on the loopback address: on `port`, or on any free one when it is taken. Port 0 asks for any from the start.
37
+ *
38
+ * @param {import('node:http').Server} server
39
+ * @param {number} port
40
+ * @returns {Promise<string>} The address served.
41
+ */
42
+ export async function listenHere(server, port) {
43
+ const listen = (p) =>
44
+ new Promise((resolveListen, reject) => {
45
+ const onError = (error) => {
46
+ server.off('listening', onListening);
47
+ reject(error);
48
+ };
49
+ const onListening = () => {
50
+ server.off('error', onError);
51
+ resolveListen();
52
+ };
53
+ server.once('error', onError);
54
+ server.once('listening', onListening);
55
+ server.listen(p, '127.0.0.1');
56
+ });
57
+ try {
58
+ await listen(port);
59
+ } catch (error) {
60
+ if (error?.code !== 'EADDRINUSE' || port === 0) throw error;
61
+ await listen(0);
62
+ }
63
+ return `http://127.0.0.1:${server.address().port}`;
64
+ }
65
+
66
+ /**
67
+ * Hands an address to the system's opener. One that is not there fails at once, and one with no display to open on
68
+ * exits with an error soon after; one still running after two seconds is taken to have opened it. Windows' explorer
69
+ * answers 1 even when it opened the page.
70
+ *
71
+ * @param {string} url
72
+ * @returns {Promise<boolean>} Whether the browser was opened.
73
+ */
74
+ export function openInBrowser(url) {
75
+ const opener = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'explorer' : 'xdg-open';
76
+ return new Promise((resolveOpen) => {
77
+ let child;
78
+ try {
79
+ child = spawn(opener, [url], { stdio: 'ignore', detached: true });
80
+ } catch {
81
+ resolveOpen(false);
82
+ return;
83
+ }
84
+ const timer = setTimeout(() => resolveOpen(true), 2000);
85
+ child.once('error', () => {
86
+ clearTimeout(timer);
87
+ resolveOpen(false);
88
+ });
89
+ child.once('exit', (code) => {
90
+ clearTimeout(timer);
91
+ resolveOpen(code === 0 || process.platform === 'win32');
92
+ });
93
+ child.unref();
94
+ });
95
+ }
96
+
97
+ /**
98
+ * A promise kept at Ctrl+C or a termination signal. Listening before the address is printed matters: pressed in
99
+ * between, with no listener yet, Ctrl+C would kill the process outright instead of closing what it serves.
100
+ *
101
+ * @returns {Promise<void>}
102
+ */
103
+ export function untilStopped() {
104
+ return new Promise((resolveStop) => {
105
+ process.once('SIGINT', resolveStop);
106
+ process.once('SIGTERM', resolveStop);
107
+ });
108
+ }