gina 0.5.2 → 0.5.3

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 (475) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/README.md +9 -4
  3. package/ROADMAP.md +1 -0
  4. package/bin/cli +20 -5
  5. package/bin/cmd +34 -1
  6. package/bin/gina-container +33 -11
  7. package/framework/v0.5.3/VERSION +1 -0
  8. package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/js/gina.js +5 -2
  9. package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +1 -1
  10. package/framework/v0.5.3/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  11. package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  12. package/framework/{v0.5.2 → v0.5.3}/core/config.js +9 -0
  13. package/framework/{v0.5.2 → v0.5.3}/core/controller/controller.js +32 -1
  14. package/framework/{v0.5.2 → v0.5.3}/core/controller/controller.render-nunjucks-async.js +14 -0
  15. package/framework/{v0.5.2 → v0.5.3}/core/controller/controller.render-nunjucks.js +14 -0
  16. package/framework/{v0.5.2 → v0.5.3}/core/controller/controller.render-swig-async.js +14 -0
  17. package/framework/{v0.5.2 → v0.5.3}/core/controller/controller.render-swig.js +15 -0
  18. package/framework/{v0.5.2 → v0.5.3}/core/gna.js +8 -1
  19. package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/storage/src/main.js +5 -2
  20. package/framework/{v0.5.2 → v0.5.3}/core/server.isaac.js +4 -1
  21. package/framework/{v0.5.2 → v0.5.3}/core/server.js +4 -1
  22. package/framework/{v0.5.2 → v0.5.3}/lib/cmd/port/help.txt +11 -0
  23. package/framework/{v0.5.2 → v0.5.3}/lib/cmd/port/set.js +45 -2
  24. package/framework/{v0.5.2 → v0.5.3}/lib/generator/index.js +18 -3
  25. package/framework/{v0.5.2 → v0.5.3}/lib/proc.js +4 -1
  26. package/framework/{v0.5.2 → v0.5.3}/lib/state.js +26 -4
  27. package/framework/{v0.5.2 → v0.5.3}/package.json +1 -1
  28. package/gna.js +4 -4
  29. package/llms.txt +14 -2
  30. package/package.json +3 -3
  31. package/script/check_roadmap_consistency.js +56 -7
  32. package/utils/helper.js +22 -0
  33. package/framework/v0.5.2/VERSION +0 -1
  34. package/framework/v0.5.2/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  35. /package/framework/{v0.5.2 → v0.5.3}/AUTHORS +0 -0
  36. /package/framework/{v0.5.2 → v0.5.3}/LICENSE +0 -0
  37. /package/framework/{v0.5.2 → v0.5.3}/core/asset/html/nolayout.html +0 -0
  38. /package/framework/{v0.5.2 → v0.5.3}/core/asset/html/static.html +0 -0
  39. /package/framework/{v0.5.2 → v0.5.3}/core/asset/img/android-chrome-192x192.png +0 -0
  40. /package/framework/{v0.5.2 → v0.5.3}/core/asset/img/android-chrome-512x512.png +0 -0
  41. /package/framework/{v0.5.2 → v0.5.3}/core/asset/img/apple-touch-icon.png +0 -0
  42. /package/framework/{v0.5.2 → v0.5.3}/core/asset/img/favicon-16x16.png +0 -0
  43. /package/framework/{v0.5.2 → v0.5.3}/core/asset/img/favicon-32x32.png +0 -0
  44. /package/framework/{v0.5.2 → v0.5.3}/core/asset/img/favicon.ico +0 -0
  45. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/README.md +0 -0
  46. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  47. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  48. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  49. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  50. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  51. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  52. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  53. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  54. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  55. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  56. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  57. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  58. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  59. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  60. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  61. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  62. /package/framework/{v0.5.2 → v0.5.3}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  63. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/ai/index.js +0 -0
  64. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/ai/lib/connector.js +0 -0
  65. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/couchbase/index.js +0 -0
  66. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/couchbase/lib/connector.js +0 -0
  67. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  68. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  69. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/couchbase/lib/n1ql.js +0 -0
  70. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/couchbase/lib/session-store.js +0 -0
  71. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  72. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  73. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/mongodb/index.js +0 -0
  74. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/mongodb/lib/connector.js +0 -0
  75. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/mongodb/lib/pipeline-loader.js +0 -0
  76. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/mongodb/lib/session-store.js +0 -0
  77. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/mysql/index.js +0 -0
  78. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/mysql/lib/connector.js +0 -0
  79. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/postgresql/index.js +0 -0
  80. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/postgresql/lib/connector.js +0 -0
  81. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/redis/index.js +0 -0
  82. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/redis/lib/session-store.js +0 -0
  83. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/scylladb/index.js +0 -0
  84. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/scylladb/lib/connector.js +0 -0
  85. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/scylladb/lib/session-store.js +0 -0
  86. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/sql-parser.js +0 -0
  87. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/sqlite/index.js +0 -0
  88. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/sqlite/lib/connector.js +0 -0
  89. /package/framework/{v0.5.2 → v0.5.3}/core/connectors/sqlite/lib/session-store.js +0 -0
  90. /package/framework/{v0.5.2 → v0.5.3}/core/content.encoding +0 -0
  91. /package/framework/{v0.5.2 → v0.5.3}/core/controller/controller.framework.js +0 -0
  92. /package/framework/{v0.5.2 → v0.5.3}/core/controller/controller.render-json.js +0 -0
  93. /package/framework/{v0.5.2 → v0.5.3}/core/controller/controller.render-stream.js +0 -0
  94. /package/framework/{v0.5.2 → v0.5.3}/core/controller/controller.render-v1.js +0 -0
  95. /package/framework/{v0.5.2 → v0.5.3}/core/controller/index.js +0 -0
  96. /package/framework/{v0.5.2 → v0.5.3}/core/controller/inspector-window-emit.js +0 -0
  97. /package/framework/{v0.5.2 → v0.5.3}/core/deps/busboy-1.6.0/LICENSE +0 -0
  98. /package/framework/{v0.5.2 → v0.5.3}/core/deps/busboy-1.6.0/README.md +0 -0
  99. /package/framework/{v0.5.2 → v0.5.3}/core/deps/busboy-1.6.0/lib/index.js +0 -0
  100. /package/framework/{v0.5.2 → v0.5.3}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
  101. /package/framework/{v0.5.2 → v0.5.3}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
  102. /package/framework/{v0.5.2 → v0.5.3}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
  103. /package/framework/{v0.5.2 → v0.5.3}/core/deps/busboy-1.6.0/package.json +0 -0
  104. /package/framework/{v0.5.2 → v0.5.3}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
  105. /package/framework/{v0.5.2 → v0.5.3}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
  106. /package/framework/{v0.5.2 → v0.5.3}/core/deps/streamsearch-1.1.0/package.json +0 -0
  107. /package/framework/{v0.5.2 → v0.5.3}/core/dev/index.js +0 -0
  108. /package/framework/{v0.5.2 → v0.5.3}/core/dev/lib/class.js +0 -0
  109. /package/framework/{v0.5.2 → v0.5.3}/core/dev/lib/factory.js +0 -0
  110. /package/framework/{v0.5.2 → v0.5.3}/core/dev/lib/tools.js +0 -0
  111. /package/framework/{v0.5.2 → v0.5.3}/core/locales/README.md +0 -0
  112. /package/framework/{v0.5.2 → v0.5.3}/core/locales/currency.json +0 -0
  113. /package/framework/{v0.5.2 → v0.5.3}/core/locales/dist/language/en.json +0 -0
  114. /package/framework/{v0.5.2 → v0.5.3}/core/locales/dist/language/fr.json +0 -0
  115. /package/framework/{v0.5.2 → v0.5.3}/core/locales/dist/region/en.json +0 -0
  116. /package/framework/{v0.5.2 → v0.5.3}/core/locales/dist/region/fr.json +0 -0
  117. /package/framework/{v0.5.2 → v0.5.3}/core/locales/index.js +0 -0
  118. /package/framework/{v0.5.2 → v0.5.3}/core/mime.types +0 -0
  119. /package/framework/{v0.5.2 → v0.5.3}/core/model/entity.js +0 -0
  120. /package/framework/{v0.5.2 → v0.5.3}/core/model/index.js +0 -0
  121. /package/framework/{v0.5.2 → v0.5.3}/core/model/template/entityFactory.js +0 -0
  122. /package/framework/{v0.5.2 → v0.5.3}/core/model/template/index.js +0 -0
  123. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/README.md +0 -0
  124. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/index.js +0 -0
  125. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/csrf/README.md +0 -0
  126. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/csrf/package.json +0 -0
  127. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/csrf/src/main.js +0 -0
  128. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/README.md +0 -0
  129. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/coep/README.md +0 -0
  130. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/coep/package.json +0 -0
  131. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/coep/src/main.js +0 -0
  132. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/coop/README.md +0 -0
  133. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/coop/package.json +0 -0
  134. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/coop/src/main.js +0 -0
  135. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/corp/README.md +0 -0
  136. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/corp/package.json +0 -0
  137. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/corp/src/main.js +0 -0
  138. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/csp/README.md +0 -0
  139. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/csp/package.json +0 -0
  140. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/csp/src/main.js +0 -0
  141. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/hide-powered-by/README.md +0 -0
  142. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/hide-powered-by/package.json +0 -0
  143. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/hide-powered-by/src/main.js +0 -0
  144. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/hsts/README.md +0 -0
  145. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/hsts/package.json +0 -0
  146. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/hsts/src/main.js +0 -0
  147. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/origin-agent-cluster/README.md +0 -0
  148. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/origin-agent-cluster/package.json +0 -0
  149. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/origin-agent-cluster/src/main.js +0 -0
  150. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/package.json +0 -0
  151. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/referrer-policy/README.md +0 -0
  152. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/referrer-policy/package.json +0 -0
  153. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/referrer-policy/src/main.js +0 -0
  154. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/src/main.js +0 -0
  155. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-content-type-options/README.md +0 -0
  156. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-content-type-options/package.json +0 -0
  157. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-content-type-options/src/main.js +0 -0
  158. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-dns-prefetch-control/README.md +0 -0
  159. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-dns-prefetch-control/package.json +0 -0
  160. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-dns-prefetch-control/src/main.js +0 -0
  161. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-download-options/README.md +0 -0
  162. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-download-options/package.json +0 -0
  163. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-download-options/src/main.js +0 -0
  164. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-frame-options/README.md +0 -0
  165. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-frame-options/package.json +0 -0
  166. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-frame-options/src/main.js +0 -0
  167. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/README.md +0 -0
  168. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/package.json +0 -0
  169. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-permitted-cross-domain-policies/src/main.js +0 -0
  170. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-xss-protection/README.md +0 -0
  171. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-xss-protection/package.json +0 -0
  172. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/security-headers/x-xss-protection/src/main.js +0 -0
  173. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/session/README.md +0 -0
  174. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/session/package.json +0 -0
  175. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/session/src/main.js +0 -0
  176. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/storage/README.md +0 -0
  177. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/storage/build.json +0 -0
  178. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/storage/package.json +0 -0
  179. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/validator/README.md +0 -0
  180. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/validator/build.json +0 -0
  181. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/validator/package.json +0 -0
  182. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/validator/src/form-validator.js +0 -0
  183. /package/framework/{v0.5.2 → v0.5.3}/core/plugins/lib/validator/src/main.js +0 -0
  184. /package/framework/{v0.5.2 → v0.5.3}/core/router.js +0 -0
  185. /package/framework/{v0.5.2 → v0.5.3}/core/server.express.js +0 -0
  186. /package/framework/{v0.5.2 → v0.5.3}/core/status.codes +0 -0
  187. /package/framework/{v0.5.2 → v0.5.3}/core/template/_gitignore +0 -0
  188. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle/config/app.json +0 -0
  189. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  190. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle/config/routing.json +0 -0
  191. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle/config/settings.json +0 -0
  192. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  193. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle/config/templates.json +0 -0
  194. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  195. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  196. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  197. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  198. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle/index.js +0 -0
  199. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle/locales/en.json +0 -0
  200. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  201. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  202. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  203. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  204. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  205. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  206. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle_public/manifest.webmanifest +0 -0
  207. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle_public/readme.md +0 -0
  208. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle_public/sw.js +0 -0
  209. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  210. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  211. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  212. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  213. /package/framework/{v0.5.2 → v0.5.3}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  214. /package/framework/{v0.5.2 → v0.5.3}/core/template/command/gina.bat.tpl +0 -0
  215. /package/framework/{v0.5.2 → v0.5.3}/core/template/command/gina.tpl +0 -0
  216. /package/framework/{v0.5.2 → v0.5.3}/core/template/conf/env.json +0 -0
  217. /package/framework/{v0.5.2 → v0.5.3}/core/template/conf/manifest.json +0 -0
  218. /package/framework/{v0.5.2 → v0.5.3}/core/template/conf/package.json +0 -0
  219. /package/framework/{v0.5.2 → v0.5.3}/core/template/conf/settings.json +0 -0
  220. /package/framework/{v0.5.2 → v0.5.3}/core/template/conf/statics.json +0 -0
  221. /package/framework/{v0.5.2 → v0.5.3}/core/template/conf/templates.json +0 -0
  222. /package/framework/{v0.5.2 → v0.5.3}/core/template/error/client/json/401.json +0 -0
  223. /package/framework/{v0.5.2 → v0.5.3}/core/template/error/client/json/403.json +0 -0
  224. /package/framework/{v0.5.2 → v0.5.3}/core/template/error/client/json/404.json +0 -0
  225. /package/framework/{v0.5.2 → v0.5.3}/core/template/error/server/html/50x.html +0 -0
  226. /package/framework/{v0.5.2 → v0.5.3}/core/template/error/server/json/500.json +0 -0
  227. /package/framework/{v0.5.2 → v0.5.3}/core/template/error/server/json/503.json +0 -0
  228. /package/framework/{v0.5.2 → v0.5.3}/core/template/extensions/logger/config.json +0 -0
  229. /package/framework/{v0.5.2 → v0.5.3}/helpers/console.js +0 -0
  230. /package/framework/{v0.5.2 → v0.5.3}/helpers/context.js +0 -0
  231. /package/framework/{v0.5.2 → v0.5.3}/helpers/data/LICENSE +0 -0
  232. /package/framework/{v0.5.2 → v0.5.3}/helpers/data/README.md +0 -0
  233. /package/framework/{v0.5.2 → v0.5.3}/helpers/data/package.json +0 -0
  234. /package/framework/{v0.5.2 → v0.5.3}/helpers/data/src/main.js +0 -0
  235. /package/framework/{v0.5.2 → v0.5.3}/helpers/dateFormat.js +0 -0
  236. /package/framework/{v0.5.2 → v0.5.3}/helpers/index.js +0 -0
  237. /package/framework/{v0.5.2 → v0.5.3}/helpers/json/LICENSE +0 -0
  238. /package/framework/{v0.5.2 → v0.5.3}/helpers/json/README.md +0 -0
  239. /package/framework/{v0.5.2 → v0.5.3}/helpers/json/package.json +0 -0
  240. /package/framework/{v0.5.2 → v0.5.3}/helpers/json/src/main.js +0 -0
  241. /package/framework/{v0.5.2 → v0.5.3}/helpers/path.js +0 -0
  242. /package/framework/{v0.5.2 → v0.5.3}/helpers/plugins/README.md +0 -0
  243. /package/framework/{v0.5.2 → v0.5.3}/helpers/plugins/package.json +0 -0
  244. /package/framework/{v0.5.2 → v0.5.3}/helpers/plugins/src/api-error.js +0 -0
  245. /package/framework/{v0.5.2 → v0.5.3}/helpers/plugins/src/main.js +0 -0
  246. /package/framework/{v0.5.2 → v0.5.3}/helpers/prototypes.js +0 -0
  247. /package/framework/{v0.5.2 → v0.5.3}/helpers/task.js +0 -0
  248. /package/framework/{v0.5.2 → v0.5.3}/helpers/text.js +0 -0
  249. /package/framework/{v0.5.2 → v0.5.3}/lib/archiver/README.md +0 -0
  250. /package/framework/{v0.5.2 → v0.5.3}/lib/archiver/build.json +0 -0
  251. /package/framework/{v0.5.2 → v0.5.3}/lib/archiver/package.json +0 -0
  252. /package/framework/{v0.5.2 → v0.5.3}/lib/archiver/src/dep/jszip.min.js +0 -0
  253. /package/framework/{v0.5.2 → v0.5.3}/lib/archiver/src/main.js +0 -0
  254. /package/framework/{v0.5.2 → v0.5.3}/lib/async/package.json +0 -0
  255. /package/framework/{v0.5.2 → v0.5.3}/lib/async/src/main.js +0 -0
  256. /package/framework/{v0.5.2 → v0.5.3}/lib/cache/README.md +0 -0
  257. /package/framework/{v0.5.2 → v0.5.3}/lib/cache/build.json +0 -0
  258. /package/framework/{v0.5.2 → v0.5.3}/lib/cache/package.json +0 -0
  259. /package/framework/{v0.5.2 → v0.5.3}/lib/cache/src/main.js +0 -0
  260. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/aliases.json +0 -0
  261. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/add.js +0 -0
  262. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/arguments.json +0 -0
  263. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/build.js +0 -0
  264. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/copy.js +0 -0
  265. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/cp.js +0 -0
  266. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/help.js +0 -0
  267. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/help.txt +0 -0
  268. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/inc/name-rewrite.js +0 -0
  269. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/list.js +0 -0
  270. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/mcp-start.js +0 -0
  271. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/mcp.js +0 -0
  272. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/oas.js +0 -0
  273. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/openapi.js +0 -0
  274. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/remove.js +0 -0
  275. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/rename.js +0 -0
  276. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/restart.js +0 -0
  277. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/rm.js +0 -0
  278. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/start.js +0 -0
  279. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/status.js +0 -0
  280. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/bundle/stop.js +0 -0
  281. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/cache/stats.js +0 -0
  282. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/connector/add.js +0 -0
  283. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/connector/arguments.json +0 -0
  284. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/connector/help.js +0 -0
  285. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/connector/help.txt +0 -0
  286. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/connector/list.js +0 -0
  287. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/connector/migrate.js +0 -0
  288. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/connector/remove.js +0 -0
  289. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/connector/rm.js +0 -0
  290. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/env/add.js +0 -0
  291. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/env/get.js +0 -0
  292. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/env/help.js +0 -0
  293. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/env/help.txt +0 -0
  294. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/env/link-dev.js +0 -0
  295. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/env/list.js +0 -0
  296. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/env/remove.js +0 -0
  297. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/env/rm.js +0 -0
  298. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/env/set.js +0 -0
  299. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/env/unset.js +0 -0
  300. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/env/use.js +0 -0
  301. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/arguments.json +0 -0
  302. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/build.js +0 -0
  303. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/dot.js +0 -0
  304. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/get.js +0 -0
  305. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/help.js +0 -0
  306. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/help.txt +0 -0
  307. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/init.js +0 -0
  308. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/link-node-modules.js +0 -0
  309. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/link.js +0 -0
  310. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/msg.json +0 -0
  311. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/open.js +0 -0
  312. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/restart.js +0 -0
  313. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/set.js +0 -0
  314. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/start.js +0 -0
  315. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/status.js +0 -0
  316. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/stop.js +0 -0
  317. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/tail.js +0 -0
  318. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/update.js +0 -0
  319. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/framework/version.js +0 -0
  320. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/gina-dev.1.md +0 -0
  321. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/gina-framework.1.md +0 -0
  322. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/gina.1.md +0 -0
  323. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/helper.js +0 -0
  324. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/i18n/add.js +0 -0
  325. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/i18n/arguments.json +0 -0
  326. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/i18n/export.js +0 -0
  327. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/i18n/help.js +0 -0
  328. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/i18n/help.txt +0 -0
  329. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/i18n/import.js +0 -0
  330. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/i18n/scan.js +0 -0
  331. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/index.js +0 -0
  332. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/inspector/help.js +0 -0
  333. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/inspector/help.txt +0 -0
  334. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/inspector/open.js +0 -0
  335. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/minion/arguments.json +0 -0
  336. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/minion/help.js +0 -0
  337. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/minion/help.txt +0 -0
  338. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/minion/kill.js +0 -0
  339. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/minion/list.js +0 -0
  340. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/msg.json +0 -0
  341. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/port/help.js +0 -0
  342. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/port/inc/scan.js +0 -0
  343. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/port/list.js +0 -0
  344. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/port/reset.js +0 -0
  345. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/add.js +0 -0
  346. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/arguments.json +0 -0
  347. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/build.js +0 -0
  348. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/help.js +0 -0
  349. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/help.txt +0 -0
  350. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/import.js +0 -0
  351. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/list.js +0 -0
  352. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/move.js +0 -0
  353. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/remove.js +0 -0
  354. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/rename.js +0 -0
  355. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/restart.js +0 -0
  356. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/rm.js +0 -0
  357. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/start.js +0 -0
  358. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/status.js +0 -0
  359. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/project/stop.js +0 -0
  360. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/protocol/arguments.json +0 -0
  361. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/protocol/help.js +0 -0
  362. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/protocol/help.txt +0 -0
  363. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/protocol/list.js +0 -0
  364. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/protocol/remove.js +0 -0
  365. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/protocol/set.js +0 -0
  366. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/scope/add.js +0 -0
  367. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/scope/help.js +0 -0
  368. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/scope/help.txt +0 -0
  369. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/scope/link-local.js +0 -0
  370. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/scope/link-production.js +0 -0
  371. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/scope/list.js +0 -0
  372. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/scope/remove.js +0 -0
  373. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/scope/rm.js +0 -0
  374. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/scope/use.js +0 -0
  375. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/secrets/arguments.json +0 -0
  376. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/secrets/check.js +0 -0
  377. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/secrets/help.js +0 -0
  378. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/secrets/help.txt +0 -0
  379. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/secrets/scan.js +0 -0
  380. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/service/help.js +0 -0
  381. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/service/help.txt +0 -0
  382. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/service/list.js +0 -0
  383. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/service/start.js +0 -0
  384. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd/view/add.js +0 -0
  385. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd-status-format/package.json +0 -0
  386. /package/framework/{v0.5.2 → v0.5.3}/lib/cmd-status-format/src/main.js +0 -0
  387. /package/framework/{v0.5.2 → v0.5.3}/lib/collection/README.md +0 -0
  388. /package/framework/{v0.5.2 → v0.5.3}/lib/collection/build.json +0 -0
  389. /package/framework/{v0.5.2 → v0.5.3}/lib/collection/package.json +0 -0
  390. /package/framework/{v0.5.2 → v0.5.3}/lib/collection/src/main.js +0 -0
  391. /package/framework/{v0.5.2 → v0.5.3}/lib/config.js +0 -0
  392. /package/framework/{v0.5.2 → v0.5.3}/lib/connector-registry/package.json +0 -0
  393. /package/framework/{v0.5.2 → v0.5.3}/lib/connector-registry/src/main.js +0 -0
  394. /package/framework/{v0.5.2 → v0.5.3}/lib/cron/README.md +0 -0
  395. /package/framework/{v0.5.2 → v0.5.3}/lib/cron/package.json +0 -0
  396. /package/framework/{v0.5.2 → v0.5.3}/lib/cron/src/main.js +0 -0
  397. /package/framework/{v0.5.2 → v0.5.3}/lib/domain/LICENSE +0 -0
  398. /package/framework/{v0.5.2 → v0.5.3}/lib/domain/README.md +0 -0
  399. /package/framework/{v0.5.2 → v0.5.3}/lib/domain/package.json +0 -0
  400. /package/framework/{v0.5.2 → v0.5.3}/lib/domain/src/main.js +0 -0
  401. /package/framework/{v0.5.2 → v0.5.3}/lib/i18n/package.json +0 -0
  402. /package/framework/{v0.5.2 → v0.5.3}/lib/i18n/src/main.js +0 -0
  403. /package/framework/{v0.5.2 → v0.5.3}/lib/index.js +0 -0
  404. /package/framework/{v0.5.2 → v0.5.3}/lib/inherits/LICENSE +0 -0
  405. /package/framework/{v0.5.2 → v0.5.3}/lib/inherits/README.md +0 -0
  406. /package/framework/{v0.5.2 → v0.5.3}/lib/inherits/package.json +0 -0
  407. /package/framework/{v0.5.2 → v0.5.3}/lib/inherits/src/main.js +0 -0
  408. /package/framework/{v0.5.2 → v0.5.3}/lib/inspector-redact/package.json +0 -0
  409. /package/framework/{v0.5.2 → v0.5.3}/lib/inspector-redact/src/main.js +0 -0
  410. /package/framework/{v0.5.2 → v0.5.3}/lib/instrument/package.json +0 -0
  411. /package/framework/{v0.5.2 → v0.5.3}/lib/instrument/src/main.js +0 -0
  412. /package/framework/{v0.5.2 → v0.5.3}/lib/job/package.json +0 -0
  413. /package/framework/{v0.5.2 → v0.5.3}/lib/job/src/main.js +0 -0
  414. /package/framework/{v0.5.2 → v0.5.3}/lib/logger/README.md +0 -0
  415. /package/framework/{v0.5.2 → v0.5.3}/lib/logger/package.json +0 -0
  416. /package/framework/{v0.5.2 → v0.5.3}/lib/logger/src/containers/default/index.js +0 -0
  417. /package/framework/{v0.5.2 → v0.5.3}/lib/logger/src/containers/file/index.js +0 -0
  418. /package/framework/{v0.5.2 → v0.5.3}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  419. /package/framework/{v0.5.2 → v0.5.3}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  420. /package/framework/{v0.5.2 → v0.5.3}/lib/logger/src/containers/mq/index.js +0 -0
  421. /package/framework/{v0.5.2 → v0.5.3}/lib/logger/src/containers/mq/listener.js +0 -0
  422. /package/framework/{v0.5.2 → v0.5.3}/lib/logger/src/containers/mq/speaker.js +0 -0
  423. /package/framework/{v0.5.2 → v0.5.3}/lib/logger/src/helper.js +0 -0
  424. /package/framework/{v0.5.2 → v0.5.3}/lib/logger/src/main.js +0 -0
  425. /package/framework/{v0.5.2 → v0.5.3}/lib/math/index.js +0 -0
  426. /package/framework/{v0.5.2 → v0.5.3}/lib/mcp-dispatch/package.json +0 -0
  427. /package/framework/{v0.5.2 → v0.5.3}/lib/mcp-dispatch/src/main.js +0 -0
  428. /package/framework/{v0.5.2 → v0.5.3}/lib/mcp-http/package.json +0 -0
  429. /package/framework/{v0.5.2 → v0.5.3}/lib/mcp-http/src/main.js +0 -0
  430. /package/framework/{v0.5.2 → v0.5.3}/lib/mcp-server/package.json +0 -0
  431. /package/framework/{v0.5.2 → v0.5.3}/lib/mcp-server/src/main.js +0 -0
  432. /package/framework/{v0.5.2 → v0.5.3}/lib/merge/README.md +0 -0
  433. /package/framework/{v0.5.2 → v0.5.3}/lib/merge/package.json +0 -0
  434. /package/framework/{v0.5.2 → v0.5.3}/lib/merge/src/main.js +0 -0
  435. /package/framework/{v0.5.2 → v0.5.3}/lib/metrics/package.json +0 -0
  436. /package/framework/{v0.5.2 → v0.5.3}/lib/metrics/src/main.js +0 -0
  437. /package/framework/{v0.5.2 → v0.5.3}/lib/model.js +0 -0
  438. /package/framework/{v0.5.2 → v0.5.3}/lib/nunjucks-filters/README.md +0 -0
  439. /package/framework/{v0.5.2 → v0.5.3}/lib/nunjucks-filters/package.json +0 -0
  440. /package/framework/{v0.5.2 → v0.5.3}/lib/nunjucks-filters/src/main.js +0 -0
  441. /package/framework/{v0.5.2 → v0.5.3}/lib/nunjucks-resolver/package.json +0 -0
  442. /package/framework/{v0.5.2 → v0.5.3}/lib/nunjucks-resolver/src/main.js +0 -0
  443. /package/framework/{v0.5.2 → v0.5.3}/lib/routing/README.md +0 -0
  444. /package/framework/{v0.5.2 → v0.5.3}/lib/routing/build.json +0 -0
  445. /package/framework/{v0.5.2 → v0.5.3}/lib/routing/package.json +0 -0
  446. /package/framework/{v0.5.2 → v0.5.3}/lib/routing/src/main.js +0 -0
  447. /package/framework/{v0.5.2 → v0.5.3}/lib/routing/src/radix.js +0 -0
  448. /package/framework/{v0.5.2 → v0.5.3}/lib/routing-introspect/package.json +0 -0
  449. /package/framework/{v0.5.2 → v0.5.3}/lib/routing-introspect/src/main.js +0 -0
  450. /package/framework/{v0.5.2 → v0.5.3}/lib/secrets/package.json +0 -0
  451. /package/framework/{v0.5.2 → v0.5.3}/lib/secrets/src/backends/env.js +0 -0
  452. /package/framework/{v0.5.2 → v0.5.3}/lib/secrets/src/main.js +0 -0
  453. /package/framework/{v0.5.2 → v0.5.3}/lib/session-store.js +0 -0
  454. /package/framework/{v0.5.2 → v0.5.3}/lib/shell.js +0 -0
  455. /package/framework/{v0.5.2 → v0.5.3}/lib/swig-filters/README.md +0 -0
  456. /package/framework/{v0.5.2 → v0.5.3}/lib/swig-filters/package.json +0 -0
  457. /package/framework/{v0.5.2 → v0.5.3}/lib/swig-filters/src/main.js +0 -0
  458. /package/framework/{v0.5.2 → v0.5.3}/lib/swig-resolver/package.json +0 -0
  459. /package/framework/{v0.5.2 → v0.5.3}/lib/swig-resolver/src/main.js +0 -0
  460. /package/framework/{v0.5.2 → v0.5.3}/lib/template-loaders/package.json +0 -0
  461. /package/framework/{v0.5.2 → v0.5.3}/lib/template-loaders/src/loaders/http.js +0 -0
  462. /package/framework/{v0.5.2 → v0.5.3}/lib/template-loaders/src/loaders/memory.js +0 -0
  463. /package/framework/{v0.5.2 → v0.5.3}/lib/template-loaders/src/main.js +0 -0
  464. /package/framework/{v0.5.2 → v0.5.3}/lib/url/README.md +0 -0
  465. /package/framework/{v0.5.2 → v0.5.3}/lib/url/index.js +0 -0
  466. /package/framework/{v0.5.2 → v0.5.3}/lib/url/routing.json +0 -0
  467. /package/framework/{v0.5.2 → v0.5.3}/lib/uuid/package.json +0 -0
  468. /package/framework/{v0.5.2 → v0.5.3}/lib/uuid/src/main.js +0 -0
  469. /package/framework/{v0.5.2 → v0.5.3}/lib/validator.js +0 -0
  470. /package/framework/{v0.5.2 → v0.5.3}/lib/watcher/package.json +0 -0
  471. /package/framework/{v0.5.2 → v0.5.3}/lib/watcher/src/main.js +0 -0
  472. /package/framework/{v0.5.2 → v0.5.3}/lib/ws-framing/package.json +0 -0
  473. /package/framework/{v0.5.2 → v0.5.3}/lib/ws-framing/src/main.js +0 -0
  474. /package/framework/{v0.5.2 → v0.5.3}/lib/ws-session/package.json +0 -0
  475. /package/framework/{v0.5.2 → v0.5.3}/lib/ws-session/src/main.js +0 -0
