gina 0.3.9 → 0.3.10

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 (391) hide show
  1. package/.github/scripts/scan-vendored-cves.js +1 -1
  2. package/.github/workflows/bundle-freshness.yml +3 -3
  3. package/.github/workflows/security.yml +52 -0
  4. package/.github/workflows/vendored-cve.yml +2 -2
  5. package/CHANGELOG.md +12 -4
  6. package/README.md +5 -8
  7. package/ROADMAP.md +1 -0
  8. package/framework/v0.3.10/VERSION +1 -0
  9. package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/js/gina.js +396 -295
  10. package/framework/v0.3.10/core/asset/plugin/dist/vendor/gina/js/gina.min.js +548 -0
  11. package/framework/v0.3.10/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  12. package/framework/v0.3.10/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  13. package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/session-store.v4.js +1 -1
  14. package/framework/{v0.3.9 → v0.3.10}/core/controller/controller.js +19 -1
  15. package/framework/{v0.3.9 → v0.3.10}/core/controller/controller.render-nunjucks.js +8 -8
  16. package/framework/{v0.3.9 → v0.3.10}/core/gna.js +1 -1
  17. package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/session/src/main.js +2 -2
  18. package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/validator/src/main.js +388 -292
  19. package/framework/{v0.3.9 → v0.3.10}/core/server.isaac.js +16 -0
  20. package/framework/{v0.3.9 → v0.3.10}/core/server.js +4 -4
  21. package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/migrate.js +1 -1
  22. package/framework/{v0.3.9 → v0.3.10}/lib/cmd/inspector/help.txt +2 -2
  23. package/framework/{v0.3.9 → v0.3.10}/lib/collection/src/main.js +8 -3
  24. package/framework/{v0.3.9 → v0.3.10}/package.json +1 -1
  25. package/gna.js +4 -4
  26. package/llms.txt +21 -7
  27. package/package.json +3 -2
  28. package/resources/git-hooks/pre-commit +4 -1
  29. package/script/_load_private_tokens.js +77 -0
  30. package/script/check_no_local_leak.js +49 -21
  31. package/script/retry_lockfile_sync.js +85 -0
  32. package/framework/v0.3.9/VERSION +0 -1
  33. package/framework/v0.3.9/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -545
  34. package/framework/v0.3.9/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  35. package/framework/v0.3.9/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  36. /package/framework/{v0.3.9 → v0.3.10}/AUTHORS +0 -0
  37. /package/framework/{v0.3.9 → v0.3.10}/LICENSE +0 -0
  38. /package/framework/{v0.3.9 → v0.3.10}/core/asset/html/nolayout.html +0 -0
  39. /package/framework/{v0.3.9 → v0.3.10}/core/asset/html/static.html +0 -0
  40. /package/framework/{v0.3.9 → v0.3.10}/core/asset/img/android-chrome-192x192.png +0 -0
  41. /package/framework/{v0.3.9 → v0.3.10}/core/asset/img/android-chrome-512x512.png +0 -0
  42. /package/framework/{v0.3.9 → v0.3.10}/core/asset/img/apple-touch-icon.png +0 -0
  43. /package/framework/{v0.3.9 → v0.3.10}/core/asset/img/favicon-16x16.png +0 -0
  44. /package/framework/{v0.3.9 → v0.3.10}/core/asset/img/favicon-32x32.png +0 -0
  45. /package/framework/{v0.3.9 → v0.3.10}/core/asset/img/favicon.ico +0 -0
  46. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/README.md +0 -0
  47. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  48. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  49. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  50. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  51. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  52. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  53. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  54. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  55. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  56. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  57. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  58. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  59. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  60. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  61. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  62. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  63. /package/framework/{v0.3.9 → v0.3.10}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  64. /package/framework/{v0.3.9 → v0.3.10}/core/config.js +0 -0
  65. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/ai/index.js +0 -0
  66. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/ai/lib/connector.js +0 -0
  67. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/index.js +0 -0
  68. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/connector.js +0 -0
  69. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/connector.v2.js +0 -0
  70. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  71. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  72. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/n1ql.js +0 -0
  73. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/session-store.js +0 -0
  74. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
  75. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  76. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/mysql/index.js +0 -0
  77. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/mysql/lib/connector.js +0 -0
  78. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/postgresql/index.js +0 -0
  79. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/postgresql/lib/connector.js +0 -0
  80. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/redis/index.js +0 -0
  81. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/redis/lib/session-store.js +0 -0
  82. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/sql-parser.js +0 -0
  83. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/sqlite/index.js +0 -0
  84. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/sqlite/lib/connector.js +0 -0
  85. /package/framework/{v0.3.9 → v0.3.10}/core/connectors/sqlite/lib/session-store.js +0 -0
  86. /package/framework/{v0.3.9 → v0.3.10}/core/content.encoding +0 -0
  87. /package/framework/{v0.3.9 → v0.3.10}/core/controller/controller.framework.js +0 -0
  88. /package/framework/{v0.3.9 → v0.3.10}/core/controller/controller.render-json.js +0 -0
  89. /package/framework/{v0.3.9 → v0.3.10}/core/controller/controller.render-stream.js +0 -0
  90. /package/framework/{v0.3.9 → v0.3.10}/core/controller/controller.render-swig.js +0 -0
  91. /package/framework/{v0.3.9 → v0.3.10}/core/controller/controller.render-v1.js +0 -0
  92. /package/framework/{v0.3.9 → v0.3.10}/core/controller/index.js +0 -0
  93. /package/framework/{v0.3.9 → v0.3.10}/core/deps/busboy-1.6.0/LICENSE +0 -0
  94. /package/framework/{v0.3.9 → v0.3.10}/core/deps/busboy-1.6.0/README.md +0 -0
  95. /package/framework/{v0.3.9 → v0.3.10}/core/deps/busboy-1.6.0/lib/index.js +0 -0
  96. /package/framework/{v0.3.9 → v0.3.10}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
  97. /package/framework/{v0.3.9 → v0.3.10}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
  98. /package/framework/{v0.3.9 → v0.3.10}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
  99. /package/framework/{v0.3.9 → v0.3.10}/core/deps/busboy-1.6.0/package.json +0 -0
  100. /package/framework/{v0.3.9 → v0.3.10}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
  101. /package/framework/{v0.3.9 → v0.3.10}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
  102. /package/framework/{v0.3.9 → v0.3.10}/core/deps/streamsearch-1.1.0/package.json +0 -0
  103. /package/framework/{v0.3.9 → v0.3.10}/core/dev/index.js +0 -0
  104. /package/framework/{v0.3.9 → v0.3.10}/core/dev/lib/class.js +0 -0
  105. /package/framework/{v0.3.9 → v0.3.10}/core/dev/lib/factory.js +0 -0
  106. /package/framework/{v0.3.9 → v0.3.10}/core/dev/lib/tools.js +0 -0
  107. /package/framework/{v0.3.9 → v0.3.10}/core/locales/README.md +0 -0
  108. /package/framework/{v0.3.9 → v0.3.10}/core/locales/currency.json +0 -0
  109. /package/framework/{v0.3.9 → v0.3.10}/core/locales/dist/language/en.json +0 -0
  110. /package/framework/{v0.3.9 → v0.3.10}/core/locales/dist/language/fr.json +0 -0
  111. /package/framework/{v0.3.9 → v0.3.10}/core/locales/dist/region/en.json +0 -0
  112. /package/framework/{v0.3.9 → v0.3.10}/core/locales/dist/region/fr.json +0 -0
  113. /package/framework/{v0.3.9 → v0.3.10}/core/locales/index.js +0 -0
  114. /package/framework/{v0.3.9 → v0.3.10}/core/mime.types +0 -0
  115. /package/framework/{v0.3.9 → v0.3.10}/core/model/entity.js +0 -0
  116. /package/framework/{v0.3.9 → v0.3.10}/core/model/index.js +0 -0
  117. /package/framework/{v0.3.9 → v0.3.10}/core/model/template/entityFactory.js +0 -0
  118. /package/framework/{v0.3.9 → v0.3.10}/core/model/template/index.js +0 -0
  119. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/README.md +0 -0
  120. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/index.js +0 -0
  121. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/csrf/README.md +0 -0
  122. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/csrf/package.json +0 -0
  123. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/csrf/src/main.js +0 -0
  124. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/file/README.md +0 -0
  125. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/file/build.json +0 -0
  126. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/file/package.json +0 -0
  127. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/intl/README.md +0 -0
  128. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/intl/build.json +0 -0
  129. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/intl/package.json +0 -0
  130. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/intl/src/main.js +0 -0
  131. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/session/README.md +0 -0
  132. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/session/package.json +0 -0
  133. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/storage/README.md +0 -0
  134. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/storage/build.json +0 -0
  135. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/storage/package.json +0 -0
  136. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/storage/src/main.js +0 -0
  137. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/validator/README.md +0 -0
  138. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/validator/build.json +0 -0
  139. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/validator/package.json +0 -0
  140. /package/framework/{v0.3.9 → v0.3.10}/core/plugins/lib/validator/src/form-validator.js +0 -0
  141. /package/framework/{v0.3.9 → v0.3.10}/core/router.js +0 -0
  142. /package/framework/{v0.3.9 → v0.3.10}/core/server.express.js +0 -0
  143. /package/framework/{v0.3.9 → v0.3.10}/core/status.codes +0 -0
  144. /package/framework/{v0.3.9 → v0.3.10}/core/template/_gitignore +0 -0
  145. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/config/app.json +0 -0
  146. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  147. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/config/routing.json +0 -0
  148. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/config/settings.json +0 -0
  149. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  150. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/config/templates.json +0 -0
  151. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  152. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  153. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  154. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  155. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle/index.js +0 -0
  156. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  157. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  158. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  159. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  160. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  161. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  162. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_public/readme.md +0 -0
  163. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  164. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  165. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  166. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  167. /package/framework/{v0.3.9 → v0.3.10}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  168. /package/framework/{v0.3.9 → v0.3.10}/core/template/command/gina.bat.tpl +0 -0
  169. /package/framework/{v0.3.9 → v0.3.10}/core/template/command/gina.tpl +0 -0
  170. /package/framework/{v0.3.9 → v0.3.10}/core/template/conf/env.json +0 -0
  171. /package/framework/{v0.3.9 → v0.3.10}/core/template/conf/manifest.json +0 -0
  172. /package/framework/{v0.3.9 → v0.3.10}/core/template/conf/package.json +0 -0
  173. /package/framework/{v0.3.9 → v0.3.10}/core/template/conf/settings.json +0 -0
  174. /package/framework/{v0.3.9 → v0.3.10}/core/template/conf/statics.json +0 -0
  175. /package/framework/{v0.3.9 → v0.3.10}/core/template/conf/templates.json +0 -0
  176. /package/framework/{v0.3.9 → v0.3.10}/core/template/error/client/json/401.json +0 -0
  177. /package/framework/{v0.3.9 → v0.3.10}/core/template/error/client/json/403.json +0 -0
  178. /package/framework/{v0.3.9 → v0.3.10}/core/template/error/client/json/404.json +0 -0
  179. /package/framework/{v0.3.9 → v0.3.10}/core/template/error/server/html/50x.html +0 -0
  180. /package/framework/{v0.3.9 → v0.3.10}/core/template/error/server/json/500.json +0 -0
  181. /package/framework/{v0.3.9 → v0.3.10}/core/template/error/server/json/503.json +0 -0
  182. /package/framework/{v0.3.9 → v0.3.10}/core/template/extensions/logger/config.json +0 -0
  183. /package/framework/{v0.3.9 → v0.3.10}/helpers/console.js +0 -0
  184. /package/framework/{v0.3.9 → v0.3.10}/helpers/context.js +0 -0
  185. /package/framework/{v0.3.9 → v0.3.10}/helpers/data/LICENSE +0 -0
  186. /package/framework/{v0.3.9 → v0.3.10}/helpers/data/README.md +0 -0
  187. /package/framework/{v0.3.9 → v0.3.10}/helpers/data/package.json +0 -0
  188. /package/framework/{v0.3.9 → v0.3.10}/helpers/data/src/main.js +0 -0
  189. /package/framework/{v0.3.9 → v0.3.10}/helpers/dateFormat.js +0 -0
  190. /package/framework/{v0.3.9 → v0.3.10}/helpers/index.js +0 -0
  191. /package/framework/{v0.3.9 → v0.3.10}/helpers/json/LICENSE +0 -0
  192. /package/framework/{v0.3.9 → v0.3.10}/helpers/json/README.md +0 -0
  193. /package/framework/{v0.3.9 → v0.3.10}/helpers/json/package.json +0 -0
  194. /package/framework/{v0.3.9 → v0.3.10}/helpers/json/src/main.js +0 -0
  195. /package/framework/{v0.3.9 → v0.3.10}/helpers/path.js +0 -0
  196. /package/framework/{v0.3.9 → v0.3.10}/helpers/plugins/README.md +0 -0
  197. /package/framework/{v0.3.9 → v0.3.10}/helpers/plugins/package.json +0 -0
  198. /package/framework/{v0.3.9 → v0.3.10}/helpers/plugins/src/api-error.js +0 -0
  199. /package/framework/{v0.3.9 → v0.3.10}/helpers/plugins/src/main.js +0 -0
  200. /package/framework/{v0.3.9 → v0.3.10}/helpers/prototypes.js +0 -0
  201. /package/framework/{v0.3.9 → v0.3.10}/helpers/task.js +0 -0
  202. /package/framework/{v0.3.9 → v0.3.10}/helpers/text.js +0 -0
  203. /package/framework/{v0.3.9 → v0.3.10}/lib/archiver/README.md +0 -0
  204. /package/framework/{v0.3.9 → v0.3.10}/lib/archiver/build.json +0 -0
  205. /package/framework/{v0.3.9 → v0.3.10}/lib/archiver/package.json +0 -0
  206. /package/framework/{v0.3.9 → v0.3.10}/lib/archiver/src/dep/jszip.min.js +0 -0
  207. /package/framework/{v0.3.9 → v0.3.10}/lib/archiver/src/main.js +0 -0
  208. /package/framework/{v0.3.9 → v0.3.10}/lib/async/package.json +0 -0
  209. /package/framework/{v0.3.9 → v0.3.10}/lib/async/src/main.js +0 -0
  210. /package/framework/{v0.3.9 → v0.3.10}/lib/cache/README.md +0 -0
  211. /package/framework/{v0.3.9 → v0.3.10}/lib/cache/build.json +0 -0
  212. /package/framework/{v0.3.9 → v0.3.10}/lib/cache/package.json +0 -0
  213. /package/framework/{v0.3.9 → v0.3.10}/lib/cache/src/main.js +0 -0
  214. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/aliases.json +0 -0
  215. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/add.js +0 -0
  216. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/arguments.json +0 -0
  217. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/build.js +0 -0
  218. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/copy.js +0 -0
  219. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/cp.js +0 -0
  220. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/help.js +0 -0
  221. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/help.txt +0 -0
  222. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/list.js +0 -0
  223. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/mcp-start.js +0 -0
  224. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/mcp.js +0 -0
  225. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/oas.js +0 -0
  226. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/openapi.js +0 -0
  227. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/remove.js +0 -0
  228. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/rename.js +0 -0
  229. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/restart.js +0 -0
  230. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/rm.js +0 -0
  231. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/start.js +0 -0
  232. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/status.js +0 -0
  233. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/bundle/stop.js +0 -0
  234. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/cache/stats.js +0 -0
  235. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/add.js +0 -0
  236. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/arguments.json +0 -0
  237. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/help.js +0 -0
  238. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/help.txt +0 -0
  239. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/list.js +0 -0
  240. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/remove.js +0 -0
  241. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/connector/rm.js +0 -0
  242. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/add.js +0 -0
  243. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/get.js +0 -0
  244. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/help.js +0 -0
  245. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/help.txt +0 -0
  246. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/link-dev.js +0 -0
  247. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/list.js +0 -0
  248. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/remove.js +0 -0
  249. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/rm.js +0 -0
  250. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/set.js +0 -0
  251. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/unset.js +0 -0
  252. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/env/use.js +0 -0
  253. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/arguments.json +0 -0
  254. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/build.js +0 -0
  255. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/dot.js +0 -0
  256. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/get.js +0 -0
  257. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/help.js +0 -0
  258. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/help.txt +0 -0
  259. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/init.js +0 -0
  260. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/link-node-modules.js +0 -0
  261. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/link.js +0 -0
  262. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/msg.json +0 -0
  263. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/open.js +0 -0
  264. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/restart.js +0 -0
  265. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/set.js +0 -0
  266. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/start.js +0 -0
  267. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/status.js +0 -0
  268. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/stop.js +0 -0
  269. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/tail.js +0 -0
  270. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/update.js +0 -0
  271. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/framework/version.js +0 -0
  272. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/gina-dev.1.md +0 -0
  273. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/gina-framework.1.md +0 -0
  274. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/gina.1.md +0 -0
  275. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/helper.js +0 -0
  276. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/index.js +0 -0
  277. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/inspector/help.js +0 -0
  278. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/inspector/open.js +0 -0
  279. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/minion/help.js +0 -0
  280. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/minion/help.txt +0 -0
  281. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/msg.json +0 -0
  282. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/port/help.js +0 -0
  283. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/port/help.txt +0 -0
  284. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/port/inc/scan.js +0 -0
  285. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/port/list.js +0 -0
  286. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/port/reset.js +0 -0
  287. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/port/set.js +0 -0
  288. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/add.js +0 -0
  289. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/arguments.json +0 -0
  290. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/build.js +0 -0
  291. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/help.js +0 -0
  292. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/help.txt +0 -0
  293. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/import.js +0 -0
  294. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/list.js +0 -0
  295. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/move.js +0 -0
  296. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/remove.js +0 -0
  297. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/rename.js +0 -0
  298. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/restart.js +0 -0
  299. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/rm.js +0 -0
  300. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/start.js +0 -0
  301. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/status.js +0 -0
  302. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/project/stop.js +0 -0
  303. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/protocol/help.js +0 -0
  304. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/protocol/help.txt +0 -0
  305. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/protocol/list.js +0 -0
  306. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/protocol/set.js +0 -0
  307. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/add.js +0 -0
  308. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/help.js +0 -0
  309. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/help.txt +0 -0
  310. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/link-local.js +0 -0
  311. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/link-production.js +0 -0
  312. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/list.js +0 -0
  313. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/remove.js +0 -0
  314. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/rm.js +0 -0
  315. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/scope/use.js +0 -0
  316. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/service/help.js +0 -0
  317. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/service/help.txt +0 -0
  318. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/service/list.js +0 -0
  319. /package/framework/{v0.3.9 → v0.3.10}/lib/cmd/view/add.js +0 -0
  320. /package/framework/{v0.3.9 → v0.3.10}/lib/collection/README.md +0 -0
  321. /package/framework/{v0.3.9 → v0.3.10}/lib/collection/build.json +0 -0
  322. /package/framework/{v0.3.9 → v0.3.10}/lib/collection/package.json +0 -0
  323. /package/framework/{v0.3.9 → v0.3.10}/lib/config.js +0 -0
  324. /package/framework/{v0.3.9 → v0.3.10}/lib/connector-registry/package.json +0 -0
  325. /package/framework/{v0.3.9 → v0.3.10}/lib/connector-registry/src/main.js +0 -0
  326. /package/framework/{v0.3.9 → v0.3.10}/lib/cron/README.md +0 -0
  327. /package/framework/{v0.3.9 → v0.3.10}/lib/cron/package.json +0 -0
  328. /package/framework/{v0.3.9 → v0.3.10}/lib/cron/src/main.js +0 -0
  329. /package/framework/{v0.3.9 → v0.3.10}/lib/domain/LICENSE +0 -0
  330. /package/framework/{v0.3.9 → v0.3.10}/lib/domain/README.md +0 -0
  331. /package/framework/{v0.3.9 → v0.3.10}/lib/domain/package.json +0 -0
  332. /package/framework/{v0.3.9 → v0.3.10}/lib/domain/src/main.js +0 -0
  333. /package/framework/{v0.3.9 → v0.3.10}/lib/generator/index.js +0 -0
  334. /package/framework/{v0.3.9 → v0.3.10}/lib/index.js +0 -0
  335. /package/framework/{v0.3.9 → v0.3.10}/lib/inherits/LICENSE +0 -0
  336. /package/framework/{v0.3.9 → v0.3.10}/lib/inherits/README.md +0 -0
  337. /package/framework/{v0.3.9 → v0.3.10}/lib/inherits/package.json +0 -0
  338. /package/framework/{v0.3.9 → v0.3.10}/lib/inherits/src/main.js +0 -0
  339. /package/framework/{v0.3.9 → v0.3.10}/lib/inspector-redact/package.json +0 -0
  340. /package/framework/{v0.3.9 → v0.3.10}/lib/inspector-redact/src/main.js +0 -0
  341. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/README.md +0 -0
  342. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/package.json +0 -0
  343. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/containers/default/index.js +0 -0
  344. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/containers/file/index.js +0 -0
  345. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  346. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  347. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/containers/mq/index.js +0 -0
  348. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/containers/mq/listener.js +0 -0
  349. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/containers/mq/speaker.js +0 -0
  350. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/helper.js +0 -0
  351. /package/framework/{v0.3.9 → v0.3.10}/lib/logger/src/main.js +0 -0
  352. /package/framework/{v0.3.9 → v0.3.10}/lib/math/index.js +0 -0
  353. /package/framework/{v0.3.9 → v0.3.10}/lib/mcp-dispatch/package.json +0 -0
  354. /package/framework/{v0.3.9 → v0.3.10}/lib/mcp-dispatch/src/main.js +0 -0
  355. /package/framework/{v0.3.9 → v0.3.10}/lib/mcp-http/package.json +0 -0
  356. /package/framework/{v0.3.9 → v0.3.10}/lib/mcp-http/src/main.js +0 -0
  357. /package/framework/{v0.3.9 → v0.3.10}/lib/mcp-server/package.json +0 -0
  358. /package/framework/{v0.3.9 → v0.3.10}/lib/mcp-server/src/main.js +0 -0
  359. /package/framework/{v0.3.9 → v0.3.10}/lib/merge/README.md +0 -0
  360. /package/framework/{v0.3.9 → v0.3.10}/lib/merge/package.json +0 -0
  361. /package/framework/{v0.3.9 → v0.3.10}/lib/merge/src/main.js +0 -0
  362. /package/framework/{v0.3.9 → v0.3.10}/lib/model.js +0 -0
  363. /package/framework/{v0.3.9 → v0.3.10}/lib/nunjucks-filters/README.md +0 -0
  364. /package/framework/{v0.3.9 → v0.3.10}/lib/nunjucks-filters/package.json +0 -0
  365. /package/framework/{v0.3.9 → v0.3.10}/lib/nunjucks-filters/src/main.js +0 -0
  366. /package/framework/{v0.3.9 → v0.3.10}/lib/nunjucks-resolver/package.json +0 -0
  367. /package/framework/{v0.3.9 → v0.3.10}/lib/nunjucks-resolver/src/main.js +0 -0
  368. /package/framework/{v0.3.9 → v0.3.10}/lib/proc.js +0 -0
  369. /package/framework/{v0.3.9 → v0.3.10}/lib/routing/README.md +0 -0
  370. /package/framework/{v0.3.9 → v0.3.10}/lib/routing/build.json +0 -0
  371. /package/framework/{v0.3.9 → v0.3.10}/lib/routing/package.json +0 -0
  372. /package/framework/{v0.3.9 → v0.3.10}/lib/routing/src/main.js +0 -0
  373. /package/framework/{v0.3.9 → v0.3.10}/lib/routing/src/radix.js +0 -0
  374. /package/framework/{v0.3.9 → v0.3.10}/lib/routing-introspect/package.json +0 -0
  375. /package/framework/{v0.3.9 → v0.3.10}/lib/routing-introspect/src/main.js +0 -0
  376. /package/framework/{v0.3.9 → v0.3.10}/lib/session-store.js +0 -0
  377. /package/framework/{v0.3.9 → v0.3.10}/lib/shell.js +0 -0
  378. /package/framework/{v0.3.9 → v0.3.10}/lib/state.js +0 -0
  379. /package/framework/{v0.3.9 → v0.3.10}/lib/swig-filters/README.md +0 -0
  380. /package/framework/{v0.3.9 → v0.3.10}/lib/swig-filters/package.json +0 -0
  381. /package/framework/{v0.3.9 → v0.3.10}/lib/swig-filters/src/main.js +0 -0
  382. /package/framework/{v0.3.9 → v0.3.10}/lib/swig-resolver/package.json +0 -0
  383. /package/framework/{v0.3.9 → v0.3.10}/lib/swig-resolver/src/main.js +0 -0
  384. /package/framework/{v0.3.9 → v0.3.10}/lib/url/README.md +0 -0
  385. /package/framework/{v0.3.9 → v0.3.10}/lib/url/index.js +0 -0
  386. /package/framework/{v0.3.9 → v0.3.10}/lib/url/routing.json +0 -0
  387. /package/framework/{v0.3.9 → v0.3.10}/lib/uuid/package.json +0 -0
  388. /package/framework/{v0.3.9 → v0.3.10}/lib/uuid/src/main.js +0 -0
  389. /package/framework/{v0.3.9 → v0.3.10}/lib/validator.js +0 -0
  390. /package/framework/{v0.3.9 → v0.3.10}/lib/watcher/package.json +0 -0
  391. /package/framework/{v0.3.9 → v0.3.10}/lib/watcher/src/main.js +0 -0
