@xhulz/nina 0.46.0 → 0.48.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 (272) hide show
  1. package/README.md +1 -1
  2. package/bin/nina.mjs +8 -2
  3. package/package.json +1 -1
  4. package/releases/0.47.0/core/GAPS.md +125 -0
  5. package/releases/0.47.0/core/answered.json +44 -0
  6. package/releases/0.47.0/core/defaults/tree/.claude/agents/architect.md +1 -0
  7. package/releases/0.47.0/core/defaults/tree/.claude/agents/dba.md +3 -0
  8. package/releases/0.47.0/core/defaults/tree/.claude/agents/devops.md +1 -0
  9. package/releases/0.47.0/core/defaults/tree/.claude/agents/implementer.md +1 -0
  10. package/releases/0.47.0/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
  11. package/releases/0.47.0/core/defaults/tree/.claude/agents/qa.md +7 -0
  12. package/releases/0.47.0/core/defaults/tree/.claude/agents/reviewer.md +3 -0
  13. package/releases/0.47.0/core/defaults/tree/.claude/agents/secops.md +3 -0
  14. package/releases/0.47.0/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
  15. package/releases/0.47.0/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
  16. package/releases/0.47.0/core/tree/.claude/agents/architect.md +127 -0
  17. package/releases/0.47.0/core/tree/.claude/agents/dba.md +117 -0
  18. package/releases/0.47.0/core/tree/.claude/agents/devops.md +118 -0
  19. package/releases/0.47.0/core/tree/.claude/agents/implementer.md +160 -0
  20. package/releases/0.47.0/core/tree/.claude/agents/integration-tester.md +168 -0
  21. package/releases/0.47.0/core/tree/.claude/agents/planner.md +132 -0
  22. package/releases/0.47.0/core/tree/.claude/agents/qa.md +150 -0
  23. package/releases/0.47.0/core/tree/.claude/agents/reviewer.md +183 -0
  24. package/releases/0.47.0/core/tree/.claude/agents/secops.md +120 -0
  25. package/releases/0.47.0/core/tree/.claude/agents/solidity-auditor.md +126 -0
  26. package/releases/0.47.0/core/tree/.claude/agents/solidity-dev.md +123 -0
  27. package/releases/0.47.0/core/tree/.claude/agents-overview.md +64 -0
  28. package/releases/0.47.0/core/tree/.claude/frontend.md +10 -0
  29. package/releases/0.47.0/core/tree/.claude/graph.md +75 -0
  30. package/releases/0.47.0/core/tree/.claude/patterns.md +251 -0
  31. package/releases/0.47.0/core/tree/.claude/pills/README.md +147 -0
  32. package/releases/0.47.0/core/tree/.claude/pipeline.md +101 -0
  33. package/releases/0.47.0/core/tree/.claude/retrieval.md +103 -0
  34. package/releases/0.47.0/core/tree/.claude/router.md +198 -0
  35. package/releases/0.47.0/core/tree/.claude/templates/integration.md +45 -0
  36. package/releases/0.47.0/core/tree/CLAUDE.md +164 -0
  37. package/releases/0.47.0/core/tree/scripts/cost-watch.mjs +25 -0
  38. package/releases/0.47.0/core/tree/scripts/edit-guard.mjs +24 -0
  39. package/releases/0.47.0/core/tree/scripts/harness-check.mjs +71 -0
  40. package/releases/0.47.0/core/tree/scripts/loop-gate.mjs +19 -0
  41. package/releases/0.47.0/core/vocabulary.json +13 -0
  42. package/releases/0.47.0/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
  43. package/releases/0.47.0/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
  44. package/releases/0.47.0/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
  45. package/releases/0.47.0/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
  46. package/releases/0.47.0/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
  47. package/releases/0.47.0/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
  48. package/releases/0.47.0/surfaces/blockchain/tree/.claude/graph.md +11 -0
  49. package/releases/0.47.0/surfaces/blockchain/tree/.claude/router.md +6 -0
  50. package/releases/0.47.0/surfaces/blockchain/tree/CLAUDE.md +12 -0
  51. package/releases/0.47.0/surfaces/d1/tree/.claude/agents/dba.md +13 -0
  52. package/releases/0.47.0/surfaces/d1/tree/.claude/agents/devops.md +2 -0
  53. package/releases/0.47.0/surfaces/d1/tree/.claude/agents/implementer.md +2 -0
  54. package/releases/0.47.0/surfaces/d1/tree/.claude/patterns.md +8 -0
  55. package/releases/0.47.0/surfaces/d1/tree/CLAUDE.md +2 -0
  56. package/releases/0.47.0/surfaces/db/tree/.claude/agents/architect.md +5 -0
  57. package/releases/0.47.0/surfaces/db/tree/.claude/agents/dba.md +54 -0
  58. package/releases/0.47.0/surfaces/db/tree/.claude/agents/devops.md +5 -0
  59. package/releases/0.47.0/surfaces/db/tree/.claude/agents/implementer.md +2 -0
  60. package/releases/0.47.0/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
  61. package/releases/0.47.0/surfaces/db/tree/.claude/agents/planner.md +2 -0
  62. package/releases/0.47.0/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
  63. package/releases/0.47.0/surfaces/db/tree/.claude/agents/secops.md +2 -0
  64. package/releases/0.47.0/surfaces/db/tree/.claude/agents-overview.md +5 -0
  65. package/releases/0.47.0/surfaces/db/tree/.claude/graph.md +8 -0
  66. package/releases/0.47.0/surfaces/db/tree/.claude/patterns.md +22 -0
  67. package/releases/0.47.0/surfaces/db/tree/.claude/pipeline.md +13 -0
  68. package/releases/0.47.0/surfaces/db/tree/.claude/retrieval.md +5 -0
  69. package/releases/0.47.0/surfaces/db/tree/.claude/router.md +4 -0
  70. package/releases/0.47.0/surfaces/db/tree/CLAUDE.md +17 -0
  71. package/releases/0.47.0/surfaces/drizzle/tree/.claude/agents/dba.md +9 -0
  72. package/releases/0.47.0/surfaces/drizzle/tree/.claude/agents/devops.md +5 -0
  73. package/releases/0.47.0/surfaces/drizzle/tree/.claude/agents/implementer.md +2 -0
  74. package/releases/0.47.0/surfaces/drizzle/tree/.claude/patterns.md +7 -0
  75. package/releases/0.47.0/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
  76. package/releases/0.47.0/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
  77. package/releases/0.47.0/surfaces/edge-cf/tree/.claude/agents/devops.md +29 -0
  78. package/releases/0.47.0/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
  79. package/releases/0.47.0/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
  80. package/releases/0.47.0/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
  81. package/releases/0.47.0/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
  82. package/releases/0.47.0/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
  83. package/releases/0.47.0/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
  84. package/releases/0.47.0/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
  85. package/releases/0.47.0/surfaces/edge-cf/tree/CLAUDE.md +27 -0
  86. package/releases/0.47.0/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
  87. package/releases/0.47.0/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
  88. package/releases/0.47.0/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
  89. package/releases/0.47.0/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
  90. package/releases/0.47.0/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
  91. package/releases/0.47.0/surfaces/frontend/tree/.claude/patterns.md +8 -0
  92. package/releases/0.47.0/surfaces/frontend/tree/.claude/retrieval.md +2 -0
  93. package/releases/0.47.0/surfaces/frontend/tree/.claude/router.md +14 -0
  94. package/releases/0.47.0/surfaces/frontend/tree/CLAUDE.md +5 -0
  95. package/releases/0.47.0/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
  96. package/releases/0.47.0/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
  97. package/releases/0.47.0/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
  98. package/releases/0.47.0/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
  99. package/releases/0.47.0/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
  100. package/releases/0.47.0/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
  101. package/releases/0.47.0/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
  102. package/releases/0.47.0/surfaces/integrations/tree/.claude/graph.md +10 -0
  103. package/releases/0.47.0/surfaces/integrations/tree/.claude/patterns.md +38 -0
  104. package/releases/0.47.0/surfaces/integrations/tree/.claude/pipeline.md +16 -0
  105. package/releases/0.47.0/surfaces/integrations/tree/.claude/retrieval.md +16 -0
  106. package/releases/0.47.0/surfaces/integrations/tree/.claude/router.md +6 -0
  107. package/releases/0.47.0/surfaces/integrations/tree/CLAUDE.md +17 -0
  108. package/releases/0.47.0/surfaces/money/tree/.claude/agents/architect.md +12 -0
  109. package/releases/0.47.0/surfaces/money/tree/.claude/agents/dba.md +14 -0
  110. package/releases/0.47.0/surfaces/money/tree/.claude/agents/implementer.md +11 -0
  111. package/releases/0.47.0/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
  112. package/releases/0.47.0/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
  113. package/releases/0.47.0/surfaces/money/tree/.claude/agents/secops.md +5 -0
  114. package/releases/0.47.0/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
  115. package/releases/0.47.0/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
  116. package/releases/0.47.0/surfaces/money/tree/.claude/graph.md +2 -0
  117. package/releases/0.47.0/surfaces/money/tree/.claude/patterns.md +49 -0
  118. package/releases/0.47.0/surfaces/money/tree/.claude/pipeline.md +2 -0
  119. package/releases/0.47.0/surfaces/money/tree/.claude/retrieval.md +2 -0
  120. package/releases/0.47.0/surfaces/money/tree/CLAUDE.md +11 -0
  121. package/releases/0.47.0/surfaces/pii/tree/.claude/agents/dba.md +2 -0
  122. package/releases/0.47.0/surfaces/pii/tree/.claude/agents/devops.md +8 -0
  123. package/releases/0.47.0/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
  124. package/releases/0.47.0/surfaces/pii/tree/.claude/agents/secops.md +2 -0
  125. package/releases/0.47.0/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
  126. package/releases/0.47.0/surfaces/pii/tree/CLAUDE.md +5 -0
  127. package/releases/0.47.0/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
  128. package/releases/0.47.0/surfaces/prisma/tree/.claude/agents/dba.md +42 -0
  129. package/releases/0.47.0/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
  130. package/releases/0.47.0/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
  131. package/releases/0.47.0/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
  132. package/releases/0.47.0/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
  133. package/releases/0.47.0/surfaces/prisma/tree/.claude/patterns.md +15 -0
  134. package/releases/0.47.0/surfaces/prisma/tree/CLAUDE.md +5 -0
  135. package/releases/0.48.0/core/GAPS.md +125 -0
  136. package/releases/0.48.0/core/answered.json +44 -0
  137. package/releases/0.48.0/core/defaults/tree/.claude/agents/architect.md +1 -0
  138. package/releases/0.48.0/core/defaults/tree/.claude/agents/dba.md +3 -0
  139. package/releases/0.48.0/core/defaults/tree/.claude/agents/devops.md +1 -0
  140. package/releases/0.48.0/core/defaults/tree/.claude/agents/implementer.md +1 -0
  141. package/releases/0.48.0/core/defaults/tree/.claude/agents/integration-tester.md +3 -0
  142. package/releases/0.48.0/core/defaults/tree/.claude/agents/qa.md +7 -0
  143. package/releases/0.48.0/core/defaults/tree/.claude/agents/reviewer.md +3 -0
  144. package/releases/0.48.0/core/defaults/tree/.claude/agents/secops.md +3 -0
  145. package/releases/0.48.0/core/defaults/tree/.claude/agents/solidity-auditor.md +3 -0
  146. package/releases/0.48.0/core/defaults/tree/.claude/agents/solidity-dev.md +3 -0
  147. package/releases/0.48.0/core/tree/.claude/agents/architect.md +127 -0
  148. package/releases/0.48.0/core/tree/.claude/agents/dba.md +117 -0
  149. package/releases/0.48.0/core/tree/.claude/agents/devops.md +118 -0
  150. package/releases/0.48.0/core/tree/.claude/agents/implementer.md +160 -0
  151. package/releases/0.48.0/core/tree/.claude/agents/integration-tester.md +168 -0
  152. package/releases/0.48.0/core/tree/.claude/agents/planner.md +132 -0
  153. package/releases/0.48.0/core/tree/.claude/agents/qa.md +150 -0
  154. package/releases/0.48.0/core/tree/.claude/agents/reviewer.md +183 -0
  155. package/releases/0.48.0/core/tree/.claude/agents/secops.md +120 -0
  156. package/releases/0.48.0/core/tree/.claude/agents/solidity-auditor.md +126 -0
  157. package/releases/0.48.0/core/tree/.claude/agents/solidity-dev.md +123 -0
  158. package/releases/0.48.0/core/tree/.claude/agents-overview.md +64 -0
  159. package/releases/0.48.0/core/tree/.claude/frontend.md +10 -0
  160. package/releases/0.48.0/core/tree/.claude/graph.md +75 -0
  161. package/releases/0.48.0/core/tree/.claude/patterns.md +251 -0
  162. package/releases/0.48.0/core/tree/.claude/pills/README.md +147 -0
  163. package/releases/0.48.0/core/tree/.claude/pipeline.md +101 -0
  164. package/releases/0.48.0/core/tree/.claude/retrieval.md +103 -0
  165. package/releases/0.48.0/core/tree/.claude/router.md +202 -0
  166. package/releases/0.48.0/core/tree/.claude/templates/integration.md +45 -0
  167. package/releases/0.48.0/core/tree/CLAUDE.md +164 -0
  168. package/releases/0.48.0/core/tree/scripts/cost-watch.mjs +25 -0
  169. package/releases/0.48.0/core/tree/scripts/edit-guard.mjs +24 -0
  170. package/releases/0.48.0/core/tree/scripts/harness-check.mjs +71 -0
  171. package/releases/0.48.0/core/tree/scripts/loop-gate.mjs +19 -0
  172. package/releases/0.48.0/core/vocabulary.json +13 -0
  173. package/releases/0.48.0/surfaces/blockchain/tree/.claude/agents/architect.md +5 -0
  174. package/releases/0.48.0/surfaces/blockchain/tree/.claude/agents/devops.md +5 -0
  175. package/releases/0.48.0/surfaces/blockchain/tree/.claude/agents/reviewer.md +5 -0
  176. package/releases/0.48.0/surfaces/blockchain/tree/.claude/agents/solidity-auditor.md +18 -0
  177. package/releases/0.48.0/surfaces/blockchain/tree/.claude/agents/solidity-dev.md +16 -0
  178. package/releases/0.48.0/surfaces/blockchain/tree/.claude/agents-overview.md +6 -0
  179. package/releases/0.48.0/surfaces/blockchain/tree/.claude/graph.md +11 -0
  180. package/releases/0.48.0/surfaces/blockchain/tree/.claude/router.md +6 -0
  181. package/releases/0.48.0/surfaces/blockchain/tree/CLAUDE.md +12 -0
  182. package/releases/0.48.0/surfaces/d1/tree/.claude/agents/dba.md +13 -0
  183. package/releases/0.48.0/surfaces/d1/tree/.claude/agents/devops.md +2 -0
  184. package/releases/0.48.0/surfaces/d1/tree/.claude/agents/implementer.md +2 -0
  185. package/releases/0.48.0/surfaces/d1/tree/.claude/patterns.md +8 -0
  186. package/releases/0.48.0/surfaces/d1/tree/CLAUDE.md +2 -0
  187. package/releases/0.48.0/surfaces/db/tree/.claude/agents/architect.md +5 -0
  188. package/releases/0.48.0/surfaces/db/tree/.claude/agents/dba.md +54 -0
  189. package/releases/0.48.0/surfaces/db/tree/.claude/agents/devops.md +5 -0
  190. package/releases/0.48.0/surfaces/db/tree/.claude/agents/implementer.md +2 -0
  191. package/releases/0.48.0/surfaces/db/tree/.claude/agents/integration-tester.md +10 -0
  192. package/releases/0.48.0/surfaces/db/tree/.claude/agents/planner.md +2 -0
  193. package/releases/0.48.0/surfaces/db/tree/.claude/agents/reviewer.md +22 -0
  194. package/releases/0.48.0/surfaces/db/tree/.claude/agents/secops.md +2 -0
  195. package/releases/0.48.0/surfaces/db/tree/.claude/agents-overview.md +5 -0
  196. package/releases/0.48.0/surfaces/db/tree/.claude/graph.md +8 -0
  197. package/releases/0.48.0/surfaces/db/tree/.claude/patterns.md +22 -0
  198. package/releases/0.48.0/surfaces/db/tree/.claude/pipeline.md +13 -0
  199. package/releases/0.48.0/surfaces/db/tree/.claude/retrieval.md +5 -0
  200. package/releases/0.48.0/surfaces/db/tree/.claude/router.md +4 -0
  201. package/releases/0.48.0/surfaces/db/tree/CLAUDE.md +17 -0
  202. package/releases/0.48.0/surfaces/drizzle/tree/.claude/agents/dba.md +9 -0
  203. package/releases/0.48.0/surfaces/drizzle/tree/.claude/agents/devops.md +5 -0
  204. package/releases/0.48.0/surfaces/drizzle/tree/.claude/agents/implementer.md +2 -0
  205. package/releases/0.48.0/surfaces/drizzle/tree/.claude/patterns.md +7 -0
  206. package/releases/0.48.0/surfaces/edge-cf/tree/.claude/agents/architect.md +14 -0
  207. package/releases/0.48.0/surfaces/edge-cf/tree/.claude/agents/dba.md +2 -0
  208. package/releases/0.48.0/surfaces/edge-cf/tree/.claude/agents/devops.md +29 -0
  209. package/releases/0.48.0/surfaces/edge-cf/tree/.claude/agents/implementer.md +14 -0
  210. package/releases/0.48.0/surfaces/edge-cf/tree/.claude/agents/integration-tester.md +11 -0
  211. package/releases/0.48.0/surfaces/edge-cf/tree/.claude/agents/qa.md +3 -0
  212. package/releases/0.48.0/surfaces/edge-cf/tree/.claude/agents/reviewer.md +8 -0
  213. package/releases/0.48.0/surfaces/edge-cf/tree/.claude/agents/secops.md +8 -0
  214. package/releases/0.48.0/surfaces/edge-cf/tree/.claude/patterns.md +17 -0
  215. package/releases/0.48.0/surfaces/edge-cf/tree/.claude/retrieval.md +8 -0
  216. package/releases/0.48.0/surfaces/edge-cf/tree/CLAUDE.md +27 -0
  217. package/releases/0.48.0/surfaces/frontend/tree/.claude/agents/architect.md +20 -0
  218. package/releases/0.48.0/surfaces/frontend/tree/.claude/agents/devops.md +28 -0
  219. package/releases/0.48.0/surfaces/frontend/tree/.claude/agents/implementer.md +25 -0
  220. package/releases/0.48.0/surfaces/frontend/tree/.claude/agents/qa.md +17 -0
  221. package/releases/0.48.0/surfaces/frontend/tree/.claude/agents/reviewer.md +56 -0
  222. package/releases/0.48.0/surfaces/frontend/tree/.claude/patterns.md +8 -0
  223. package/releases/0.48.0/surfaces/frontend/tree/.claude/retrieval.md +2 -0
  224. package/releases/0.48.0/surfaces/frontend/tree/.claude/router.md +14 -0
  225. package/releases/0.48.0/surfaces/frontend/tree/CLAUDE.md +5 -0
  226. package/releases/0.48.0/surfaces/integrations/tree/.claude/agents/architect.md +16 -0
  227. package/releases/0.48.0/surfaces/integrations/tree/.claude/agents/implementer.md +12 -0
  228. package/releases/0.48.0/surfaces/integrations/tree/.claude/agents/integration-tester.md +20 -0
  229. package/releases/0.48.0/surfaces/integrations/tree/.claude/agents/planner.md +2 -0
  230. package/releases/0.48.0/surfaces/integrations/tree/.claude/agents/reviewer.md +21 -0
  231. package/releases/0.48.0/surfaces/integrations/tree/.claude/agents/secops.md +2 -0
  232. package/releases/0.48.0/surfaces/integrations/tree/.claude/agents-overview.md +8 -0
  233. package/releases/0.48.0/surfaces/integrations/tree/.claude/graph.md +10 -0
  234. package/releases/0.48.0/surfaces/integrations/tree/.claude/patterns.md +38 -0
  235. package/releases/0.48.0/surfaces/integrations/tree/.claude/pipeline.md +16 -0
  236. package/releases/0.48.0/surfaces/integrations/tree/.claude/retrieval.md +16 -0
  237. package/releases/0.48.0/surfaces/integrations/tree/.claude/router.md +6 -0
  238. package/releases/0.48.0/surfaces/integrations/tree/CLAUDE.md +17 -0
  239. package/releases/0.48.0/surfaces/money/tree/.claude/agents/architect.md +12 -0
  240. package/releases/0.48.0/surfaces/money/tree/.claude/agents/dba.md +14 -0
  241. package/releases/0.48.0/surfaces/money/tree/.claude/agents/implementer.md +11 -0
  242. package/releases/0.48.0/surfaces/money/tree/.claude/agents/integration-tester.md +3 -0
  243. package/releases/0.48.0/surfaces/money/tree/.claude/agents/reviewer.md +23 -0
  244. package/releases/0.48.0/surfaces/money/tree/.claude/agents/secops.md +5 -0
  245. package/releases/0.48.0/surfaces/money/tree/.claude/agents/solidity-auditor.md +4 -0
  246. package/releases/0.48.0/surfaces/money/tree/.claude/agents/solidity-dev.md +4 -0
  247. package/releases/0.48.0/surfaces/money/tree/.claude/graph.md +2 -0
  248. package/releases/0.48.0/surfaces/money/tree/.claude/patterns.md +49 -0
  249. package/releases/0.48.0/surfaces/money/tree/.claude/pipeline.md +2 -0
  250. package/releases/0.48.0/surfaces/money/tree/.claude/retrieval.md +2 -0
  251. package/releases/0.48.0/surfaces/money/tree/CLAUDE.md +11 -0
  252. package/releases/0.48.0/surfaces/pii/tree/.claude/agents/dba.md +2 -0
  253. package/releases/0.48.0/surfaces/pii/tree/.claude/agents/devops.md +8 -0
  254. package/releases/0.48.0/surfaces/pii/tree/.claude/agents/reviewer.md +8 -0
  255. package/releases/0.48.0/surfaces/pii/tree/.claude/agents/secops.md +2 -0
  256. package/releases/0.48.0/surfaces/pii/tree/.claude/agents/solidity-auditor.md +5 -0
  257. package/releases/0.48.0/surfaces/pii/tree/CLAUDE.md +5 -0
  258. package/releases/0.48.0/surfaces/prisma/tree/.claude/agents/architect.md +2 -0
  259. package/releases/0.48.0/surfaces/prisma/tree/.claude/agents/dba.md +42 -0
  260. package/releases/0.48.0/surfaces/prisma/tree/.claude/agents/devops.md +11 -0
  261. package/releases/0.48.0/surfaces/prisma/tree/.claude/agents/implementer.md +2 -0
  262. package/releases/0.48.0/surfaces/prisma/tree/.claude/agents/integration-tester.md +2 -0
  263. package/releases/0.48.0/surfaces/prisma/tree/.claude/agents/reviewer.md +2 -0
  264. package/releases/0.48.0/surfaces/prisma/tree/.claude/patterns.md +15 -0
  265. package/releases/0.48.0/surfaces/prisma/tree/CLAUDE.md +5 -0
  266. package/src/commands/check.mjs +20 -4
  267. package/src/commands/compose.mjs +3 -3
  268. package/src/commands/gate.mjs +53 -2
  269. package/src/commands/init.mjs +14 -5
  270. package/src/commands/upgrade.mjs +2 -2
  271. package/src/gate.mjs +58 -19
  272. package/src/surfaces.mjs +19 -3