@@ -18,6 +18,13 @@ var console = lib.logger;
18
18
  *
19
19
  * When a required value is omitted, the user is prompted interactively.
20
20
  *
21
+ * Pass --force to reassign a port that is currently held by a different bundle:
22
+ * the prior holder is evicted (it loses that port for the protocol/scheme and
23
+ * re-pins itself the next time its own context runs port:set). Without --force,
24
+ * a port already assigned to another bundle is rejected.
25
+ *
26
+ * gina port:set <bundle_name> @<project_name> --protocol=http/2.0 --scheme=https --port=8443 --env=dev --force
27
+ *
21
28
  * @class Set
22
29
  * @constructor
23
30
  * @param {object} opt - Parsed command-line options
@@ -34,6 +41,7 @@ function Set(opt, cmd) {
34
41
  , requestedScheme = null
35
42
  , requestedPort = null
36
43
  , requestedEnv = null
44
+ , requestedForce = false
37
45
  ;
38
46
 
39
47
  // Pre-parse argv before CmdHelper to extract protocol:port and @project/env
@@ -65,6 +73,7 @@ function Set(opt, cmd) {
65
73
  if ( /^\-\-protocol\=/.test(arg) ) { requestedProtocol = arg.split('=')[1]; continue; }
66
74
  if ( /^\-\-scheme\=/.test(arg) ) { requestedScheme = arg.split('=')[1]; continue; }
67
75
  if ( /^\-\-env\=/.test(arg) ) { requestedEnv = arg.split('=')[1]; continue; }
76
+ if ( /^\-\-force$/.test(arg) ) { requestedForce = true; continue; }
68
77
 
69
78
  cleaned.push(arg);
70
79
  }
@@ -242,12 +251,20 @@ function Set(opt, cmd) {
242
251
  * ports.reverse.json. Removes any previous assignment for the same
243
252
  * bundle/env/protocol/scheme before writing the new one.
244
253
  *
254
+ * If the target port is already held by a DIFFERENT bundle/env, the call is
255
+ * rejected — unless `--force` was passed (closure var `requestedForce`), in
256
+ * which case the prior holder is evicted from both maps and a warning is
257
+ * logged before the new assignment is written.
258
+ *
245
259
  * @inner
246
260
  * @private
247
261
  * @param {string} protocol - e.g. 'http/1.1', 'http/2.0'
248
262
  * @param {string} scheme - e.g. 'http', 'https'
249
263
  * @param {number} port - Port number to assign
250
264
  * @param {string} env - Environment name (e.g. 'dev', 'staging')
265
+ * @example
266
+ * // Pin a bundle to a fixed port even if another bundle currently holds it:
267
+ * // gina port:set frontend @myproject --protocol=http/2.0 --scheme=https --port=8443 --env=dev --force
251
268
  */
252
269
  var setPort = function(protocol, scheme, port, env) {
253
270
 
@@ -290,8 +307,34 @@ function Set(opt, cmd) {
290
307
  && typeof(ports[protocol][scheme][portStr]) != 'undefined'
291
308
  && ports[protocol][scheme][portStr] !== portValue
292
309
  ) {
293
- console.error('Port '+ port +' is already assigned to '+ ports[protocol][scheme][portStr]);
294
- process.exit(1);
310
+ var squatter = ports[protocol][scheme][portStr];
311
+
312
+ if ( !requestedForce ) {
313
+ console.error('Port '+ port +' is already assigned to '+ squatter +' (use --force to reassign)');
314
+ process.exit(1);
315
+ }
316
+
317
+ // --force: evict the current holder so this bundle can take the port.
318
+ // The displaced bundle loses this port for this protocol/scheme; it
319
+ // re-pins itself the next time its own context runs `port:set`. This is
320
+ // the intended shape for one-bundle-per-container deployments where each
321
+ // container owns exactly one bundle and pins it to a fixed port.
322
+ console.warn('[port:set] --force: reassigning port '+ port +' from '+ squatter +' to '+ portValue);
323
+ delete ports[protocol][scheme][portStr];
324
+
325
+ // Drop the displaced bundle's reverse entry so the two maps stay consistent.
326
+ var sSlash = squatter.lastIndexOf('/');
327
+ if ( sSlash > 0 ) {
328
+ var sBundleKey = squatter.substring(0, sSlash);
329
+ var sEnv = squatter.substring(sSlash + 1);
330
+ if (
331
+ typeof(portsReverse[sBundleKey]) != 'undefined'
332
+ && typeof(portsReverse[sBundleKey][sEnv]) != 'undefined'
333
+ && typeof(portsReverse[sBundleKey][sEnv][protocol]) != 'undefined'
334
+ ) {
335
+ delete portsReverse[sBundleKey][sEnv][protocol][scheme];
336
+ }
337
+ }
295
338
  }
296
339
 
297
340
  // Remove previous port for this bundle/env/protocol/scheme (if reassigning)
@@ -20,6 +20,10 @@ var fs = require('fs');
20
20
  var _stateModule;
21
21
  try { _stateModule = require('../state'); } catch (_) { _stateModule = null; }
22
22
 
23
+ // #B43 — monotonic counter for unique same-process atomic-write temp filenames
24
+ // (createFileFromDataSync's legacy path writes a temp + renames to stay tear-free).
25
+ var _atomicWriteSeq = 0;
26
+
23
27
  /**
24
28
  * @class Generator
25
29
  *
@@ -103,10 +107,21 @@ var Generator = {
103
107
  }
104
108
  }
105
109
 
106
- // Legacy JSON write (non-state files, or SQLite unavailable)
110
+ // Legacy JSON write (non-state files, or SQLite unavailable).
111
+ // #B43 — write ATOMICALLY: a same-dir temp + rename, so a concurrent reader
112
+ // never observes a truncated/empty file (a bare fs.writeFileSync truncates the
113
+ // target in place; a concurrent boot read of the partial JSON crashes FATALLY).
114
+ // rename(2) is atomic within a filesystem; the temp is a sibling of the target.
107
115
  data = (typeof(data) == "object") ? JSON.stringify(data, null, 4) : data;
108
- fs.writeFileSync(target, data);
109
- fs.chmodSync(target, 0755)
116
+ var _tmp = target + '.' + process.pid + '.' + (_atomicWriteSeq++) + '.tmp';
117
+ try {
118
+ fs.writeFileSync(_tmp, data);
119
+ fs.chmodSync(_tmp, 0755);
120
+ fs.renameSync(_tmp, target);
121
+ } catch (writeErr) {
122
+ try { fs.unlinkSync(_tmp); } catch(unlinkErr) {}
123
+ throw writeErr;
124
+ }
110
125
  },
111
126
  // createFoldersFromStructureSync : function(structure){
112
127
  // },
@@ -662,7 +662,10 @@ function Proc(bundle, proc, usePidFile){
662
662
 
663
663
  //init
664
664
  if ( typeof(self.bundle) == "undefined" ) {
665
- console.error('[ PROC ] Invalid or undefined proc name . Proc naming Aborted');
665
+ var _procMsg = '[ PROC ] Invalid or undefined proc name . Proc naming Aborted';
666
+ console.error(_procMsg);
667
+ // Guarantee the reason survives process.exit() on an async pipe (e.g. bin/gina-container).
668
+ try { fs.writeSync(2, _procMsg + '\n'); } catch (_e) { /* best-effort */ }
666
669
  process.exit(1)
667
670
  } else {
668
671
  init()
@@ -15,6 +15,10 @@
15
15
  var fs = require('fs');
16
16
  var nodePath = require('path');
17
17
 
18
+ // #B43 — monotonic counter for unique same-process atomic-write temp filenames
19
+ // (see this.write: a temp + rename keeps the JSON sidecar reads tear-free).
20
+ var _sidecarWriteSeq = 0;
21
+
18
22
  /**
19
23
  * SQLite-backed key-value store for the five `~/.gina/` state files.
20
24
  *
@@ -184,7 +188,11 @@ function StateStore() {
184
188
  *
185
189
  * The sidecar write keeps every legacy read path (`require()`,
186
190
  * `requireJSON()`, `fs.readFileSync()`) working without modification.
187
- * SQLite is canonical; the JSON file is derived from it.
191
+ * SQLite is canonical; the JSON file is derived from it. The sidecar is
192
+ * itself written atomically — a same-dir temp file then `fs.renameSync`
193
+ * (#B43) — so a concurrent fleet-boot reader never observes a truncated
194
+ * or empty file (a bare in-place write would let a partial read crash
195
+ * the booting process).
188
196
  *
189
197
  * Returns `false` when the store is unavailable (Node < 22.5.0 or
190
198
  * `GINA_HOMEDIR` not yet set); the caller should fall through to a
@@ -207,9 +215,23 @@ function StateStore() {
207
215
  'INSERT OR REPLACE INTO kv_store (key, value, updated_at) VALUES (?, ?, ?)'
208
216
  ).run(key, value, Date.now());
209
217
 
210
- // Write JSON sidecar — derived from SQLite, needed by all read call sites
211
- fs.writeFileSync(filePath, value);
212
- try { fs.chmodSync(filePath, 0o755); } catch(chmodErr) {}
218
+ // Write the JSON sidecar — derived from SQLite, needed by all read call sites.
219
+ // #B43 — write it ATOMICALLY: a same-dir temp + rename, so a concurrent reader
220
+ // (requireJSON / require / raw JSON.parse on a fleet boot) never observes a
221
+ // truncated or empty file. A bare fs.writeFileSync truncates the target in
222
+ // place, leaving a window where a concurrent read parses partial JSON and
223
+ // crashes FATALLY (requireJSON -> process.exit(1); plain require -> uncaught
224
+ // SyntaxError). rename(2) is atomic within a filesystem; the temp is a sibling
225
+ // of the target so the two always share one.
226
+ var _tmp = filePath + '.' + process.pid + '.' + (_sidecarWriteSeq++) + '.tmp';
227
+ try {
228
+ fs.writeFileSync(_tmp, value);
229
+ try { fs.chmodSync(_tmp, 0o755); } catch(chmodErr) {}
230
+ fs.renameSync(_tmp, filePath);
231
+ } catch (writeErr) {
232
+ try { fs.unlinkSync(_tmp); } catch(unlinkErr) {}
233
+ throw writeErr;
234
+ }
213
235
 
214
236
  return true;
215
237
  };
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gina-framework",
3
- "version": "0.5.2-alpha.2",
3
+ "version": "0.5.3-alpha.2",
4
4
  "dependencies": {
5
5
  "@rhinostone/swig": "^2.7.2",
6
6
  "intl-messageformat": "^11.2.4",
package/gna.js CHANGED
@@ -15,14 +15,14 @@
15
15
  'use strict';
16
16
 
17
17
  // Framework core — the main gna module (lifecycle hooks, lib, etc.)
18
- var _gna = require('./framework/v0.5.2/core/gna');
18
+ var _gna = require('./framework/v0.5.3/core/gna');
19
19
 
20
20
  // SuperController and EntitySuper — loaded from their source modules
21
- var SuperController = require('./framework/v0.5.2/core/controller');
22
- var EntitySuper = require('./framework/v0.5.2/core/model/entity');
21
+ var SuperController = require('./framework/v0.5.3/core/controller');
22
+ var EntitySuper = require('./framework/v0.5.3/core/model/entity');
23
23
 
24
24
  // uuid — from the lib registry
25
- var uuid = require('./framework/v0.5.2/lib/uuid');
25
+ var uuid = require('./framework/v0.5.3/lib/uuid');
26
26
 
27
27
  module.exports = {
28
28
 
package/llms.txt CHANGED
@@ -794,7 +794,7 @@ Dev-mode query instrumentation captures every database query tied to the current
794
794
 
795
795
  97. **`String.prototype.match` + `indexOf(match)` is unsafe positional anchoring when match strings can be substrings of each other** — short regex matches (e.g. a bare `//` separator) collide on `indexOf` with longer matches earlier in the haystack (a `//` inside a URL string on a prior line that already passed the guard). Manifested at `helpers/json/src/main.js:63-78` where the comment-stripping loop did `commentsWithSlashes = jsonStr.match(/\/\/(.*)?/g)` + per-match `jsonStr.indexOf(m)` + `charAt(pos-1)` URL-guard: the bare `//` separator's `indexOf` re-found the URL's `//`, the guard re-fired against the URL's `:`, and the real separator was never stripped — `JSON.parse` then threw `Expected double-quoted property name` on every bundle config combining a URL string with a bare `//` line. **Use `matchAll` (returns `match.index` per occurrence) when positional iteration is needed, or restructure to per-line scanning.** Related secondary trap: greedy regex-and-loop has implicit per-line scope (`(.*)?` consumed rest of line so only the FIRST `//` per line was guarded); naively replacing it with a non-greedy single-pass lookbehind `(?<![:"\\])\/\/[^\n]*/g` flattens this to per-position and would strip from mid-string `//`-bearing URLs like `"http://host//:rest"` — 8 fixtures under `lib/collection/test/data/` (Couchbase travel-sample data) carry exactly this pattern, caught by `test/lib/collection.test.js` § 05's `assert.deepStrictEqual(result, mocks)` where `mocks` is `requireJSON(...)`. **Final fix shape**: `split('\n')` + per-line leftmost `//` + `:` / `"` / `\` char-before guard — mirrors the original greedy heuristic without the substring-collision class of bug. Established 2026-05-13 (commit `2210ab17`); full incident narrative in the project's post-mortem store.
796
796
 
797
- 98. **Secrets resolver — `${secret:KEY}` placeholder substitution in bundle JSON configs at config-load time** — `lib/secrets` walks the merged per-bundle config and substitutes `${secret:KEY}` placeholders from `process.env[KEY]` before `self.envConf[bundle][env]` is finalised in `core/config.js::loadBundleConfig`. Anchored regex `^\${secret:([A-Z_][A-Z0-9_]*)\}$` matches ONLY when the entire string value is the placeholder — mixed strings (`"prefix-${secret:K}-suffix"`) pass through unchanged (deliberate scope choice: removes the "is `{` substitution or literal?" ambiguity). Non-string scalars are walked but never mutated; nested objects and arrays descend recursively. **Fail-closed**: unset / empty env var throws `Error('Secret resolution failed')` (no key name in the message — the key is attached as a non-enumerable `_ginaSecretKey` property for debug-only logging; consumer surfaces never see the key name). Resolution happens once per config-load cycle (in-place mutation; second pass finds nothing). Cache invalidation: `config.refresh()` re-runs the resolver, but secret rotation needs a process restart (the supervisor inherits its env from container init, not from the running framework). **Pluggable backend interface** — `secrets.resolve(config, backend?)` accepts a `{resolve(key) → string|throw}` object; only the `process.env` backend ships in this iteration, but the API is stable for future plug-ins (Vault, SOPS, K8s Secrets). **Path tracking via `WeakMap`** — `secrets.getResolvedPaths(config)` returns the dotted paths (`'db.password'`, `'items[0]'`) the resolver substituted; storage is GC'd when the config is collected and never serialised. Groundwork for a future log-redaction wrapper at any merged-conf print site (`Inspector` payload, debug-export tools); no such print site exists in `core/config.js` today (existing `console.debug` calls interpolate scalar identifiers, not the merged object). **Consumers** — `gina.plugins.Csrf()` reads `settings.csrf.secret` (placeholder-resolved) with precedence `opts.secret` > `settings.csrf.secret` > `process.env.GINA_CSRF_SECRET` (back-compat); `gina bundle:mcp-start` re-runs the resolver on the parsed `mcp.json` immediately after `requireJSON()` so `server.authToken` etc. resolve before downstream readers; bundle scaffolding (`project:add` / `bundle:add`) recommends the placeholder shape in `core/template/conf/settings.json` and `core/template/boilerplate/bundle/index.js`. Established 2026-05-13 (#SECRETS1, commits `8aa2ec82` resolver + wiring, `c1b09ed5` syntax rename `{secret:KEY}` → `${secret:KEY}`, `7a8b0f36` csrf.secret slot, `7d513638` mcp.json route, `33f34b23` scaffolding).
797
+ 98. **Secrets resolver — `${secret:KEY}` placeholder substitution in bundle JSON configs at config-load time** — `lib/secrets` walks the merged per-bundle config and substitutes `${secret:KEY}` placeholders from `process.env[KEY]` before `self.envConf[bundle][env]` is finalised in `core/config.js::loadBundleConfig`. Anchored regex `^\${secret:([A-Z_][A-Z0-9_]*)\}$` matches ONLY when the entire string value is the placeholder — mixed strings (`"prefix-${secret:K}-suffix"`) pass through unchanged (deliberate scope choice: removes the "is `{` substitution or literal?" ambiguity). Non-string scalars are walked but never mutated; nested objects and arrays descend recursively. **Fail-closed**: unset / empty env var throws `Error('Secret resolution failed')` (no key name in the message — the key is attached as a non-enumerable `_ginaSecretKey` property for debug-only logging; consumer surfaces never see the key name). Resolution happens once per config-load cycle (in-place mutation; second pass finds nothing). Cache invalidation: `config.refresh()` re-runs the resolver, but secret rotation needs a process restart (the supervisor inherits its env from container init, not from the running framework). **Pluggable backend interface** — `secrets.resolve(config, backend?)` accepts a `{resolve(key) → string|throw}` object; only the `process.env` backend ships in this iteration, but the API is stable for future plug-ins (Vault, SOPS, K8s Secrets). **Path tracking via `WeakMap`** — `secrets.getResolvedPaths(config)` returns the dotted paths (`'db.password'`, `'items[0]'`) the resolver substituted; storage is GC'd when the config is collected and never serialised. Groundwork for a future log-redaction wrapper at any merged-conf print site (`Inspector` payload, debug-export tools); no such print site exists in `core/config.js` today (existing `console.debug` calls interpolate scalar identifiers, not the merged object). **Consumers** — `gina.plugins.Csrf()` reads `settings.csrf.secret` (placeholder-resolved) with precedence `opts.secret` > `settings.csrf.secret` > `process.env.GINA_CSRF_SECRET` (back-compat); `gina bundle:mcp-start` re-runs the resolver on the parsed `mcp.json` immediately after `requireJSON()` so `server.authToken` etc. resolve before downstream readers; bundle scaffolding (`project:add` / `bundle:add`) recommends the placeholder shape in `core/template/conf/settings.json` and `core/template/boilerplate/bundle/index.js`. Established 2026-05-13 (#SECRETS1, commits `8aa2ec82` resolver + wiring, `c1b09ed5` syntax rename `{secret:KEY}` → `${secret:KEY}`, `7a8b0f36` csrf.secret slot, `7d513638` mcp.json route, `33f34b23` scaffolding). **#B42 (2026-06-14, commit `341acc4f`):** the config-load catch in `core/config.js::loadBundleConfig` now actually SURFACES that `_ginaSecretKey` — on a resolution failure it logs `console.debug('[CONFIG][loadBundleConfig] Secret resolution failed for \`<KEY>\` in \`<bundle>/<env>:<scope>\` configuration')` before propagating, so an operator with an unset placeholder learns WHICH key and WHICH bundle/config (previously the catch discarded the key and only the generic `Secret resolution failed` message bubbled to the top-level handler, naming neither). Debug level only — the propagated error and the top-level log stay generic, so the key never reaches a louder channel; a `<unknown>` fallback covers a future backend that throws without attaching the key.
798
798
 
799
799
  99. **Probe-first protocol for removing load-bearing fallback code** — when a defensive fallback (eval fallback, try/catch shim, recovery branch) has documented history of being load-bearing despite "looking like dead code", apply the structural fix at the cause-side FIRST, then instrument the fallback with a stderr probe BEFORE removing it, then run the full test suite to observe whether the probe fires. Only remove the fallback (and the probe) AFTER observing zero probe fires across all sites. This turns "I reasoned the structural fix breaks the trigger condition" into "the test suite empirically confirms the fallback never executes after the structural fix". **Worked example** — #M22 logger circular-require (2026-05-14). The 3 eval fallbacks at `lib/logger/src/main.js:69` + `containers/file/index.js:16` + `containers/mq/index.js:10` had bitten a prior session (#SCS1c, commit `ae932a5e`, 2026-04-23) — the evals were removed WITHOUT the structural fix and every logger-consuming test crashed with `TypeError: merge is not a function at init`. The 2026-05-14 protocol: (1) apply ONLY the structural fix in `lib/merge/src/main.js` (`require('../../../helpers')` → direct `require(__dirname + '/../../../../../utils/prototypes.json_clone')`, same `JSON.clone` population without going through the for-loop helper loader). (2) Add `process.stderr.write('[m22-probe] eval fallback fired at <file>:<line>\n')` at each fallback site, KEEPING the eval intact. (3) Run full local suite, capture stderr, `grep -c '\[m22-probe\]'`. **Zero fires** = empirical evidence the structural fix worked. (4) Only THEN remove the probes + evals. (5) Re-run suite to verify clean. ~10 minutes of work; the equivalent "reason about it and hope" approach was the failure mode of #SCS1c. **Detection signal that the protocol is warranted**: any session prompt or proposal phrased as "X is load-bearing because the prior attempt failed when X was removed". When you see that shape, surface the probe-first protocol BEFORE any code deletion. **Reflex check**: if your proposed protocol is "apply X subset first, then the rest" without a measurement justification for the subset choice, you're hedging, not measuring. The user's "is this your measured recommendation?" reflex catches this — answer is to surface positive evidence (probe never fires) rather than just smaller-blast-radius framing. Sister rule: the global "No fix without measurement" + the "Verification has THREE outcomes" expansion. Established 2026-05-14 (#M22, commit `2247e22e`).
800
800
 
@@ -921,4 +921,16 @@ Dev-mode query instrumentation captures every database query tied to the current
921
921
 
922
922
  177. **Couchbase connector — install-derived SDK resolution (v2 removed), `connectors.json` semantics, `getCluster()`, dev-mode index reporting** (replaces individual entries #29, #40, #41, #57, #136, #153) — connectors are keyed in `schema/connectors.json` by LOGICAL name (`primary`, `sessionStore`, `cache`, …) with the driver selected by the `connector` enum field (`couchbase`/`mysql`/`postgresql`/`sqlite`/`redis`/`ai`/…) — never introduce a separate `driver` field; the optional `version` field carries a semver range used by `connector:add --driver-version=…` for the npm-install hint. The Couchbase SDK major is derived from the project's INSTALLED `couchbase` npm version — the leading major of `dependencies.couchbase` selects `connector.v<major>.js`, which stamps `conn.sdk = { version: N }` — never from a config key, so migrating SDK majors is a driver bump (`npm install couchbase@^4`), not a config edit. SDK v2 is REMOVED as of 0.4.0: the resolver now throws a clear "SDK v2 is no longer supported — upgrade couchbase@^3/^4" error when the installed major is ≤ 2 or the connector file is missing (previously a silent fallback that crashed later with an opaque MODULE_NOT_FOUND); the v3-vs-v4 split remains for param shaping. Generalises: when a connector's behavior-version derives from an installed dependency rather than config, fail fast once the installed major drops below the supported floor. Couchbase entities expose a public `getCluster()` (on both the model-entity and N1QL-entity prototypes) returning the underlying SDK `Cluster` handle for features the ORM doesn't wrap — chiefly multi-document ACID transactions (`cluster.transactions().run(...)`, needs SDK 3.2+/4.x) — without touching private `_*` internals; it throws a coded `GINA_COUCHBASE_CLUSTER_UNRESOLVED` error when neither connection shape resolves. Dev-mode index reporting: the SDK v4 C++ binding never populates `meta.profile` despite `profile: 'timings'` being sent (confirmed on v4.6.0), so an async `EXPLAIN <statement>` fallback with a per-process per-statement cache supplies the plan instead (the first request for a new statement may show N/A; subsequent requests hit the cache), and `USE KEYS` plans surface as "KV lookup" via `ExpressionScan`/`KeyScan` operator detection. Two historical traps locked by tests: `conn._cluster.query()` must receive the full `queryOptions` object, not the raw params array (the raw form silently dropped `profile`/`scanConsistency`/`adhoc` from every query), and of the connector's two `register()` dispatch paths, Option B (`!_isRegisteredFromProto`) is the ALWAYS-active one — instrumentation or logging added to Option A never executes.
923
923
 
924
- 178. **HTTP/2 query paths must tolerate a released response — retry re-entries and late upstream responses run after terminal exits (#B33, 2026-06-12, commit `9c2d802a`).** Terminal exits release the per-request refs, and `redirect()` releases them and THEN calls next(), so an inter-bundle HTTP/2 query can outlive its own request in three measured ways, each previously an uncaughtException → SIGTERM bundle kill: (1) every retry re-entry (the 502/timeout/stream-error/preflight setTimeout paths) re-executes the header-forward prep block, which read the released request's headers — null deref from a timer callback outside all try/catch; (2) a late upstream response's success path calls isHaltedRequest → getSession, which read the released request's session from the stream end handler; (3) a parsed upstream payload claiming a 3xx status routed into the redirect intercepts, which wrote headers to the released response (the emitter-mode intercept uncaught; the callback-mode one contained only via a fragile catch chain). All sites null-guarded: forwards and intercepts no-op on a released request (the same options object travels through retries, so options.headers already carries the attempt-1 values — nothing is lost), getSession reports no session, and the emitter-mode intercept falls through to the query#complete emit so listeners still learn the outcome. Live-request behaviour is byte-identical. Runtime-verified by driving the REAL query() through a standalone controller harness against local h2c servers (six probe modes, crash reproduced pre-fix and clean post-fix per site). Sibling unguarded request-header reads exist in OTHER lifecycle functions; the §23 guard pin is block-scoped to the fixed functions for exactly that reason. **Follow-up #B35 (2026-06-13, `714d816f`+next):** the 5 directly-callable SYNCHRONOUS siblings were MEASURED (standalone harness: createTestInstance → renderTEXT() releases the triplet → call → confirmed `uncaughtException`-class crash) and guarded with top-of-function early-returns — `isPopinContext` → false, `setRequestMethod` → null, `setRequestMethodParams` → (void), `getRequestMethodParams` → the cached value, `getFormsRules` → {} (tests `controller.test.js §25`). **#B36 (`c5eaeeb7`+next):** `renderJSON()` is the same shape — its delegate reads `local.res.stream` synchronously before any `headersSent` guard, measured (standalone harness driving the real `render-json.js` delegate: CONTROL live rendered, RELEASE after `renderTEXT()` threw `reading 'stream'`) to crash a released response → SIGTERM; guarded with a top-of-function `if (local.res == null) return` (tests `render-json.test.js §03`). The render-swig / render-nunjucks delegates share the same read but are the NON-FATAL async class (measured 2026-06-13, NOT guarded): their `render()` is `async` and `this.render` returns the delegate promise un-awaited, so a released-instance read rejects → `unhandledRejection` → `gna.js:726` logs it (no SIGTERM). This is the canonical severity-axis example — a SYNCHRONOUS released read (render-json `#B36`, the `#B35` helpers) is a SIGTERM bundle-kill worth guarding; the same read in an ASYNC delegate is a logged unhandledRejection not worth editing the hot render path for. `redirect` GUARDED too (**#B37**, `a03e6f84`+next): measured synchronous, so a released second-call (redirect-then-redirect, or render-error-then-redirect) crashed `reading 'originalMethod'` → SIGTERM; top-of-function `if (local.req == null) return` (tests `controller.test.js §26`). **#B38 (2026-06-13) — the #B37 "SIGTERM class CLOSED" claim was premature: an exhaustive sweep of EVERY synchronous controller surface found SIX more lethal sync residuals, each measured (CONTROL no-throw / RELEASE positive crash, then no-throw post-guard) and guarded top-of-function with the same `if (local.req|res == null) return <default>` shape:** `downloadFromLocal` (`reading 'setHeader'`), the inner `start` of `store` (`reading 'files'` — reached SYNCHRONOUSLY through the documented `store(target).onComplete(cb)` wrapper, which calls `start` OUTSIDE the async `store` body; the #B35 probe had only tried `store('t')`, which returns the wrapper WITHOUT calling `start`, so `store` was wrongly filed as async-deferred here), `renderStream` (`reading 'stream'` — its controller wrapper AND the delegate are both synchronous, and the read precedes the delegate's headersSent guard, mirroring the #B36 render-json placement), `push` (`reading 'method'`), `pauseRequest` (`reading 'url'`), `resumeRequest` (`reading 'session'`/`'method'`) — tests `controller.test.js §27` + `render-stream.test.js §11`. Genuinely document-skipped (measured NON-FATAL, mirroring the render-swig/nunjucks #B36 decision): `downloadFromURL` (its reads sit inside an `async function`, so any throw is a rejected promise → `unhandledRejection`), and the render-path inner fns `setResources` / `getNodeRes` (sync, but invoked ONLY from the async render delegates, so a throw rejects the delegate promise — and the captured-req fix-shape was declined because the captured req is itself null in the released-response case). **Rule: lethality follows the NEAREST async boundary, not the function's own sync/async keyword — a sync read with no async function between it and the dispatcher is a SIGTERM bundle-kill (guard it); the same read reached only through an async function degrades to a logged unhandledRejection (skip it). Probe-asymmetry corollary: "no throw" is NOT proof of safety — feed inputs that actually REACH the deref (`resumeRequest({})` dodged its `req.session` read via an `&&` short-circuit + an early `throwError` return and looked safe until re-measured with a deref-reaching input).**
924
+ 178. **HTTP/2 query paths must tolerate a released response — retry re-entries and late upstream responses run after terminal exits (#B33, 2026-06-12, commit `9c2d802a`).** Terminal exits release the per-request refs, and `redirect()` releases them and THEN calls next(), so an inter-bundle HTTP/2 query can outlive its own request in three measured ways, each previously an uncaughtException → SIGTERM bundle kill: (1) every retry re-entry (the 502/timeout/stream-error/preflight setTimeout paths) re-executes the header-forward prep block, which read the released request's headers — null deref from a timer callback outside all try/catch; (2) a late upstream response's success path calls isHaltedRequest → getSession, which read the released request's session from the stream end handler; (3) a parsed upstream payload claiming a 3xx status routed into the redirect intercepts, which wrote headers to the released response (the emitter-mode intercept uncaught; the callback-mode one contained only via a fragile catch chain). All sites null-guarded: forwards and intercepts no-op on a released request (the same options object travels through retries, so options.headers already carries the attempt-1 values — nothing is lost), getSession reports no session, and the emitter-mode intercept falls through to the query#complete emit so listeners still learn the outcome. Live-request behaviour is byte-identical. Runtime-verified by driving the REAL query() through a standalone controller harness against local h2c servers (six probe modes, crash reproduced pre-fix and clean post-fix per site). Sibling unguarded request-header reads exist in OTHER lifecycle functions; the §23 guard pin is block-scoped to the fixed functions for exactly that reason. **Follow-up #B35 (2026-06-13, `714d816f`+next):** the 5 directly-callable SYNCHRONOUS siblings were MEASURED (standalone harness: createTestInstance → renderTEXT() releases the triplet → call → confirmed `uncaughtException`-class crash) and guarded with top-of-function early-returns — `isPopinContext` → false, `setRequestMethod` → null, `setRequestMethodParams` → (void), `getRequestMethodParams` → the cached value, `getFormsRules` → {} (tests `controller.test.js §25`). **#B36 (`c5eaeeb7`+next):** `renderJSON()` is the same shape — its delegate reads `local.res.stream` synchronously before any `headersSent` guard, measured (standalone harness driving the real `render-json.js` delegate: CONTROL live rendered, RELEASE after `renderTEXT()` threw `reading 'stream'`) to crash a released response → SIGTERM; guarded with a top-of-function `if (local.res == null) return` (tests `render-json.test.js §03`). The render-swig / render-nunjucks delegates share the same read but are the NON-FATAL async class (measured 2026-06-13, initially NOT guarded — GUARDED as of #B45, see below): their `render()` is `async` and `this.render` returns the delegate promise un-awaited, so a released-instance read rejects → `unhandledRejection` → `gna.js:726` logs it (no SIGTERM). This is the canonical severity-axis example — a SYNCHRONOUS released read (render-json `#B36`, the `#B35` helpers) is a SIGTERM bundle-kill worth guarding; the same read in an ASYNC delegate is a logged unhandledRejection not worth editing the hot render path for. **#B45 (2026-06-14, `d9bfc5af`) reversed that for the render delegates:** production surfaced exactly the predicted `unhandledRejection` (a controller firing several parallel `self.query()` calls against a downed upstream — the first failure callback renders+releases the triplet, a later callback re-enters `render()` at `local.res === null` → render-swig.js:259 `res.stream` throws), which is the #B36 "revisit only if the log noise proves operationally costly" trigger. All four async delegates (render-swig / render-nunjucks + both async variants) now carry the same top-of-function `if (local.res == null) return` guard as render-json/render-stream — one null check at the top, byte-identical on live requests; the rarer in-flight #M1 `setResources` race (render-swig.js:613 → controller.js:896, caught + #B31-guarded) is unchanged. The severity-axis lesson still holds (sync → SIGTERM → always guard; async → unhandledRejection → guard only once the noise is shown operationally costly) — #B45 is the worked example of the async "guard-when-costly" branch firing (tests `render-swig.test.js §19` / `render-nunjucks.test.js §08` / `render-engine-dispatch.test.js §08`). `redirect` GUARDED too (**#B37**, `a03e6f84`+next): measured synchronous, so a released second-call (redirect-then-redirect, or render-error-then-redirect) crashed `reading 'originalMethod'` → SIGTERM; top-of-function `if (local.req == null) return` (tests `controller.test.js §26`). **#B38 (2026-06-13) — the #B37 "SIGTERM class CLOSED" claim was premature: an exhaustive sweep of EVERY synchronous controller surface found SIX more lethal sync residuals, each measured (CONTROL no-throw / RELEASE positive crash, then no-throw post-guard) and guarded top-of-function with the same `if (local.req|res == null) return <default>` shape:** `downloadFromLocal` (`reading 'setHeader'`), the inner `start` of `store` (`reading 'files'` — reached SYNCHRONOUSLY through the documented `store(target).onComplete(cb)` wrapper, which calls `start` OUTSIDE the async `store` body; the #B35 probe had only tried `store('t')`, which returns the wrapper WITHOUT calling `start`, so `store` was wrongly filed as async-deferred here), `renderStream` (`reading 'stream'` — its controller wrapper AND the delegate are both synchronous, and the read precedes the delegate's headersSent guard, mirroring the #B36 render-json placement), `push` (`reading 'method'`), `pauseRequest` (`reading 'url'`), `resumeRequest` (`reading 'session'`/`'method'`) — tests `controller.test.js §27` + `render-stream.test.js §11`. Genuinely document-skipped (measured NON-FATAL, by the same async-boundary reasoning — the render delegates themselves since GUARDED, see #B45 above): `downloadFromURL` (its reads sit inside an `async function`, so any throw is a rejected promise → `unhandledRejection`), and the render-path inner fns `setResources` / `getNodeRes` (sync, but invoked ONLY from the async render delegates, so a throw rejects the delegate promise — and the captured-req fix-shape was declined because the captured req is itself null in the released-response case). **Rule: lethality follows the NEAREST async boundary, not the function's own sync/async keyword — a sync read with no async function between it and the dispatcher is a SIGTERM bundle-kill (guard it); the same read reached only through an async function degrades to a logged unhandledRejection (skip it). Probe-asymmetry corollary: "no throw" is NOT proof of safety — feed inputs that actually REACH the deref (`resumeRequest({})` dodged its `req.session` read via an `&&` short-circuit + an early `throwError` return and looked safe until re-measured with a deref-reaching input).** **#B44 (2026-06-14, commit `d95ac2fe`) — closes the one throwError-OWN residual the #B38 sweep flagged, and is the worked example of the measurement-scope-gap.** `throwError` reads `res.stream` (the HTTP/2 protocol branch) and then builds the error object from `res.error`/`res.stack`/`res.fallback` (~10 reads) BEFORE its OWN #B31 guard. For the 2-arg `throwError(code, Error|string)` and 3-arg `throwError(local.res, code, msg)` shapes `res` is already the released `local.res` (null) at those reads, so a released response crashed at `res.stream` on HTTP/2 bundles and at `res.error` on EVERY bundle (HTTP/1.1 reaches it because the `res.stream` read short-circuits off-h2). The 1-arg shape is unaffected (its `res` stays the truthy errObj until reassigned just before the guard — why #B31 sufficed for ITS scenario). Fixed with an up-front `if (!res) { warn; return false; }` early guard before any deref (tests `controller.test.js §28`); severity LOW (only the async `downloadFromURL` path reaches it today → non-fatal `unhandledRejection`), but it lifts the #B38 qualification for the synchronous 2-arg/3-arg surface on both protocols. **Measurement-scope-gap lesson: the FIRST-proposed fix (guard the `res.stream` read only) was INSUFFICIENT — it does NOTHING on HTTP/1.1 (already short-circuits there; the crash is at the `res.error` build) and merely RELOCATES the HTTP/2 crash to that same build. The prior repro was VERBATIM-TRUNCATED at the first crash line (it ran through the `res.stream` read, saw the TypeError, STOPPED), so it proved "the crash exists" but never executed the NEXT deref and so couldn't see that guarding one site just moves the crash. A repro that stops at the first crash cannot validate a "falls through to the guard" claim — match the repro's SCOPE to the claim's scope (the "match the measurement's scope to the claim's scope" rule, applied to a runtime repro). A per-site `&& res` is whack-a-mole here (~10 derefs before the guard); one early guard covers them all.**
925
+
926
+ 179. **A `Date.now()`-prefixed ID needs a LONG random suffix — `Date.now().toString(36) + '-' + uuid()` with the 4-char default is a birthday-paradox collision (and an intermittent test flake).** In a tight insert burst many IDs share the same millisecond prefix, so uniqueness rests on the random suffix; the lib/uuid 4-char default (62^4 ≈ 14.7M) collides at ~0.02% per 100 IDs (measured). The storage plugin's record `_id` used this shape and was widened to `uuid(16)` (62^16; collision ~1e-25), mirroring the lib/collection size=16 opt-in — `_id` is opaque (written once, never parsed), so it was a safe drop-in; the storage module is bundled into the browser bundle, so the dist was rebuilt (CI tool flags, baseline-build-first → only the 4 JS bundle files changed). Rule: any `Date.now()`-prefixed ID whose uniqueness matters uses `uuid(16)`, not the default. **CI corollary — diagnose flake-vs-merge BEFORE reacting:** a Tests red that appears ONLY on the post-release `Merge tag` run on master, on the FASTER Node version, with the SAME tree green on develop, is almost always a timing-dependent flaky test (this uniqueness check — faster loop packs more calls into the same ms → higher collision odds; or the container-boot integration test's intermittent boot crash), NOT a merge problem. A job rerun (same tree → green) confirms it, and the master post-merge run fires AFTER publish so such a red never blocks the release.
927
+
928
+ 180. **`process.exit(non-zero)` TRUNCATES async stdout/stderr on a PIPE — a diagnostic printed right before exit is LOST under a container log collector or a piped test harness (the empty-log crash signature).** Node makes `process.stdout`/`process.stderr` synchronous for a TTY/file but ASYNCHRONOUS for a pipe, and `process.exit()` tears the process down without draining the async buffer — so `console.emerg(msg); process.exit(1)` (or `process.stdout.write(msg); process.exit(1)`) prints `msg` on a local TTY yet emits NOTHING when stdout is a pipe. This was the container-boot CI flake's empty-log signature (exit 1, zero captured output): the daemonless `bin/gina-container` launcher AND every framework boot exit site (gna.js abort + mount-symlink, server.js ServerEngine catch, server.isaac.js https-credentials, proc.js invalid-proc-name) all used the antipattern, so a real boot crash in a piped/containerised deployment exited silently. Fix: flush the reason SYNCHRONOUSLY with `fs.writeSync(1|2, msg)` (blocks until the bytes are handed to the pipe) BEFORE `process.exit` — the launcher routes every diagnostic through an `out()` helper (fd 1); each framework site keeps its `console.emerg`/`console.error` and adds a guaranteed `fs.writeSync(2, …)` before the exit. Behaviourally proven: under a piped stdout an early-exit message now survives (`test/core/boot-exit-flush.test.js`, both a launcher spawn and an fd-2 child); happy-path boot unchanged. **Meta-lesson: a diagnostic added at the OBSERVER (a test capturing the child's piped output, e.g. a `bootDiagnostics()` dump) cannot fix truncation that happens at the SOURCE (the crashing process) — the bytes never reach the pipe, so the observer still sees empty. Fix the flush at every `*.exit()`-after-write site, not at the reader.** Rule: any `write/log → process.exit(non-zero)` on a boot / request / CLI path that may run with piped stdio (containers, spawned children, CI) must flush synchronously first — never rely on the async writer draining before the exit.
929
+
930
+ 181. **`gina port:set --force` pins a bundle to a fixed port even when another bundle holds it — the fix for `port:reset`'s alphabetical, count-sensitive allocation drifting hardcoded ports (2026-06-14, commit `fbde6543`).** `gina port:reset @<project> --start-port-from=N` allocates by SORTING the whole project's bundle set alphabetically (`reset.js` `self.bundles.sort()`) and counting up, so the bundle→port map depends on bundle COUNT + NAMES: adding / removing / splitting a bundle shifts every alphabetically-later bundle's port (a new bundle adds 2 ports/scheme to each prior block, moving the http/2 block start, AND inserts its own name into the sort order). A one-bundle-per-container deployment that HARDCODES each bundle's port (reverse-proxy upstream / compose mapping / `PORT` env) then breaks the moment the set changes — the bundle binds the drifted registry port while the proxy still targets the old one (connection refused). Root fix: don't depend on `port:reset`'s allocation — pin each container's own bundle to its declared port with `gina port:set <bundle> @<project> --protocol=http/2.0 --scheme=https --port=<PORT> --env=<env> --force`. The new `--force` evicts the prior holder from BOTH maps (forward `ports.json` + reverse `ports.reverse.json`) then assigns; WITHOUT `--force` an in-use port is still rejected — back-compat preserved, the conflict error+exit is byte-identical, only gated on `!--force`. Idempotent (re-setting the bundle's own port is a no-op); the displaced bundle re-pins itself the next time its own context runs the same line. Eviction (not swap) is the chosen semantic: the displaced bundle simply loses that protocol/scheme slot, which suits per-container deployments where each container owns exactly one bundle. Tests: `test/lib/port-set.test.js` §02 (force source pins) / §04 (parse) / §06 (evict-both-maps + non-force-still-rejects + idempotent) / §07 (help).
931
+
932
+ 182. **Framework-connection CLI flags (`--port`/`--mq-port`/`--host-v4`/`--hostname`/`--debug-port`) must be scoped to framework-scoped commands, or a sub-topic command's `--port` corrupts the framework command-socket port in `~/.gina/<short>/settings.json` (the recurring container-boot instability, 2026-06-14, commit `85a5debf`).** These flags were hoisted into `GINA_*` for EVERY command by TWO independent arg pre-processors — `bin/cli`'s param loop AND `utils/helper.js` `filterArgs` (the generic `--k=v → GINA_K` hoister) — and `framework:init` then persists `GINA_PORT` into settings.json. So `gina port:set <bundle> --port=N` (where `--port` is the BUNDLE port) overwrote the framework command-socket port (8124 → N); every later online command read the corrupted value, and depending on timing the framework daemon itself could bind the bundle port N instead of 8124. In a one-bundle-per-container deployment that pins its bundle port, this made the bundle unhealthy on boot (`bundle:start` → `[ gina ] not started` + `ECONNREFUSED`). Fix: BOTH hoisters gate the framework-connection flags on `isFrameworkScopedCmd` — `process.argv[2]` has no `:` (bare `start`/`stop`/`restart`, which are prefixed to `framework:*` downstream) OR starts with `framework:`; for a sub-topic command the flags stay in argv for that command's own parser to read. The `--inspect`/`--debug` splice stays unconditional (`bundle:start --inspect` relies on it). **Lesson (no-fix-without-measurement): reading mis-identified the write site — the first fix (the `bin/cli` param loop only) did NOT stop the corruption; temporarily instrumenting `createFileFromDataSync` to dump the stack on any settings.json write revealed the SECOND hoister (`filterArgs`) and the actual persist site in `framework:init`. Instrument the WRITE, don't infer it from reading the hoisters.**
933
+
934
+ 183. **The framework command socket must accumulate-and-guard-parse incoming chunks — an unguarded `JSON.parse(data.toString())` on each raw `'data'` chunk is a crash vector (2026-06-14, commit `c4694bde`).** `bin/cmd`'s `launchFramework` socket handler parsed every TCP chunk directly as JSON. The client (`bin/cli`) sends `JSON.stringify(process.argv)` in a SINGLE write, but TCP may split or coalesce it across chunks, and a partial / empty / non-JSON payload makes `JSON.parse` throw a `SyntaxError`; with no try/catch and no request lifecycle around it, the throw reaches `proc.js`'s `uncaughtException` handler → emerg + `dismiss(pid, 'SIGTERM')`, dropping the command and risking a daemon teardown (same throw-site crash family as the malformed-`%` decode DoS and the boot-exit-flush truncation entries). Fix: a per-connection `_payload` accumulator (declared in the `net.createServer(function(conn){…})` closure so each connection has its own buffer); `conn.on('data')` appends, then `try { argv = JSON.parse(_payload) } catch { return }` — a partial chunk keeps accumulating until complete, a non-JSON/empty payload never parses and is ignored, and on success the buffer resets for any further command on the connection. An `!Array.isArray(argv)` guard (warn + drop) closes the residual path, since `argv.join`/`argv[0]=` sit OUTSIDE the parse try and would throw on a valid-but-non-array payload. The parse catch stays SILENT (no log): it fires on a legitimate incomplete chunk too, before it is known whether the payload will complete, so a "parse failed" log there would be misleading. Rule: never `JSON.parse` a raw socket chunk unguarded — accumulate and try/catch, and guard the post-parse shape.
935
+
936
+ 184. **`~/.gina` state files must be written ATOMICALLY (temp + rename) — a truncate-in-place `fs.writeFileSync` lets a concurrent boot read a torn/empty file and crash (#B43, 2026-06-14, commit `519788ea`).** The five state files (`main.json`/`projects.json`/`settings.json`/`env.json`/`locals.json`) were written with a bare in-place `fs.writeFileSync(target, data)` at the two write sites — the StateStore JSON sidecar (`lib/state.js` `this.write`) and the legacy fallback (`lib/generator/index.js` `createFileFromDataSync`, the single chokepoint for all ~150 state-file writes). `writeFileSync` opens with `O_TRUNC` (target → 0 bytes) then streams, so a concurrent reader catches either an EMPTY file (the post-truncate window, payload-size-independent) or a PARTIAL one (mid-`write()`, widening with file size). Every state-file READ path is FATAL on a parse failure: `requireJSON` does `console.emerg` + `process.exit(1)` for non-`/controllers/` paths, and the more common plain `require('*.json')` boot reads (`gna.js`, `config.js`, framework `start.js`, six `init.js` sites) throw an uncaught `SyntaxError` → process death. So a concurrent fleet boot (many bundles/containers booting against one `~/.gina`) intermittently crashed when a reader caught a writer mid-write; the supervisor respawned and a later non-concurrent read succeeded, presenting as an intermittent crash. MEASURED with a concurrent reader/writer race on the exact `fs.writeFileSync` primitive (empty + partial reads → `JSON.parse` `SyntaxError`; the empty-read window is always present, the partial window widens with file size). Fix: both sites write a same-dir temp (`<target>.<pid>.<seq>.tmp`) then `fs.renameSync` — `rename(2)` is atomic within a filesystem, so a reader sees the complete old file or the complete new one, never a torn one; `chmod` the temp before rename, unlink-on-failure + rethrow. The SQLite `INSERT` was already atomic — only the JSON sidecar that readers consume was torn. Because `createFileFromDataSync` is the single write chokepoint, the two edits close the window for ALL readers (`requireJSON`, plain `require`, `gina-container`'s raw `JSON.parse`). A reader-side retry in `requireJSON` was DECLINED — it covers only the `requireJSON` minority (not the plain-`require` majority), defends a window the write fix already closes, and pollutes the hot general-purpose helper while masking genuine corruption. Rule: any `~/.gina` state-file write goes through the atomic temp+rename, never a bare in-place `writeFileSync`. Tests: `test/lib/state-atomic-write.test.js` (block-scoped source pins on both sites + fs-spy behavioural on the real generator legacy + StateStore sidecar paths + the deterministic torn-read consequence).
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gina",
3
- "version": "0.5.2",
3
+ "version": "0.5.3",
4
4
  "description": "Node.js MVC framework with built-in HTTP/2, multi-bundle architecture, and scope-based data isolation — no Express dependency",
5
5
  "keywords": [
6
6
  "nodejs",
@@ -72,12 +72,12 @@
72
72
  "gina-container": "bin/gina-container",
73
73
  "gina-init": "bin/gina-init"
74
74
  },
75
- "main": "./framework/v0.5.2/core/gna",
75
+ "main": "./framework/v0.5.3/core/gna",
76
76
  "exports": {
77
77
  ".": {
78
78
  "types": "./types/index.d.ts",
79
79
  "import": "./index.mjs",
80
- "require": "./framework/v0.5.2/core/gna.js"
80
+ "require": "./framework/v0.5.3/core/gna.js"
81
81
  },
82
82
  "./gna": {
83
83
  "types": "./types/gna.d.ts",
@@ -34,12 +34,17 @@
34
34
  * are the sanctioned re-target form.
35
35
  *
36
36
  * 2. ABORT — a done (✅) row references a version NEWER than the one
37
- * being released. A feature cannot have shipped in a version that
38
- * does not exist yet; this catches target-version labels left on
39
- * rows that were flipped to before the cut. Only tokens sharing
40
- * the released version's MAJOR are compared, so dependency
41
- * versions in prose (e.g. a `2.x` template-engine floor or a
42
- * two-digit uuid major) cannot false-positive.
37
+ * being released AND newer than the latest version the timeline
38
+ * records as shipped. A feature cannot have shipped in a version
39
+ * that does not exist yet; this catches target-version labels left
40
+ * on rows that were flipped to before the cut. The comparison is
41
+ * floored at the latest shipped stable (see `latestTimelineStable`)
42
+ * so a hotfix / out-of-order cut of an OLDER line is not falsely
43
+ * blocked by the (already-shipped) newer versions it legitimately
44
+ * references. Only tokens sharing the released version's MAJOR are
45
+ * compared, so dependency versions in prose (e.g. a `2.x`
46
+ * template-engine floor or a two-digit uuid major) cannot
47
+ * false-positive.
43
48
  *
44
49
  * 3. WARN — no timeline row marks the released version ✅
45
50
  * (`` `X.Y.Z` ✅ ``). The timeline is coarse narrative, so this is
@@ -133,6 +138,34 @@ function compareVersions(a, b) {
133
138
  return 0;
134
139
  }
135
140
 
141
+ /**
142
+ * The highest STABLE version a timeline row marks as shipped
143
+ * (`` `X.Y.Z` ✅ ``) — the roadmap's own record of "newest released".
144
+ * Used to floor rule 2 so a hotfix / out-of-order cut of an older line
145
+ * is not falsely flagged for the (already-shipped) newer versions it
146
+ * legitimately references. Deliberately matches ONLY the timeline form
147
+ * (version token immediately followed by ✅); status rows put the ✅
148
+ * marker in the FIRST cell, before the version, so they never match
149
+ * here, and `-alpha` marks are ignored (the timeline records stables).
150
+ *
151
+ * @param {string} content full ROADMAP.md content
152
+ * @returns {string|null} the highest shipped stable version, or null if none
153
+ * @example
154
+ * latestTimelineStable('| **Q2** | `0.5.2` ✅ | x |\n| **Q1** | `0.5.0` ✅ | y |'); // '0.5.2'
155
+ * latestTimelineStable('| ✅ | feature | `0.5.0` | 2026-06-11 |'); // null
156
+ */
157
+ function latestTimelineStable(content) {
158
+ var re = /`(\d+\.\d+\.\d+)`\s*✅/g;
159
+ var best = null;
160
+ var m;
161
+ while ((m = re.exec(String(content || ''))) !== null) {
162
+ if (best === null || compareVersions(m[1], best) > 0) {
163
+ best = m[1];
164
+ }
165
+ }
166
+ return best;
167
+ }
168
+
136
169
  /**
137
170
  * Parse the roadmap content into status rows.
138
171
  *
@@ -173,6 +206,21 @@ function check(opts) {
173
206
  var warnings = [];
174
207
  var targetMajor = Number(String(version).split('.')[0]);
175
208
 
209
+ // Rule 2 baseline. A ✅ row may legitimately reference a version NEWER than
210
+ // the one being released when that version has ALREADY shipped — i.e. a
211
+ // hotfix / out-of-order cut of an older line, while a newer minor is already
212
+ // out. Floor the "future" comparison at the latest version the timeline
213
+ // records as shipped, so only versions newer than BOTH the target AND the
214
+ // latest release count as "does not exist yet". For a normal forward cut
215
+ // (target at or above everything shipped) the baseline collapses to the
216
+ // target and behaviour is unchanged. (Residual: a bogus ✅ row whose version
217
+ // is ALSO bogusly timeline-marked shipped escapes — a two-mistake case far
218
+ // narrower than the single jumped-ahead-label drift rule 2 targets.)
219
+ var latestStable = latestTimelineStable(content);
220
+ var futureBaseline = (latestStable && compareVersions(latestStable, version) > 0)
221
+ ? latestStable
222
+ : version;
223
+
176
224
  var rows = parseStatusRows(content);
177
225
  for (var i = 0; i < rows.length; i++) {
178
226
  var row = rows[i];
@@ -188,7 +236,7 @@ function check(opts) {
188
236
  }
189
237
  if (row.status === '✅'
190
238
  && Number(token.split('.')[0]) === targetMajor
191
- && compareVersions(token, version) > 0
239
+ && compareVersions(token, futureBaseline) > 0
192
240
  ) {
193
241
  failures.push({
194
242
  rule: 'done-row-references-future-version',
@@ -279,6 +327,7 @@ function main() {
279
327
  module.exports = {
280
328
  extractVersionTokens: extractVersionTokens,
281
329
  compareVersions: compareVersions,
330
+ latestTimelineStable: latestTimelineStable,
282
331
  parseStatusRows: parseStatusRows,
283
332
  check: check,
284
333
  isAlphaPublish: isAlphaPublish,
package/utils/helper.js CHANGED
@@ -81,6 +81,18 @@ function MainHelper(opt) {
81
81
  , err = null
82
82
  ;
83
83
 
84
+ // #B40 — Treat framework-connection flags (--port, --mq-port, --host-v4,
85
+ // --hostname, --debug-port) as framework settings ONLY for framework-scoped
86
+ // commands (bare commands like `start`/`stop`/`restart` — prefixed to
87
+ // `framework:*` downstream — or explicit `framework:*`). For a sub-topic
88
+ // command (`port:set <bundle> --port=N`, `bundle:start ... --port=N`, ...)
89
+ // `--port` is the BUNDLE's port; hoisting it into GINA_PORT made
90
+ // framework:init overwrite the framework socket port in
91
+ // ~/.gina/<short>/settings.json, so later online commands connected to the
92
+ // wrong port and reported "[ gina ] not started".
93
+ var _topic = ( typeof(process.argv[2]) != 'undefined' ) ? process.argv[2] : '';
94
+ var _isFrameworkScopedCmd = ( _topic.indexOf(':') < 0 || /^framework:/.test(_topic) );
95
+
84
96
  if ( typeof(process.env['gina']) == 'undefined') {
85
97
  process.env['gina'] = {}
86
98
  }
@@ -93,6 +105,16 @@ function MainHelper(opt) {
93
105
  continue;
94
106
  }
95
107
 
108
+ // #B40 — don't hoist framework-connection flags for sub-topic
109
+ // commands; keep them in argv for the sub-command's own parser
110
+ // (e.g. port:set reads --port itself). Framework-scoped commands
111
+ // still hoist them (so `gina start --port=N` / `framework:set
112
+ // --port=N` persist to settings.json as intended).
113
+ if ( !_isFrameworkScopedCmd && /^\-\-(port|mq-port|host-v4|hostname|debug-port|debug_port)=/.test(process.argv[a]) ) {
114
+ newArgv[a] = process.argv[a];
115
+ continue;
116
+ }
117
+
96
118
 
97
119
  // Split on the first `=` only. Values with `=` (e.g.
98
120
  // `--driver-version=">=5.3.0 <6.0.0"`, base64-ish passwords,
@@ -1 +0,0 @@
1
- 0.5.2
File without changes
File without changes