@@ -14,7 +14,7 @@
14
14
  * `(name, version)` pairs, queries `api.osv.dev`, and exits non-zero if
15
15
  * any vulnerability is matched.
16
16
  *
17
- * Pinning convention (see .claude/architecture/vendored-deps.md): the
17
+ * Pinning convention (see internal architecture docs): the
18
18
  * vendored `package.json` stays byte-identical to upstream until
19
19
  * patched; on patch, `version` is bumped to `<upstream>-rhinostone.N`
20
20
  * (e.g. `1.6.0-rhinostone.1`). This script strips the
@@ -34,15 +34,15 @@ jobs:
34
34
  timeout-minutes: 10
35
35
  steps:
36
36
  - name: Checkout
37
- uses: actions/checkout@v4
37
+ uses: actions/checkout@v6
38
38
 
39
39
  - name: Set up Node.js
40
- uses: actions/setup-node@v4
40
+ uses: actions/setup-node@v6
41
41
  with:
42
42
  node-version: '22'
43
43
 
44
44
  - name: Set up Java (for Closure Compiler)
45
- uses: actions/setup-java@v4
45
+ uses: actions/setup-java@v5
46
46
  with:
47
47
  distribution: 'temurin'
48
48
  java-version: '21'
@@ -30,3 +30,55 @@ jobs:
30
30
  exit 1