@@ -21,7 +21,7 @@ import { join, resolve } from 'node:path';
21
21
  import { REQUIRES, SLOT, byVersion, closedGate, composedPaths, composeProject, defaultedSlots, layerRootFor, projectOwned, walk } from './compose.mjs';
22
22
  import { owedDocuments } from './check.mjs';
23
23
  import { PLACEHOLDER, defaultVocabulary } from '../vocabulary.mjs';
24
- import { DETECTABLE, NEEDS } from '../surfaces.mjs';
24
+ import { DETECTABLE, missingNeeds } from '../surfaces.mjs';
25
25
  import { bold, dim, green, pink } from '../look.mjs';
26
26
 
27
27
  /**
@@ -35,11 +35,13 @@ const QUESTIONS = {
35
35
  'external-api': 'Does it depend on anything whose behavior it does not define?',
36
36
  db: 'Does it own persistent data of its own?',
37
37
  prisma: 'Does it reach that data through Prisma?',
38
+ drizzle: 'Does it reach that data through Drizzle?',
38
39
  money: 'Does it conserve and distribute an amount — money in equals money out plus retained?',
39
40
  pii: 'Does it hold data about people that would harm someone specific if it leaked?',
40
41
  integrations: 'Does it depend on anything whose behavior it does not define?',
41
42
  frontend: 'Does it render a screen a person looks at?',
42
43
  'edge-cf': 'Does it run on Cloudflare Workers or Pages?',
44
+ d1: 'Does it keep that data in Cloudflare D1?',
43
45
  // Not "does it use blockchain" — that is a technology, and a technology is not a reason to
44
46
  // gate anything. What this surface costs is immutability: code that ships cannot be edited.
45
47
  blockchain: 'Does it deploy code that cannot be changed once it is live?',
@@ -59,7 +61,7 @@ function questionFor(surface) {
59
61
  * The order the interview asks in: the surfaces most projects have first, the rare ones last. Asked
60
62
  * alphabetically, the first question a web app met was whether it deploys immutable code.
61
63
  */