31
31
  fi
32
32
  echo "OK: no local-tool paths in git index."
33
+
34
+ ai-attribution-content-scan:
35
+ name: AI-attribution content scan
36
+ runs-on: ubuntu-latest
37
+
38
+ steps:
39
+ - uses: actions/checkout@v6
40
+
41
+ # #S7 — CI mirror of the pre-commit hook's content-scan section.
42
+ # While #S6 catches LOCAL-TOOL PATHS (file names), #S7 catches
43
+ # AI-ATTRIBUTION SUBSTRINGS in tracked file CONTENT. Pattern must
44
+ # stay in sync with .githooks/pre-commit. Documented exceptions:
45
+ # - Protocol identifiers used by the AI connector (anthropic://,
46
+ # openai://, deepseek://, qwen://, groq://, mistral://, gemini://,
47
+ # xai://, perplexity://, ollama://)
48
+ # - Vendor SDK package names (@anthropic-ai/sdk, openai npm package)
49
+ # - Canonical env-var names (ANTHROPIC_API_KEY, OPENAI_API_KEY)
50
+ # Files where these patterns appear by design (this workflow, the
51
+ # local hook, the prepack scanner) and auto-generated dist artefacts
52
+ # (browser bundles, minified output, source maps) are excluded — the
53
+ # source-side scan catches the leak before it reaches dist.
54
+ - name: Scan tracked content for AI-attribution leaks
55
+ run: |
56
+ LEAK_RE='\.claude/|\.claudeignore|claude\.ai|claude\.com/claude-code|Co-Authored-By:?[^\n]{0,30}(Claude|Anthropic)|Generated (by|with)[^\n]{0,30}Claude|🤖[^\n]{0,30}Claude'
57
+ EXCEPTION_RE='anthropic://|openai://|deepseek://|qwen://|groq://|mistral://|gemini://|xai://|perplexity://|ollama://|@anthropic-ai/sdk|ANTHROPIC_API_KEY|OPENAI_API_KEY'
58
+ EXCLUDED='^(\.githooks/pre-commit|\.github/workflows/security\.yml|script/check_no_local_leak\.js|script/prepare_version\.js|\.gitignore|\.npmignore|framework/v[^/]+/core/asset/plugin/dist/.*|.*\.(min\.(js|css)(\.br|\.gz)?|map))$'
59
+
60
+ found=0
61
+ while IFS= read -r f; do
62
+ if echo "$f" | grep -qE "$EXCLUDED"; then continue; fi
63
+ case "$f" in
64
+ *.png|*.jpg|*.jpeg|*.gif|*.svg|*.woff|*.woff2|*.ttf|*.ico|*.jar|*.zip|*.tar|*.gz|*.br|*.afdesign|*.pdf|*.mp3|*.mp4|*.heic|*.webp) continue ;;
65
+ esac
66
+ size=$(stat -c%s "$f" 2>/dev/null || stat -f%z "$f" 2>/dev/null || echo 0)
67
+ if [ "$size" -gt 2097152 ]; then continue; fi
68
+ stripped=$(sed -E "s#$EXCEPTION_RE##gI" "$f" 2>/dev/null || true)
69
+ if printf '%s' "$stripped" | grep -qiE "$LEAK_RE"; then
70
+ echo "::error file=$f::AI-attribution leak in tracked content"
71
+ printf '%s' "$stripped" | grep -niE "$LEAK_RE" | head -3 | sed 's/^/ /'
72
+ found=1
73
+ fi
74
+ done < <(git ls-files)
75
+
76
+ if [ "$found" = "1" ]; then
77
+ echo ""
78
+ echo "These mentions must not reach a public surface."
79
+ echo "Allowed exceptions (already filtered): protocol identifiers (anthropic://"
80
+ echo "and siblings), vendor SDK package names (@anthropic-ai/sdk, openai),"
81
+ echo "canonical env-var names (ANTHROPIC_API_KEY, OPENAI_API_KEY)."
82
+ exit 1
83
+ fi
84
+ echo "OK: no AI-attribution leaks in tracked content."
@@ -25,10 +25,10 @@ jobs:
25
25
  timeout-minutes: 5