62
- const ASK_ORDER = ['db', 'prisma', 'frontend', 'integrations', 'pii', 'money', 'edge-cf', 'blockchain'];
64
+ const ASK_ORDER = ['db', 'prisma', 'drizzle', 'frontend', 'integrations', 'pii', 'money', 'edge-cf', 'd1', 'blockchain'];
63
65
 
64
66
  /**
65
67
  * The surfaces a core offers, in the order the interview asks them; one it does not know goes last.
@@ -216,14 +218,21 @@ async function interview(available, matched, impacts) {
216
218
  const scope = lines.join(' ');
217
219
 
218
220
  const order = available;
219
- console.log(`\n ${strong('Surfaces')} — ${order.length} yes-or-no questions, one per surface.`);
221
+ console.log(`\n ${strong('Surfaces')} — up to ${order.length} yes-or-no questions, one per surface; a stack comes only after a yes to what it needs.`);
220
222
  console.log(' A surface is a part of the harness only some projects need: its rules, its checks, sometimes a');
221
223
  console.log(' whole role. Answer for what the project does today; one can be added later in .nina/profile.json.\n');
222
224
  const surfaces = [];
225
+ let asked = 0;
223
226
  for (const [n, s] of order.entries()) {
224
227
  // A stack is asked about only where its concern was answered yes: asked whether data it does not
225
228
  // own goes through Prisma, a project has nothing true to answer.
226
- if (NEEDS[s] && !surfaces.includes(NEEDS[s])) continue;
229
+ if (missingNeeds(s, surfaces).length > 0) continue;
230
+ // Counted by what is asked, not by place in the list: numbered by place, a no to the database read
231
+ // 1/10 then 4/10, and the header promised ten questions to someone asked seven. The total is what is
232
+ // asked so far plus what can still be, so a no shrinks it; the last question is n/n while the order
233
+ // ends with a surface that needs nothing, as it does.
234
+ asked += 1;
235
+ const total = asked + order.slice(n + 1).filter((t) => missingNeeds(t, [...surfaces, ...order.slice(n)]).length === 0).length;
227
236
  const i = impacts[s];
228
237
  const reason = matched.find((d) => d.surface === s)?.why;
229
238
  // What a yes brings, in what a person would recognise: roles, rules, agents. The count of
@@ -233,7 +242,7 @@ async function interview(available, matched, impacts) {
233
242
  ...(i.rules ? [`${i.rules} hard rule${i.rules > 1 ? 's' : ''}`] : []),
234
243
  ...(i.agents.length ? [`changes to ${i.agents.length} agent${i.agents.length > 1 ? 's' : ''}`] : []),
235
244
  ];
236
- console.log(` ${faint(`${n + 1}/${order.length}`)} ${strong(s)}`);
245
+ console.log(` ${faint(`${asked}/${total}`)} ${strong(s)}`);
237
246
  console.log(` ${questionFor(s)}`);
238
247
  console.log(faint(` if yes: ${brings.length ? brings.join(' · ') : `guidance in ${i.fragments} places`}`));
239
248
  if (reason) console.log(found(` already here: ${reason}`));
@@ -15,7 +15,7 @@ import { describeMove, HARNESS, interruptedMove, movedFrom, moveJournal, readPro
15
15
  import { existsSync, lstatSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from 'node:fs';
16
16
  import { dirname, join, resolve } from 'node:path';
17
17
  import { REMOVED, composeProject, composedPaths, defaultedSlots, layerRootFor, walk } from './compose.mjs';
18
- import { NEEDS, detected } from '../surfaces.mjs';
18
+ import { detected, missingNeeds } from '../surfaces.mjs';
19
19
  import { filledSlots, projectSlots, referencedVocabulary } from './check.mjs';
20
20
  import { EXPECT_ENV } from '../expected.mjs';
21
21
  import { closeAnswered } from './learn.mjs';
@@ -297,7 +297,7 @@ export async function upgrade(argv, ctx) {
297
297
  // them in silence: the rules that were in its specs yesterday are not there after the move.
298
298
  const offeredBefore = (await surfacesIn(from.dir));
299
299
  const offered = detected(await walk(target)).filter(
300
- (d) => available.includes(d.surface) && !offeredBefore.includes(d.surface) && !surfaces.includes(d.surface) && (!NEEDS[d.surface] || kept.includes(NEEDS[d.surface])),
300
+ (d) => available.includes(d.surface) && !offeredBefore.includes(d.surface) && !surfaces.includes(d.surface) && missingNeeds(d.surface, kept).length === 0,
301
301
  );
302
302
 
303
303
  const [vocabBefore, vocabAfter] = [
package/src/gate.mjs CHANGED
@@ -280,11 +280,13 @@ function append(path, entry) {
280
280
  * @param {object[]} entries - The ledger, oldest first.
281
281
  * @param {ReturnType<typeof loopEdges>} loops - The capped loop-back edges.
282
282
  * @param {Map<string, Set<string>>} [forward] - Stage → the sources that hand passing work on to it.
283
- * @returns {{effect: (to: string) => {rounds: object[]}, rounds: object[]}}
283
+ * @returns {{effect: (to: string) => {rounds: object[]}, rounds: object[], open: object[], waiting: object[]}}
284
284
  * A round is `{source, target, token, round, max, edgeRound, ceiling, agents}`, plus `issue` (the id
285
285
  * that decides it) and `issues` (every id with its count) when it was counted by issue.
286
286
  * `effect` says what a dispatch to a stage would make now, without making it; `rounds` is every round
287
- * the recorded dispatches made.
287
+ * the recorded dispatches made; `open` each loop still counted, with whether a pass already closes it
288
+ * (`closing`), the stages a dispatch to which would (`targets`) and the stages whose pass would (`onward`);
289
+ * `waiting` each loop-back no fix has acted on yet.
288
290
  */
289
291
  export function replay(entries, loops, forward = new Map()) {
290
292
  // When each dispatch went out. A foreground dispatch's `dispatch` entry is written after the agent
@@ -329,15 +331,23 @@ export function replay(entries, loops, forward = new Map()) {
329
331
  for (const map of [streak, grace]) for (const key of [...map.keys()]) if (key.startsWith(`${source}|`)) map.delete(key);
330
332
  };
331
333
 
334
+ /**
335
+ * A source's waiting verdicts, settled: the rejections no later review of a fix cancelled, and whether a pass
336
+ * closes its loops — one that began after the latest fix, with no rejection running beside it.
337
+ */
338
+ const settle = (source, batch) => {
339
+ const passes = batch.filter((v) => !isLoopBack(v.verdict));
340
+ const live = batch.filter((v) => isLoopBack(v.verdict) && !passes.some((p) => p.launch > v.at && fixBetween(source, v.at, p.launch)));
341
+ return { live, closes: passes.some((p) => p.launch > (lastFix.get(source) ?? -1) && !live.some((v) => v.launch < p.at)) };
342
+ };
343
+
332
344
  const effect = (to, at) => {
333
345
  const rounds = [];
334
346
  const outcome = [];
335
347
  for (const [source, batch] of pending) {
336
348
  const byToken = loops.get(source);
337
349
  if (!byToken || batch.length === 0 || !targetsOf(source).has(to)) continue;
338
- const passes = batch.filter((v) => !isLoopBack(v.verdict));
339
- const live = batch.filter((v) => isLoopBack(v.verdict) && !passes.some((p) => p.launch > v.at && fixBetween(source, v.at, p.launch)));
340
- const closes = passes.some((p) => p.launch > (lastFix.get(source) ?? -1) && !live.some((v) => v.launch < p.at));
350
+ const { live, closes } = settle(source, batch);
341
351
  const routed = live.filter((v) => byToken.get(v.verdict)?.has(to));
342
352
  const fresh = routed.filter((v) => {
343
353
  const last = streak.get(`${source}|${v.verdict}`);
@@ -434,13 +444,18 @@ export function replay(entries, loops, forward = new Map()) {
434
444
  });
435
445
  // What is open when the replay ends: each loop with its rounds, the rounds the owner's replies gave it and the
436
446
  // issues it counted by, and each loop-back no fix has acted on yet — what a compaction takes from the orchestrator.
447
+ // A loop whose source passed after the latest fix is closed by the next dispatch it could act on, and until then
448
+ // is still in the count; it says so, and what would close each of the others. Listed as open, three loops
449
+ // approved the evening before a compaction were handed back as capped, and the orchestrator went looking for why.
437
450
  const open = [...streak.entries()]
438
451
  .filter(([key]) => key.split('|').length === 2)
439
452
  .map(([key, s]) => {
440
453
  const [source, token] = key.split('|');
441
454
  const cap = Math.max(0, ...(loops.get(source)?.get(token)?.values() ?? []));
442
455
  const issues = [...streak.keys()].filter((k) => k.startsWith(`${key}|`)).map((k) => k.slice(key.length + 1));
443
- return { source, token, rounds: s.n, cap, given: grace.get(key) ?? 0, issues };
456
+ const closing = settle(source, pending.get(source) ?? []).closes;
457
+ const onward = [...forward].filter(([, sources]) => sources.has(source)).map(([stage]) => stage);
458
+ return { source, token, rounds: s.n, cap, given: grace.get(key) ?? 0, issues, closing, targets: [...targetsOf(source)], onward };
444
459
  });
445
460
  const waiting = [...pending.entries()].flatMap(([source, batch]) => batch.filter((v) => isLoopBack(v.verdict)).map((v) => ({ source, verdict: v.verdict, issues: v.issues ?? [] })));
446
461
  return { effect: (to) => effect(to, entries.length), rounds: made, open, waiting };
@@ -671,32 +686,56 @@ function onPre(input, project, path, at) {
671
686
  return confirmation(worst);
672
687
  }
673
688
 
689
+ /** Stages as a sentence lists them: `qa`, `implementer or architect`, `a, b or c`. */
690
+ const either = (stages) => (stages.length < 2 ? stages.join('') : `${stages.slice(0, -1).join(', ')} or ${stages.at(-1)}`);
691
+
674
692
  /**
675
- * What the gate hands the orchestrator after its conversation was compacted: the loops still open and the
676
- * loop-backs waiting on a fix, the latest dispatches, where the checkout stands, and the two documents to read
677
- * again. The graph and the router are read once, at a session's start, and a compaction drops them with every
678
- * report; the router told the orchestrator to write "round 2 of max 2" in a dispatch so "you after a
679
- * compaction" could see it, and after a compaction it sees only a summary.
693
+ * What a session's ledger says of its loops, a line each: every loop still counted, and what would close it;
694
+ * the loop-backs no fix has acted on yet; and the latest dispatches. It is what a compaction hands the
695
+ * orchestrator and what `nina gate --status` prints, so the two cannot disagree.
680
696
  *
681
697
  * @param {object} project - `loadProject`'s.
682
- * @param {string} path - The session's ledger.
683
- * @param {string} root - The project.
684
- * @returns {object}
698
+ * @param {object[]} entries - The session's ledger, oldest first.
699
+ * @returns {{lines: string[], open: number, closing: number, waiting: number}} The lines; the loops open, the
700
+ * loops a pass already settled, whose count the next dispatch drops, and the loop-backs waiting on a fix.
685
701
  */
686
- function afterCompaction(project, path, root) {
687
- const entries = readLedger(path);
702
+ export function loopState(project, entries) {
688
703
  const { open, waiting } = replay(entries, project.loops, project.forward);
689
- const lines = ['The conversation was compacted. What the NINA loop gate kept of this session:'];
704
+ const lines = [];
690
705
  for (const l of open) {
706
+ const count =
707
+ `${l.source} ${l.token} — ${l.rounds} round(s), capped at ${l.cap}${l.given ? ` and ${l.given} more from the owner's replies` : ''}` +
708
+ (l.issues.length ? `, issues ${l.issues.join(', ')}` : '');
709
+ const fix = waiting.some((w) => w.source === l.source) ? 'the fix it waits on' : 'the latest fix';
691
710
  lines.push(
692
- `- open loop: ${l.source} ${l.token} — ${l.rounds} round(s), capped at ${l.cap}${l.given ? ` and ${l.given} more from the owner's replies` : ''}` +
693
- (l.issues.length ? `, issues ${l.issues.join(', ')}` : ''),
711
+ l.closing
712
+ ? `- passed after its latest fix: ${count}. Those rounds are settled, and the gate drops them at the next dispatch to ${either(l.targets)}`
713
+ : `- open loop: ${count}. It closes when a ${l.source} launched after ${fix} passes with no rejection beside it` +
714
+ (l.onward.length ? `, or when ${either(l.onward)} passes, sent out after the ${l.source} last reported` : ''),
694
715
  );
695
716
  }
696
717
  for (const w of waiting) lines.push(`- waiting on a fix: ${w.source} ${w.verdict}${w.issues.length ? `, issues ${w.issues.join(', ')}` : ''}`);
697
718
  if (open.length === 0 && waiting.length === 0) lines.push('- no loop is open');
698
719
  const dispatched = entries.filter((e) => e.k === 'dispatch' && e.role).slice(-4);
699
720
  if (dispatched.length) lines.push(`- the latest dispatches: ${dispatched.map((e) => e.role).join(', ')}, the newest at ${String(dispatched.at(-1).at ?? '').slice(11, 16)} UTC`);
721
+ const closing = open.filter((l) => l.closing).length;
722
+ return { lines, open: open.length - closing, closing, waiting: waiting.length };
723
+ }
724
+
725
+ /**
726
+ * What the gate hands the orchestrator after its conversation was compacted: the loops still open and the
727
+ * loop-backs waiting on a fix, the latest dispatches, where the checkout stands, and the two documents to read
728
+ * again. The graph and the router are read once, at a session's start, and a compaction drops them with every
729
+ * report; the router told the orchestrator to write "round 2 of max 2" in a dispatch so "you after a
730
+ * compaction" could see it, and after a compaction it sees only a summary.
731
+ *
732
+ * @param {object} project - `loadProject`'s.
733
+ * @param {string} path - The session's ledger.
734
+ * @param {string} root - The project.
735
+ * @returns {object}
736
+ */
737
+ function afterCompaction(project, path, root) {
738
+ const lines = ['The conversation was compacted. What the NINA loop gate kept of this session:', ...loopState(project, readLedger(path)).lines];
700
739
  const git = (...args) => spawnSync('git', ['-C', root, ...args], { encoding: 'utf8', timeout: 2000 }).stdout?.trim() ?? '';
701
740
  const branch = git('rev-parse', '--abbrev-ref', 'HEAD');
702
741
  const last = git('log', '-1', '--format=%h %s');
package/src/surfaces.mjs CHANGED
@@ -12,17 +12,33 @@
12
12
  * `init`, `check` and `upgrade` all read this, so a surface's evidence and its prerequisite are stated once.
13
13
  */
14
14
 
15
+ /** A drizzle-kit config, which a Drizzle project usually has and nothing else names so. */
16
+ const DRIZZLE_CONFIG = /(^|\/)drizzle\.config\.[cm]?[jt]s$/;
17
+
15
18
  /** Surfaces a repository reveals by its files. The rest are claims about the domain. */
16
19
  export const DETECTABLE = [
17
- { surface: 'db', why: 'a Prisma schema', test: (f) => f.some((p) => p.endsWith('schema.prisma')) },
20
+ { surface: 'db', why: 'a Prisma schema or a drizzle-kit config', test: (f) => f.some((p) => p.endsWith('schema.prisma') || DRIZZLE_CONFIG.test(p)) },
18
21
  { surface: 'prisma', why: 'a Prisma schema', test: (f) => f.some((p) => p.endsWith('schema.prisma')) },
22
+ { surface: 'drizzle', why: 'a drizzle-kit config', test: (f) => f.some((p) => DRIZZLE_CONFIG.test(p)) },
19
23
  { surface: 'edge-cf', why: 'a wrangler config', test: (f) => f.some((p) => /(^|\/)wrangler\.(toml|jsonc?)$/.test(p)) },
20
24
  { surface: 'frontend', why: 'a Vite config', test: (f) => f.some((p) => /(^|\/)vite\.config\.[cm]?[jt]s$/.test(p)) },
21
25
  { surface: 'blockchain', why: 'a Foundry or Hardhat config', test: (f) => f.some((p) => /(^|\/)(foundry\.toml|hardhat\.config\.[cm]?[jt]s)$/.test(p)) },
22
26
  ];
23
27
 
24
- /** A stack surface, and the concern it is a stack of: declared without it, its rules have nowhere to land. */
25
- export const NEEDS = { prisma: 'db' };
28
+ /**
29
+ * A stack surface, and every surface it is a stack of: declared without one of them, its rules have nowhere
30
+ * to land. Most stacks need one concern; an engine that only runs on one platform needs the platform too.
31
+ */
32
+ export const NEEDS = { prisma: ['db'], drizzle: ['db'], d1: ['db', 'edge-cf'] };
33
+
34
+ /**
35
+ * What a stack needs that a profile does not declare — empty for a surface that is not a stack.
36
+ *
37
+ * @param {string} surface - The surface asked about.
38
+ * @param {string[]} declared - The surfaces declared, or answered yes so far.
39
+ * @returns {string[]}
40
+ */
41
+ export const missingNeeds = (surface, declared) => (NEEDS[surface] ?? []).filter((need) => !declared.includes(need));
26
42
 
27
43
  /**
28
44
  * The surfaces a project's files reveal, with the evidence for each.