26
26
  steps:
27
27
  - name: Checkout
28
- uses: actions/checkout@v4
28
+ uses: actions/checkout@v6
29
29
 
30
30
  - name: Set up Node.js
31
- uses: actions/setup-node@v4
31
+ uses: actions/setup-node@v6
32
32
  with:
33
33
  node-version: '22'
34
34
 
package/CHANGELOG.md CHANGED
@@ -6,6 +6,14 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html),
6
6
  and is generated by [Changie](https://github.com/miniscruff/changie).
7
7
 
8
8
 
9
+ ## 0.3.10 - 2026-05-06
10
+ ### Added
11
+ * Reverse-proxy path-prefix awareness via the standard `X-Forwarded-Prefix` request header. When a reverse proxy (nginx, Traefik, etc.) mounts the bundle on a sub-path and forwards `proxy_set_header X-Forwarded-Prefix /sub;`, the framework composes a public webroot (proxy prefix + bundle internal `server.webroot`) and templates that into `gina.config.webroot`. Client-side URL construction (`/_gina/assets/routing.json` fetch, the `gina.min.css` link injection, etc.) now targets the correct upstream through the proxy instead of root-relative URLs that would route to whichever bundle answered `/`. Header value is normalised (leading slash, trailing slashes stripped, empty / "/" dropped); back-compat preserved when the header is absent.
12
+ ### Fixed
13
+ * FormValidator binding for HTML5 form-reassociated controls (`form="X"` attribute) — `bindForm` now uses `HTMLFormControlsCollection` (`form.elements`) for owner-aware control collection, attaches per-control listeners on reassociated controls (out-of-tree controls whose events don't bubble to the form), and `unbindForm` symmetrically drains the side-table on cleanup. Parent forms no longer accidentally collect descendants reassociated to other forms.
14
+ * FormValidator radio mutual-exclusion grouping for HTML5 form-reassociated controls (`form="X"` attribute). `updateRadio` now scopes the peer set by form-owner — same-name radios in different form-owners are no longer cross-fired into each other's mutual-exclusion loop — and reconciles the IDL `.checked` property with the `checked` HTML attribute on init when they disagree, recovering author intent for radios that surface the parse-time IDL/attribute desync browsers produce in mixed DOM-tree + form-owner layouts.
15
+ * FormValidator restoring the wrong radio option on form-reset for HTML5 form-reassociated controls — sister fix to the `updateRadio` parse-time IDL/attribute reconciliation. `bindForm`'s `fieldsSet[id].defaultChecked` cache now reads the IDL `defaultChecked` property (which mirrors the HTML `checked` content attribute) instead of the live `.checked`. For form-reassociated radios hit by Chromium's parse-time IDL desync, `.checked` reads FALSE at bind time despite the attribute being present, so the cache would hold the wrong default and a `type="reset"` action on the form would clear the originally-checked option. No-op for the normal single-form-owner shape.
16
+
9
17
  ## 0.3.9 - 2026-05-04
10
18
  ### Added
11
19
  * Add a `process.gina._bundleFilterWraps[bundleName]` hook so bundles can wrap nunjucks filters at render time. Bundle-level monkey-patches on `lib.nunjucksFilters` do not survive `refreshCore()` (which creates a fresh lib singleton ~per-request in dev mode); the framework now applies registered wraps inside `registerGinaFilters` after the per-request filter factory runs.
@@ -32,7 +40,7 @@ and is generated by [Changie](https://github.com/miniscruff/changie).
32
40
 
33
41
  ## 0.3.7-alpha.10 - 2026-04-26 (npm only — no git tag)
34
42
  ### Fixed
35
- * `gina.plugins.Session()` no longer clobbers the wrapper's `Function.name` property. Bundles that introspect the wrapper (`require('gina').plugins.Session(require('express-session')).name`) now see `'session'` (matching upstream) instead of `'ginaSession'`. Achieved via a small refactor: the outer wrapper delegates to an inner `ginaSessionDispatch` named function, with `Object.defineProperty(wrapped, 'name', { value: expressSession.name, configurable: true })` overriding the outer `.name`. The inner `ginaSessionDispatch` frame stays visible in stack traces, so gina remains detectable for debugging while the public-facing identity is the upstream's. Static-surface preservation (`Store`, `MemoryStore`, `Session`, `Cookie`) and the SameSite=None invariant are unchanged. 2 new unit tests in `test/core/session-plugin.test.js` (drop-in identity assertion + stack-trace visibility lock). Full suite 3768/3768 (3766 baseline + 2 new). Surfaced from a freelancer/v3 session: "Gina's wrapper clobbering expressSession.name — is an upstream concern".
43
+ * `gina.plugins.Session()` no longer clobbers the wrapper's `Function.name` property. Bundles that introspect the wrapper (`require('gina').plugins.Session(require('express-session')).name`) now see `'session'` (matching upstream) instead of `'ginaSession'`. Achieved via a small refactor: the outer wrapper delegates to an inner `ginaSessionDispatch` named function, with `Object.defineProperty(wrapped, 'name', { value: expressSession.name, configurable: true })` overriding the outer `.name`. The inner `ginaSessionDispatch` frame stays visible in stack traces, so gina remains detectable for debugging while the public-facing identity is the upstream's. Static-surface preservation (`Store`, `MemoryStore`, `Session`, `Cookie`) and the SameSite=None invariant are unchanged. 2 new unit tests in `test/core/session-plugin.test.js` (drop-in identity assertion + stack-trace visibility lock). Full suite 3768/3768 (3766 baseline + 2 new). Surfaced from a consumer-app session: "Gina's wrapper clobbering expressSession.name — is an upstream concern".
36
44
  ### Security
37
45
  * `gina.plugins.Csrf()` now layers an Origin/Referer pre-filter ON TOP of the signed double-submit token verify (`#CSRF3`). On every mutating request (POST/PUT/PATCH/DELETE) the middleware reads `Origin` first, falls back to parsing the host out of `Referer` when `Origin` is absent (or is the literal `"null"` sentinel browsers send for sandboxed iframes), and matches the result against `settings.json > csrf.allowedOrigins`. Both headers missing → 403 `[csrf] forbidden — missing origin/referer`. Mismatch → 403 `[csrf] forbidden — origin not allowed`. The token verify only runs after the Origin check passes, so a forged token + matching cookie still gets rejected when the request didn't come from an allowed origin (token layer ≠ Origin layer). Per-route `csrfExempt: true` bypasses BOTH layers consistently. New `settings.json` key `csrf.allowedOrigins`: empty/unset defaults to `[bundleHostname]` (auto-derived from `conf[bundle][env].hostname` or composed from `server.scheme + host + server.port`); non-empty replaces the default with an explicit allowlist for multi-domain bundles. Entries are matched literally case-insensitive after parsing down to `scheme://host[:port]` — different scheme on the same host doesn't match (`http://example.com` ≠ `https://example.com`); different port doesn't match. Factory throws at startup when `csrf.allowedOrigins` is empty AND no bundle hostname can be resolved — error message points at both fixes. 54 new unit tests (parser helpers, allowlist precedence, behavioural matrix Origin × Referer × allowlist, scheme/port discrimination, `Origin: "null"` sentinel handling, negative-invariant lock that matching token + mismatching Origin still 403s, exempt interaction, source-inspection guards pinning the pre-filter ordering); full suite 3822/3822 (prior 3768 + 54). Closes the three-phase CSRF trilogy started by `#CSRF1` (cookie hardening, alpha.8) and `#CSRF2` (signed double-submit token, alpha.9).
38
46
 
@@ -60,7 +68,7 @@ and is generated by [Changie](https://github.com/miniscruff/changie).
60
68
  ## 0.3.7-alpha.6 - 2026-04-24 (npm only — no git tag)
61
69
  ### Security
62
70
  * Restored CVE visibility on vendored deps. `gina@0.3.7-alpha.5` stripped `dependencies`/`devDependencies`/`scripts` from `core/deps/busboy-1.6.0/package.json` and `core/deps/streamsearch-1.1.0/package.json` to reduce Socket's dep-count display — but the strip also removed the dep-graph edge that Socket, Dependabot, and `npm audit` follow to associate the vendored copies with their CVE records. Vendored copies of upstream packages are supply-chain surface exactly like npm-installed ones; stripping the metadata hid them from the tools meant to alert on them. Both files are now byte-identical to their upstream npm tarballs again. Pinning discipline going forward: the vendored `package.json` stays byte-identical to upstream until a local patch is applied; on patch, bump `version` to `<upstream>-rhinostone.N` (e.g. `1.6.0-rhinostone.1`) so CVE scanners still match the base version and readers see at a glance that the copy has diverged. Also adds an OSV-based CI scan (`.github/workflows/vendored-cve.yml`) that walks every `core/deps/*/package.json` and every `framework/v*/package.json`, queries `api.osv.dev` for each `(name, version)` pair, and fails the build on any matched vulnerability — belt-and-suspenders, independent of whichever third-party scanner happens to be in use. Runs on push to `develop`/`master`, weekly Sunday cron, and manual dispatch.
63
- * Replaced four `eval(...)` call sites in the validator plugin with safe, grammar-locked equivalents (#SCS1e, bucket (c) partial progress). `core/plugins/lib/validator/src/main.js:2603` — `eval('gina.forms.rules.' + customRule)` replaced with a dot-path walker. `customRule` is read from the user-controlled `data-gina-form-rule` HTML attribute; the old eval executed anything that parsed as JS, so a crafted attribute like `constructor.constructor("return process.exit()")()` would fire on lookup. The walker rejects any character outside `[A-Za-z_$][\w$]*(\.[A-Za-z_$][\w$]*)*` and returns undefined on missing path (falling through to the existing "no rule found" error). `core/plugins/lib/validator/src/form-validator.js:161` — `eval('data.' + localValue)` in `compileError()` replaced with a dot+bracket path walker. `localValue` is derived from `{{...}}` placeholders in error messages; the transforms at lines 152-158 produce `ident (. ident | ["quoted"])*`, and the walker rejects anything outside that shape. `core/plugins/lib/validator/src/form-validator.js:893` — the regex-literal branch of `is()` replaced with `new RegExp(body, flags).test(value)`. Parses `/<body>/<flags>` only; `/<body>/` without flags or any non-regex input throws. `core/plugins/lib/validator/src/form-validator.js:895` — the binary-compare branch of `is()` replaced with a regex-based evaluator over the closed grammar `<operand><op><operand>` where operand is in `{number, "string", true, false, null, undefined}` and op is in `{===, !==, ==, !=, <, >, <=, >=}`. After `$var` substitution (lines 910-920) and paren/return strip (line 925), real Freelancer v3 conditions (15 regex literals + 11 binary comparisons) all match the two grammars. Any input outside the grammars (arithmetic, function calls, semicolon injection, throw injection) is rejected. Seven validator-plugin sites remain deferred pending a separate design pass (`form-validator.js:919`, `:1722`, `main.js:2320`, `:2329`, `:2931`, `:2947`, `:2959`). Verified by +69 tests in `test/lib/validator-scs1e.test.js` (source inspection, behavioural parity against corpus, injection rejection).
71
+ * Replaced four `eval(...)` call sites in the validator plugin with safe, grammar-locked equivalents (#SCS1e, bucket (c) partial progress). `core/plugins/lib/validator/src/main.js:2603` — `eval('gina.forms.rules.' + customRule)` replaced with a dot-path walker. `customRule` is read from the user-controlled `data-gina-form-rule` HTML attribute; the old eval executed anything that parsed as JS, so a crafted attribute like `constructor.constructor("return process.exit()")()` would fire on lookup. The walker rejects any character outside `[A-Za-z_$][\w$]*(\.[A-Za-z_$][\w$]*)*` and returns undefined on missing path (falling through to the existing "no rule found" error). `core/plugins/lib/validator/src/form-validator.js:161` — `eval('data.' + localValue)` in `compileError()` replaced with a dot+bracket path walker. `localValue` is derived from `{{...}}` placeholders in error messages; the transforms at lines 152-158 produce `ident (. ident | ["quoted"])*`, and the walker rejects anything outside that shape. `core/plugins/lib/validator/src/form-validator.js:893` — the regex-literal branch of `is()` replaced with `new RegExp(body, flags).test(value)`. Parses `/<body>/<flags>` only; `/<body>/` without flags or any non-regex input throws. `core/plugins/lib/validator/src/form-validator.js:895` — the binary-compare branch of `is()` replaced with a regex-based evaluator over the closed grammar `<operand><op><operand>` where operand is in `{number, "string", true, false, null, undefined}` and op is in `{===, !==, ==, !=, <, >, <=, >=}`. After `$var` substitution (lines 910-920) and paren/return strip (line 925), real consumer-app conditions (15 regex literals + 11 binary comparisons) all match the two grammars. Any input outside the grammars (arithmetic, function calls, semicolon injection, throw injection) is rejected. Seven validator-plugin sites remain deferred pending a separate design pass (`form-validator.js:919`, `:1722`, `main.js:2320`, `:2329`, `:2931`, `:2947`, `:2959`). Verified by +69 tests in `test/lib/validator-scs1e.test.js` (source inspection, behavioural parity against corpus, injection rejection).
64
72
 
65
73
  ## 0.3.7-alpha.5 - 2026-04-23 (npm only — no git tag)
66
74
  ### Changed
@@ -98,8 +106,8 @@ and is generated by [Changie](https://github.com/miniscruff/changie).
98
106
  * `gina bundle:mcp-start --timeout-ms=<n>` — overrides the HTTP dispatch timeout for a single MCP server process. Also reads `mcp.json > server > timeoutMs` when the CLI flag is absent. Precedence: `--timeout-ms` > manifest > 30 000 ms default. Non-numeric / non-positive values at any layer fall through to the next layer with a stderr warning, so a malformed override cannot silently disable the timeout. The resolved value is surfaced in the startup info line (`Dispatch target: <url> (timeout: <n> ms)`) for operator visibility. The previous hardcoded 30 s default still applies when neither override is set.
99
107
  * Dual-mode Inspector statusbar link — the dev-mode statusbar now prefers the standalone Inspector SPA when `config/settings.json > inspector.url` is set on a bundle (e.g. `"inspector": {"url": "http://localhost:4200/inspector/"}`), opening it in a new tab with `?target=<this-origin+webroot>` pre-filled. When unset, the link falls back to the legacy embedded popup at `{webroot}/_gina/inspector/` with its persisted geometry — existing behaviour is unchanged. The resolved URL is exposed to the client shim via `window.__ginaData.gina.inspectorUrl`, injected by both `controller.render-swig.js` and `controller.render-json.js` so HTML and XHR-driven pages agree on the target. Cross-origin support for the standalone SPA is rounded out by adding `access-control-allow-origin: *` to the two remaining `/_gina/*` handlers that still lacked it — the Inspector SPA asset route (`/_gina/inspector/*`) and the log stream (`/_gina/logs`) — in both `server.isaac.js` and `server.js` so the SPA can pull CSS/JS/fonts and subscribe to the SSE logs from a different origin than the target bundle.
100
108
  * Dual-mode resolution for `gina inspector:open` — the command now picks the Inspector URL the same way the dev-mode statusbar does since `0.3.7-alpha.2`. Resolution order: (1) `--url=<url>` CLI override, (2) the bundle's `config/settings.json > inspector.url` (e.g. `"inspector": {"url": "http://localhost:4200/inspector/"}`), (3) the embedded popup at `<target>/_gina/inspector/` (legacy fallback, unchanged). In every case the target bundle origin is passed as `?target=<origin>` so the standalone SPA knows which bundle to drive. The `--url` flag is the escape hatch when the Inspector is reachable at an address not declared in the bundle config. When `--port` is used alone (no project/bundle context) and `--url` is not passed, the embedded path is kept — there is no config to read.
101
- * `gina inspector:open` now accepts a full `http(s)://` URL as the positional target — useful when bundles run on Docker or a remote environment while the Inspector SPA runs on the host (e.g. `gina inspector:open https://v3-local.example.com/api/`). The URL is used as the target origin directly; project and bundle resolution are skipped, mirroring the `--port` short-circuit. A new per-user fallback was also added to the Inspector URL resolution chain: `~/.gina/<shortVersion>/settings.json > inspector.url`. Set it once and every invocation without `--url=` uses the same standalone SPA origin. Full resolution order: (1) `--url=<url>`, (2) bundle `config/settings.json > inspector.url`, (3) global `~/.gina/<shortVersion>/settings.json > inspector.url`, (4) embedded popup at `<target>/_gina/inspector/`.
102
- * `gina service:list` — lists framework-internal services (bundles registered under `@gina`) with their name, preferred dev port, src-existence status, and current running state. Running state is probed from `~/.gina/run/<service>@gina.pid` combined with `process.kill(pid, 0)`; stale pidfiles report the service as stopped without being auto-deleted (clean-up stays with `bundle:stop`). Ports are read from `~/.gina/ports.reverse.json` and the preferred one picked by the `http/2.0 https` → `http/1.1 https` → `http/1.1 http` precedence (dev env first, then the first env present). Supports `--format=json` for scripting, and tolerates a missing or malformed `ports.reverse.json` without erroring. `@gina` is the only project accepted for now — `gina service:list @freelancer` is rejected with a clear message; user-defined services are not a surface yet. Ships with a new cmd group at `framework/v*/lib/cmd/service/` (`list.js`, `help.js`, `help.txt`) registered in the `bin/cli` offline allowlist, and 37 source-inspection unit tests in `test/lib/service-list.test.js`.
109
+ * `gina inspector:open` now accepts a full `http(s)://` URL as the positional target — useful when bundles run on Docker or a remote environment while the Inspector SPA runs on the host (e.g. `gina inspector:open https://local.example.com/api/`). The URL is used as the target origin directly; project and bundle resolution are skipped, mirroring the `--port` short-circuit. A new per-user fallback was also added to the Inspector URL resolution chain: `~/.gina/<shortVersion>/settings.json > inspector.url`. Set it once and every invocation without `--url=` uses the same standalone SPA origin. Full resolution order: (1) `--url=<url>`, (2) bundle `config/settings.json > inspector.url`, (3) global `~/.gina/<shortVersion>/settings.json > inspector.url`, (4) embedded popup at `<target>/_gina/inspector/`.
110
+ * `gina service:list` — lists framework-internal services (bundles registered under `@gina`) with their name, preferred dev port, src-existence status, and current running state. Running state is probed from `~/.gina/run/<service>@gina.pid` combined with `process.kill(pid, 0)`; stale pidfiles report the service as stopped without being auto-deleted (clean-up stays with `bundle:stop`). Ports are read from `~/.gina/ports.reverse.json` and the preferred one picked by the `http/2.0 https` → `http/1.1 https` → `http/1.1 http` precedence (dev env first, then the first env present). Supports `--format=json` for scripting, and tolerates a missing or malformed `ports.reverse.json` without erroring. `@gina` is the only project accepted for now — `gina service:list @otherproject` is rejected with a clear message; user-defined services are not a surface yet. Ships with a new cmd group at `framework/v*/lib/cmd/service/` (`list.js`, `help.js`, `help.txt`) registered in the `bin/cli` offline allowlist, and 37 source-inspection unit tests in `test/lib/service-list.test.js`.
103
111
  * `gina connector:list` — lists connectors declared across a project's `shared/config/connectors.json` and every bundle's `config/connectors.json`, with driver install status, range and version-pin info. Three invocation modes: `gina connector:list` (every registered project), `gina connector:list @<project>` (one project, shared + all bundles), `gina connector:list <bundle> @<project>` (merged shared+bundle view that the bundle sees at runtime). Each row shows a status flag (`[ ok ]` installed or Node-builtin, `[ ?! ]` driver declared but not found in `<project>/node_modules/<driver>`, `[ ?? ]` unknown connector type or unrecognised `ai` protocol), the logical name, the resolved connector type, a source label (`[shared]`, `[<bundle>]`, `[<bundle> override]`), and driver details (`<npm>@<range>` + pin + installed version, or `run npm install <npm>` when missing, or `(built-in)` for `node:sqlite`). Driver resolution follows the framework's `peerDependencies`: `couchbase` → `couchbase`, `redis` → `ioredis`, `mysql` → `mysql2`, `postgresql` → `pg`, `mongodb` → `mongodb`, `scylladb` → `@scylladb/scylla-driver`, `sqlite` → built-in `node:sqlite`, `ai` → `@anthropic-ai/sdk` (for `anthropic://`) or `openai` (for `openai://`, `deepseek://`, `qwen://`, `groq://`, `mistral://`, `together://`, `ollama://`, `gemini://`, `xai://`, `perplexity://`). Shared and bundle-level overlay is key-level with bundle winning on conflicting keys, mirroring the runtime merge in `core/config.js`. When two bundles pin the same driver at different `version` values the command emits a trailing `[ !! ] driver \`<name>\` has conflicting \`version\` pins` line — npm resolves `node_modules/<driver>/` to a single version per project, so the first install wins. Supports `--format=json` for scripting with a stable `{project, bundle?, status, connectors: [{project, bundle, name, connector, source, driver, builtin, range, version, installed, installedVersion, note, unresolved}]}` shape. `connectors.json` and `manifest.json` files are parsed with `//` and `/* */` comment tolerance via `requireJSON`. Registered as an offline command — no framework socket required. Ships with a new cmd group at `framework/v*/lib/cmd/connector/` (`list.js`, `help.js`, `help.txt`, `arguments.json`) and 89 source-inspection unit tests in `test/lib/connector-list.test.js`. First of the #CN10 multi-session plan — subsequent sessions add `connector:add`, `connector:rm`, and `connector:migrate`.
104
112
  * `gina connector:add` — writes a connector entry to a project's `shared/config/connectors.json` or a bundle's `<bundle-src>/config/connectors.json`. Two invocation modes: `gina connector:add <name> @<project>` (writes to shared) and `gina connector:add <name> <bundle> @<project>` (writes to the bundle, resolved via `manifest.bundles[bundle].src`). Connector type is inferred from `<name>` when it matches one of the six allowed types (`couchbase`, `mysql`, `postgresql`, `sqlite`, `redis`, `ai`), or set explicitly via `--connector=<type>` (or the `--driver=<type>` synonym). Flags cover the common keys: `--host=`, `--connector-port=`, `--database=`, `--username=`, `--password=`, `--scope=` (one of `local`, `beta`, `production`, `testing`), and the AI-specific `--protocol=`, `--model=`, `--api-key=`, `--base-url=`. Driver version pinning via `--driver-version=<range>` writes a `version` field on the entry (new in the `schema/connectors.json`); when set, the printed install hint uses the pin (`npm install ioredis@"^5.0.0"`) instead of the framework's `peerDependencies` range. Preserves any `//` or `/* */` comment header above the first `{`; serialises the body with 4-space indentation; pins `$schema` at the top of the output with the canonical `https://gina.io/schema/connectors.json` URL; preserves existing key order and replaces an overwrite in place (not moved to the bottom). After writing, prints a one-line install hint — `Next: run `npm install <pkg>@"<range>"` inside your project root.` — using `@anthropic-ai/sdk` for `anthropic://` or `openai` for any other OpenAI-compatible AI protocol (`openai://`, `deepseek://`, `qwen://`, `groq://`, `mistral://`, `together://`, `ollama://`, `gemini://`, `xai://`, `perplexity://`). `sqlite` short-circuits to a `No install needed (Node >= 22.5.0 built-in node:sqlite)` note. Refuses to overwrite an existing entry without `--force`. Note on reserved flag names: the CLI uses `--connector-port=` (not `--port=`) because the framework reserves `--port=` for its own socket port, and `--driver-version=` (not `--version=`) because `--version=<value>` would be auto-mapped to `GINA_VERSION` and trigger a framework migration; the written JSON shape still uses `port` and `version` property names. Registered as an offline command — no framework socket required. Ships with 94 source-inspection unit tests in `test/lib/connector-add.test.js`. Second of the #CN10 multi-session plan — follow-ups are `connector:rm` and `connector:migrate` + framework-side auto-migrate hook.
105
113
  * `gina connector:rm` — removes a connector entry from a project's `shared/config/connectors.json` or a bundle's `<bundle-src>/config/connectors.json`. Two invocation modes mirror `connector:add`: `gina connector:rm <name> @<project>` (removes from shared) and `gina connector:rm <name> <bundle> @<project>` (removes from the bundle, resolved via `manifest.bundles[bundle].src`). `connector:remove` is accepted as an alias. Flags: `--dry-run` prints what would be removed without touching any file (always exits `0` — includes the sibling-usage warning and driver-retention hint); `--force` skips the project-level usage guard that otherwise refuses to remove a shared connector while any bundle still references it. Bundle-level removals always proceed and leave shared untouched. After removal, prints a driver-retention hint listing any sibling bundles (or shared) that still reference the same driver and a reminder that `gina does not uninstall npm packages`; sqlite is exempt (built-in `node:sqlite`). Attempting to remove from a bundle when the entry lives only in shared prints an "inherited from shared" hint pointing at the right scope. Preserves any `//` or `/* */` comment header above the first `{`; mid-body comments are lost on rewrite (same as `connector:add`). Registered as an offline command — no framework socket required. Ships with 81 source-inspection unit tests in `test/lib/connector-rm.test.js`. Third of the #CN10 multi-session plan — follow-up is `connector:migrate` + framework-side auto-migrate hook.
package/README.md CHANGED
@@ -22,7 +22,7 @@ Node.js MVC framework with built-in HTTP/2, multi-bundle architecture, and scope
22
22
  | ORM / entities | EventEmitter-based entity system; SQL files auto-wired to entity methods |
23
23
  | Connectors | Couchbase, MySQL, PostgreSQL, Redis, SQLite, AI (LLM) — loaded from project `node_modules` |
24
24
  | AI connector | Any LLM provider via named protocol (`anthropic://`, `openai://`, `ollama://`, …) |
25
- | Template engine | [`@rhinostone/swig`](https://github.com/gina-io/swig) 1.5.0 — maintained fork with CVE-2023-25345 patched; streaming SSE/chunked via `renderStream()` |
25
+ | Template engine | [`@rhinostone/swig`](https://github.com/gina-io/swig) 1.6.0 — maintained fork with CVE-2023-25345 patched; streaming SSE/chunked via `renderStream()` |
26
26
  | Hot reload | WatcherService evicts `require.cache` only on file change — zero per-request overhead in dev |
27
27
  | K8s ready | `gina-container`, `gina-init`, SIGTERM drain, JSON stdout logging |
28
28
  | Dependency injection | Mockable connectors and config for unit testing |
@@ -37,14 +37,11 @@ gina bundle:start api @myproject
37
37
  open https://localhost:3100
38
38
  ```
39
39
 
40
- ## What's in 0.3.7
40
+ ## What's in 0.3.10
41
41
 
42
- - **Model Context Protocol (MCP) support** — `gina bundle:mcp` generates an MCP tool manifest (`mcp.json`) from `routing.json`. `gina bundle:mcp-start` runs a live MCP server over stdio (JSON-RPC 2.0) that dispatches `tools/call` as real HTTP requests against the running bundle. Any Gina app is now consumable by MCP-compatible IDE and agent tooling out of the box. MCP spec revision 2025-06-18
43
- - **Standalone Inspector SPA + dual-mode resolution** Inspector can now run as a separate single-page app served from its own origin, with the target bundle passed as `?target=<origin>`. The dev-mode statusbar and `gina inspector:open` both resolve the URL via a 4-level fallback (`--url=` bundle `config/settings.json > inspector.url` `~/.gina/<shortVersion>/settings.json > inspector.url` embedded `<target>/_gina/inspector/`), covering host-SPA + Docker-bundle splits
44
- - **Inspector Reveal toggle** dev-mode red-tinted toggle that swaps the redacted `__ginaData` for the unredacted snapshot via `/_gina/reveal`; only bundles running in `local` scope serve it, beta/production/testing return 403. Redactor now tokenizes camelCase so identifiers like `companyName` / `passportRequired` are no longer false-positive-redacted
45
- - **`service:list` + `bundle:list` port and running-state columns** — both commands now show each bundle's preferred dev port and whether the process is alive, read from `~/.gina/ports.reverse.json` and `~/.gina/run/<bundle>@<project>.pid`
46
- - **Explicit exports from `require('gina')`** — every framework-injected global (`getContext`, `_`, `requireJSON`, `merge`, …) is now also reachable as a named property on `require('gina')` / `require('gina/gna')`, with JSDoc and auto-generated `types/gna.d.ts`. Runtime globals unchanged
47
- - See 0.3.6 for Inspector payload redaction + CORS preflight fix, and 0.3.5 for the swig 1.5.0 security extension
42
+ - **FormValidator HTML5 form-reassociation hardening** — trilogy of fixes for `<input form="X">` controls. `bindForm` now uses `HTMLFormControlsCollection` (`form.elements`) for owner-aware control collection and attaches per-control listeners on out-of-tree reassociated controls; `unbindForm` symmetrically drains the side-table on cleanup. `updateRadio` scopes the mutual-exclusion peer set by form-owner same-name radios in different form-owners are no longer cross-fired into each other's loop — and reconciles the IDL `.checked` with the HTML `checked` attribute on init when they disagree. `bindForm`'s `fieldsSet[id].defaultChecked` cache reads the IDL `defaultChecked` property (which mirrors the HTML attribute regardless of the live IDL state) instead of the live `.checked`, so a `type="reset"` action correctly restores the originally-checked option. No-op for the normal single-form-owner shape — only changes behaviour in the form-reassociation layouts that were broken.
43
+ - **`X-Forwarded-Prefix` reverse-proxy support** when a reverse proxy (nginx, Traefik) mounts the bundle on a sub-path and forwards `proxy_set_header X-Forwarded-Prefix /sub;`, the framework composes a public webroot (proxy prefix + bundle internal `server.webroot`) and templates it into `gina.config.webroot`. Client-side URL construction (`/_gina/assets/routing.json` fetch, `gina.min.css` link injection, etc.) now targets the correct upstream through the proxy instead of root-relative URLs that route to whichever bundle answered `/`. Header value is normalised (leading slash, trailing slashes stripped, empty / `"/"` dropped); back-compat preserved when the header is absent.
44
+ - See 0.3.9 for the consumer-feedback 11-patch batch (per-request middleware dispatch isolation · Couchbase 4.x JsonTranscoder · `length` filter null safety · `process.env` mirroring · 6 nunjucks render-pipeline patches), and 0.3.8 for the install-script regression hotfix.
48
45
 
49
46
  See the full [Changelog](./CHANGELOG.md) and [Roadmap](./ROADMAP.md).
50
47
 
package/ROADMAP.md CHANGED
@@ -22,6 +22,7 @@ This roadmap covers planned features, architectural improvements, new connectors
22
22
  | **Q4 2026** | `0.3.7` ✅ | Web Security CSRF trilogy (#CSRF1/2/3) · Nunjucks template engine opt-in (#NJ1–#NJ4) · Eval-safety hardening (#SCS1) · MCP server (#AI8 stdio + HTTP transports) · `connector:*` CLI (#CN10) · vendored-dep CVE-visibility lock · psl/optimist removal · Session.name drop-in identity |
23
23
  | **Q4 2026** | `0.3.8` ✅ | Patch: `npm install -g gina@latest` regression fix — `psl` + `@rhinostone/swig` promoted to top-level deps · install scripts decoupled from framework `lib` registry · helpers preload guarding `lib/logger` ↔ `framework/v*/helpers` circular dep |
24
24
  | **Q2 2026** | `0.3.9` ✅ | Consumer-feedback batch (11 framework patches): per-request middleware dispatch isolation · Couchbase 4.x JsonTranscoder · `length` filter null safety · `process.env` mirroring · 6 nunjucks render-pipeline patches (libRef fallback · namespace prefix drop · bundle filter wraps · top-level userData · `data.data` alias · ginaLoader placeholders) · `getAssets` mid-URL `{{ }}` strip-guard anchor |
25
+ | **Q2 2026** | `0.3.10` ✅ | FormValidator HTML5 form-reassociation hardening trilogy (`HTMLFormControlsCollection`-based `bindForm` + `unbindForm` symmetry · radio mutual-exclusion + IDL/attribute reconciliation · `defaultChecked` cache for reset) · `X-Forwarded-Prefix` reverse-proxy path-prefix awareness |
25
26
  | **Q4 2026** | `0.4.0` | AI agents (MCP) · ScyllaDB connector · PWA scaffold · Prometheus metrics · Advanced tutorial · Website redesign · Docs offline ZIP · Bun investigation · Couchbase v2 removal · HTTP/2 hardening · Trailer support · CLI Tier 2 (bundle/project status, rename, copy, protocol:remove, minions) |
26
27
  | **Q1 2027** | `0.5.0` | ESM support · Template engine migration · Structured logging · Alt-Svc · HTTP/2 priorities · WebSocket over HTTP/2 · Inspector Production · CLI Tier 3 (project:move, framework:update, backup/restore, man pages) |
27
28
  | **Q3 2027** | `1.0.0` | First stable release — Windows alpha compatibility is a hard gate |
@@ -0,0 +1 @@
1
+ 0.3.10