gina 0.3.5 → 0.3.6-alpha.2

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 (360) hide show
  1. package/.github/workflows/security.yml +32 -0
  2. package/AUTHORS +1 -1
  3. package/CONTRIBUTING.md +19 -1
  4. package/GOVERNANCE.md +1 -1
  5. package/README.md +6 -5
  6. package/framework/{v0.3.5 → v0.3.6-alpha.2}/AUTHORS +1 -1
  7. package/framework/v0.3.6-alpha.2/VERSION +1 -0
  8. package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.js +1 -1
  9. package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/gna.js +1 -1
  10. package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/file/package.json +1 -1
  11. package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/intl/package.json +1 -1
  12. package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/validator/package.json +1 -1
  13. package/framework/{v0.3.5 → v0.3.6-alpha.2}/package.json +1 -1
  14. package/gna.js +4 -4
  15. package/llms.txt +19 -1
  16. package/package.json +3 -3
  17. package/resources/git-hooks/pre-commit +40 -0
  18. package/resources/package.json.template +1 -1
  19. package/script/check_no_claude_leak.js +101 -15
  20. package/script/post_install.js +15 -0
  21. package/framework/v0.3.5/VERSION +0 -1
  22. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/LICENSE +0 -0
  23. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/html/nolayout.html +0 -0
  24. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/html/static.html +0 -0
  25. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/img/android-chrome-192x192.png +0 -0
  26. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/img/android-chrome-512x512.png +0 -0
  27. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/img/apple-touch-icon.png +0 -0
  28. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/img/favicon-16x16.png +0 -0
  29. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/img/favicon-32x32.png +0 -0
  30. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/img/favicon.ico +0 -0
  31. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/README.md +0 -0
  32. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.css +0 -0
  33. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/beemaster/beemaster.js +0 -0
  34. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/beemaster/index.html +0 -0
  35. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css +0 -0
  36. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.br +0 -0
  37. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/css/gina.min.css.gz +0 -0
  38. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/html/statusbar.html +0 -0
  39. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.br +0 -0
  40. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/html/statusbar.html.gz +0 -0
  41. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/html/toolbar.html +0 -0
  42. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/html/toolbar.html.br +0 -0
  43. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/html/toolbar.html.gz +0 -0
  44. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/have_heart_one-webfont.woff2 +0 -0
  45. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/index.html +0 -0
  46. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/inspector.css +0 -0
  47. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/inspector.js +0 -0
  48. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/inspector/logo.svg +0 -0
  49. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js +0 -0
  50. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.br +0 -0
  51. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.min.js.gz +0 -0
  52. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js +0 -0
  53. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.br +0 -0
  54. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/asset/plugin/dist/vendor/gina/js/gina.onload.min.js.gz +0 -0
  55. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/config.js +0 -0
  56. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/ai/index.js +0 -0
  57. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/ai/lib/connector.js +0 -0
  58. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/couchbase/index.js +0 -0
  59. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/couchbase/lib/connector.js +0 -0
  60. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/couchbase/lib/connector.v2.js +0 -0
  61. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/couchbase/lib/connector.v3.js +0 -0
  62. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/couchbase/lib/connector.v4.js +0 -0
  63. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/couchbase/lib/n1ql.js +0 -0
  64. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/couchbase/lib/session-store.js +0 -0
  65. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/couchbase/lib/session-store.v2.js +0 -0
  66. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/couchbase/lib/session-store.v3.js +0 -0
  67. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/couchbase/lib/session-store.v4.js +0 -0
  68. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/mysql/index.js +0 -0
  69. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/mysql/lib/connector.js +0 -0
  70. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/postgresql/index.js +0 -0
  71. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/postgresql/lib/connector.js +0 -0
  72. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/redis/index.js +0 -0
  73. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/redis/lib/session-store.js +0 -0
  74. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/sql-parser.js +0 -0
  75. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/sqlite/index.js +0 -0
  76. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/sqlite/lib/connector.js +0 -0
  77. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/connectors/sqlite/lib/session-store.js +0 -0
  78. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/content.encoding +0 -0
  79. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/controller/controller.framework.js +0 -0
  80. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/controller/controller.js +0 -0
  81. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/controller/controller.render-json.js +0 -0
  82. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/controller/controller.render-stream.js +0 -0
  83. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/controller/controller.render-swig.js +0 -0
  84. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/controller/controller.render-v1.js +0 -0
  85. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/controller/index.js +0 -0
  86. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/busboy-1.6.0/LICENSE +0 -0
  87. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/busboy-1.6.0/README.md +0 -0
  88. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/busboy-1.6.0/lib/index.js +0 -0
  89. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/busboy-1.6.0/lib/types/multipart.js +0 -0
  90. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/busboy-1.6.0/lib/types/urlencoded.js +0 -0
  91. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/busboy-1.6.0/lib/utils.js +0 -0
  92. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/busboy-1.6.0/package.json +0 -0
  93. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/optimist-0.6.1/LICENSE +0 -0
  94. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/optimist-0.6.1/index.js +0 -0
  95. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/optimist-0.6.1/package.json +0 -0
  96. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/optimist-0.6.1/readme.markdown +0 -0
  97. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/streamsearch-1.1.0/LICENSE +0 -0
  98. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/streamsearch-1.1.0/lib/sbmh.js +0 -0
  99. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/streamsearch-1.1.0/package.json +0 -0
  100. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/swig-client/swig-2.0.0.min.js +0 -0
  101. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/deps/swig-client/swig.js +0 -0
  102. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/dev/index.js +0 -0
  103. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/dev/lib/class.js +0 -0
  104. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/dev/lib/factory.js +0 -0
  105. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/dev/lib/tools.js +0 -0
  106. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/locales/README.md +0 -0
  107. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/locales/currency.json +0 -0
  108. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/locales/dist/language/en.json +0 -0
  109. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/locales/dist/language/fr.json +0 -0
  110. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/locales/dist/region/en.json +0 -0
  111. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/locales/dist/region/fr.json +0 -0
  112. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/locales/index.js +0 -0
  113. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/mime.types +0 -0
  114. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/model/entity.js +0 -0
  115. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/model/index.js +0 -0
  116. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/model/template/entityFactory.js +0 -0
  117. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/model/template/index.js +0 -0
  118. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/README.md +0 -0
  119. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/index.js +0 -0
  120. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/file/README.md +0 -0
  121. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/file/build.json +0 -0
  122. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/intl/README.md +0 -0
  123. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/intl/build.json +0 -0
  124. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/intl/src/main.js +0 -0
  125. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/storage/README.md +0 -0
  126. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/storage/build.json +0 -0
  127. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/storage/package.json +0 -0
  128. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/storage/src/main.js +0 -0
  129. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/validator/README.md +0 -0
  130. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/validator/build.json +0 -0
  131. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/validator/src/form-validator.js +0 -0
  132. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/plugins/lib/validator/src/main.js +0 -0
  133. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/router.js +0 -0
  134. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/server.express.js +0 -0
  135. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/server.isaac.js +0 -0
  136. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/server.js +0 -0
  137. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/status.codes +0 -0
  138. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/_gitignore +0 -0
  139. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle/config/app.json +0 -0
  140. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle/config/connectors.json +0 -0
  141. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle/config/routing.json +0 -0
  142. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle/config/settings.json +0 -0
  143. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle/config/settings.server.json +0 -0
  144. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle/config/templates.json +0 -0
  145. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle/config/watchers.json +0 -0
  146. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle/controllers/controller.content.js +0 -0
  147. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle/controllers/controller.js +0 -0
  148. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle/controllers/setup.js +0 -0
  149. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle/index.js +0 -0
  150. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle_namespace/controllers/controller.js +0 -0
  151. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle_public/css/default.css +0 -0
  152. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle_public/css/home.css +0 -0
  153. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle_public/css/vendor/readme.md +0 -0
  154. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle_public/favicon.ico +0 -0
  155. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle_public/js/vendor/readme.md +0 -0
  156. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle_public/readme.md +0 -0
  157. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle_templates/handlers/main.js +0 -0
  158. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle_templates/html/content/homepage.html +0 -0
  159. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle_templates/html/includes/error-msg-noscript.html +0 -0
  160. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle_templates/html/includes/error-msg-outdated-browser.html +0 -0
  161. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/boilerplate/bundle_templates/html/layouts/main.html +0 -0
  162. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/command/gina.bat.tpl +0 -0
  163. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/command/gina.tpl +0 -0
  164. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/conf/env.json +0 -0
  165. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/conf/manifest.json +0 -0
  166. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/conf/package.json +0 -0
  167. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/conf/settings.json +0 -0
  168. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/conf/statics.json +0 -0
  169. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/conf/templates.json +0 -0
  170. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/error/client/json/401.json +0 -0
  171. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/error/client/json/403.json +0 -0
  172. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/error/client/json/404.json +0 -0
  173. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/error/server/html/50x.html +0 -0
  174. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/error/server/json/500.json +0 -0
  175. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/error/server/json/503.json +0 -0
  176. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/core/template/extensions/logger/config.json +0 -0
  177. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/console.js +0 -0
  178. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/context.js +0 -0
  179. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/data/LICENSE +0 -0
  180. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/data/README.md +0 -0
  181. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/data/package.json +0 -0
  182. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/data/src/main.js +0 -0
  183. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/dateFormat.js +0 -0
  184. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/index.js +0 -0
  185. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/json/LICENSE +0 -0
  186. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/json/README.md +0 -0
  187. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/json/package.json +0 -0
  188. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/json/src/main.js +0 -0
  189. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/path.js +0 -0
  190. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/plugins/README.md +0 -0
  191. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/plugins/package.json +0 -0
  192. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/plugins/src/api-error.js +0 -0
  193. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/plugins/src/main.js +0 -0
  194. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/prototypes.js +0 -0
  195. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/task.js +0 -0
  196. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/helpers/text.js +0 -0
  197. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/archiver/README.md +0 -0
  198. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/archiver/build.json +0 -0
  199. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/archiver/package.json +0 -0
  200. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/archiver/src/dep/jszip.min.js +0 -0
  201. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/archiver/src/main.js +0 -0
  202. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/async/package.json +0 -0
  203. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/async/src/main.js +0 -0
  204. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cache/README.md +0 -0
  205. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cache/build.json +0 -0
  206. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cache/package.json +0 -0
  207. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cache/src/main.js +0 -0
  208. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/aliases.json +0 -0
  209. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/add.js +0 -0
  210. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/arguments.json +0 -0
  211. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/build.js +0 -0
  212. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/copy.js +0 -0
  213. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/cp.js +0 -0
  214. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/help.js +0 -0
  215. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/help.txt +0 -0
  216. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/list.js +0 -0
  217. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/oas.js +0 -0
  218. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/openapi.js +0 -0
  219. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/remove.js +0 -0
  220. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/rename.js +0 -0
  221. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/restart.js +0 -0
  222. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/rm.js +0 -0
  223. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/start.js +0 -0
  224. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/status.js +0 -0
  225. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/bundle/stop.js +0 -0
  226. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/cache/stats.js +0 -0
  227. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/env/add.js +0 -0
  228. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/env/get.js +0 -0
  229. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/env/help.js +0 -0
  230. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/env/help.txt +0 -0
  231. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/env/link-dev.js +0 -0
  232. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/env/list.js +0 -0
  233. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/env/remove.js +0 -0
  234. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/env/rm.js +0 -0
  235. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/env/set.js +0 -0
  236. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/env/unset.js +0 -0
  237. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/env/use.js +0 -0
  238. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/arguments.json +0 -0
  239. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/build.js +0 -0
  240. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/dot.js +0 -0
  241. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/get.js +0 -0
  242. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/help.js +0 -0
  243. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/help.txt +0 -0
  244. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/init.js +0 -0
  245. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/link-node-modules.js +0 -0
  246. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/link.js +0 -0
  247. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/msg.json +0 -0
  248. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/open.js +0 -0
  249. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/restart.js +0 -0
  250. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/set.js +0 -0
  251. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/start.js +0 -0
  252. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/status.js +0 -0
  253. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/stop.js +0 -0
  254. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/tail.js +0 -0
  255. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/update.js +0 -0
  256. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/framework/version.js +0 -0
  257. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/gina-dev.1.md +0 -0
  258. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/gina-framework.1.md +0 -0
  259. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/gina.1.md +0 -0
  260. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/helper.js +0 -0
  261. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/index.js +0 -0
  262. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/inspector/help.js +0 -0
  263. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/inspector/help.txt +0 -0
  264. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/inspector/open.js +0 -0
  265. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/minion/help.js +0 -0
  266. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/minion/help.txt +0 -0
  267. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/msg.json +0 -0
  268. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/port/help.js +0 -0
  269. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/port/help.txt +0 -0
  270. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/port/inc/scan.js +0 -0
  271. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/port/list.js +0 -0
  272. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/port/reset.js +0 -0
  273. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/port/set.js +0 -0
  274. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/add.js +0 -0
  275. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/arguments.json +0 -0
  276. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/build.js +0 -0
  277. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/help.js +0 -0
  278. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/help.txt +0 -0
  279. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/import.js +0 -0
  280. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/list.js +0 -0
  281. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/move.js +0 -0
  282. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/remove.js +0 -0
  283. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/rename.js +0 -0
  284. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/restart.js +0 -0
  285. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/rm.js +0 -0
  286. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/start.js +0 -0
  287. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/status.js +0 -0
  288. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/project/stop.js +0 -0
  289. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/protocol/help.js +0 -0
  290. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/protocol/help.txt +0 -0
  291. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/protocol/list.js +0 -0
  292. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/protocol/set.js +0 -0
  293. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/scope/add.js +0 -0
  294. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/scope/help.js +0 -0
  295. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/scope/help.txt +0 -0
  296. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/scope/link-local.js +0 -0
  297. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/scope/link-production.js +0 -0
  298. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/scope/list.js +0 -0
  299. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/scope/remove.js +0 -0
  300. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/scope/rm.js +0 -0
  301. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/scope/use.js +0 -0
  302. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cmd/view/add.js +0 -0
  303. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/collection/README.md +0 -0
  304. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/collection/build.json +0 -0
  305. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/collection/package.json +0 -0
  306. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/collection/src/main.js +0 -0
  307. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/config.js +0 -0
  308. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cron/README.md +0 -0
  309. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cron/package.json +0 -0
  310. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/cron/src/main.js +0 -0
  311. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/domain/LICENSE +0 -0
  312. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/domain/README.md +0 -0
  313. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/domain/dist/2025-03-14_13-41-20_UTC.dat +0 -0
  314. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/domain/dist/public_suffix_list.dat +0 -0
  315. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/domain/dist/public_suffix_list.dat.br +0 -0
  316. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/domain/dist/public_suffix_list.dat.gz +0 -0
  317. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/domain/package.json +0 -0
  318. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/domain/src/main.js +0 -0
  319. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/generator/index.js +0 -0
  320. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/index.js +0 -0
  321. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/inherits/LICENSE +0 -0
  322. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/inherits/README.md +0 -0
  323. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/inherits/package.json +0 -0
  324. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/inherits/src/main.js +0 -0
  325. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/logger/README.md +0 -0
  326. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/logger/package.json +0 -0
  327. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/logger/src/containers/default/index.js +0 -0
  328. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/logger/src/containers/file/index.js +0 -0
  329. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/logger/src/containers/file/lib/logrotator/README.md +0 -0
  330. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/logger/src/containers/file/lib/logrotator/index.js +0 -0
  331. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/logger/src/containers/mq/index.js +0 -0
  332. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/logger/src/containers/mq/listener.js +0 -0
  333. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/logger/src/containers/mq/speaker.js +0 -0
  334. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/logger/src/helper.js +0 -0
  335. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/logger/src/main.js +0 -0
  336. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/math/index.js +0 -0
  337. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/merge/README.md +0 -0
  338. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/merge/package.json +0 -0
  339. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/merge/src/main.js +0 -0
  340. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/model.js +0 -0
  341. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/proc.js +0 -0
  342. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/routing/README.md +0 -0
  343. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/routing/build.json +0 -0
  344. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/routing/package.json +0 -0
  345. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/routing/src/main.js +0 -0
  346. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/routing/src/radix.js +0 -0
  347. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/session-store.js +0 -0
  348. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/shell.js +0 -0
  349. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/state.js +0 -0
  350. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/swig-filters/README.md +0 -0
  351. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/swig-filters/package.json +0 -0
  352. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/swig-filters/src/main.js +0 -0
  353. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/url/README.md +0 -0
  354. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/url/index.js +0 -0
  355. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/url/routing.json +0 -0
  356. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/uuid/package.json +0 -0
  357. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/uuid/src/main.js +0 -0
  358. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/validator.js +0 -0
  359. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/watcher/package.json +0 -0
  360. /package/framework/{v0.3.5 → v0.3.6-alpha.2}/lib/watcher/src/main.js +0 -0
@@ -0,0 +1,32 @@
1
+ name: Security
2
+
3
+ on:
4
+ push:
5
+ branches: [develop, master]
6
+ pull_request:
7
+ branches: [develop, master]
8
+
9
+ jobs:
10
+ claude-leak-check:
11
+ name: Claude-leak scan
12
+ runs-on: ubuntu-latest
13
+
14
+ steps:
15
+ - uses: actions/checkout@v6
16
+
17
+ # #S6 — Backs up the local pre-commit hook (#S5) and the publish-boundary
18
+ # gate in prepare_version.js (#S3). Fails the build if any tracked path
19
+ # matches (^|/)(CLAUDE\.md|\.claude[a-z]*). Also retroactively catches
20
+ # leaks that landed before the active defenses were wired.
21
+ - name: Scan tracked files for Claude-related paths
22
+ run: |
23
+ matches=$(git ls-files | grep -iE '(^|/)(CLAUDE\.md|\.claude[a-z]*)' || true)
24
+ if [ -n "$matches" ]; then
25
+ echo "::error::Claude-related paths detected in git index:"
26
+ echo "$matches" | sed 's/^/ - /'
27
+ echo ""
28
+ echo "These paths must never be tracked. Remove with: git rm --cached <path>"
29
+ echo "If pushed already, scrub history with git filter-repo."
30
+ exit 1
31
+ fi
32
+ echo "OK: no Claude-related paths in git index."
package/AUTHORS CHANGED
@@ -1,6 +1,6 @@
1
1
  # Authors (sorted alphabetically)
2
2
 
3
- Fabrice Delaneau <fabrice.delaneau@gina.io>
3
+ John Doe <fabrice.delaneau@gina.io>
4
4
  Martin Luther ETOUMAN <martin-luther.etouman@gina.io>
5
5
 
6
6
  # Contributors (sorted alphabetically)
package/CONTRIBUTING.md CHANGED
@@ -13,6 +13,7 @@ Gina follows a BDFL governance model — see [GOVERNANCE.md](./GOVERNANCE.md) fo
13
13
  - [Debugging](#debugging)
14
14
  - [Coding conventions](#coding-conventions)
15
15
  - [Branch model](#branch-model)
16
+ - [Local git hooks (opt-in)](#local-git-hooks-opt-in)
16
17
  - [Commit style](#commit-style)
17
18
  - [Changelog](#changelog)
18
19
  - [Pull request checklist](#pull-request-checklist)
@@ -144,6 +145,23 @@ Always branch from `develop` and open your PR against `develop`.
144
145
 
145
146
  ---
146
147
 
148
+ ## Local git hooks (opt-in)
149
+
150
+ If you have multiple git identities on one machine (work, personal, internal hostname), it is easy to commit under the wrong `user.email` and leak a private domain into the public git log. This repo ships an opt-in `pre-commit` hook that refuses commits authored under a private-domain identity.
151
+
152
+ Install it once from the repo root:
153
+
154
+ ```bash
155
+ cp resources/git-hooks/pre-commit .git/hooks/pre-commit
156
+ chmod +x .git/hooks/pre-commit
157
+ ```
158
+
159
+ The hook checks `git config user.email` against a short list of private-domain patterns (see the `BLOCKED_PATTERNS` regex inside `resources/git-hooks/pre-commit` for the current list) and exits with an error message if any match — letting you switch identity (`git config user.email you@public-domain.example`) before retrying.
160
+
161
+ Edit `resources/git-hooks/pre-commit` and extend the `BLOCKED_PATTERNS` regex to cover any additional private domain or hostname suffix you want to guard against. The hook is local to your clone — it is not shared across contributors, so each contributor installs it independently.
162
+
163
+ ---
164
+
147
165
  ## Commit style
148
166
 
149
167
  Use imperative or gerund sentences, matching the existing log:
@@ -205,4 +223,4 @@ Open a GitHub issue describing the use case **before** writing code. Features th
205
223
  | Name | Role | Profile |
206
224
  | --- | --- | --- |
207
225
  | Martin Luther | Lead maintainer | [rhinostone.com](https://rhinostone.com) |
208
- | Fabrice Delaneau | Co-author | [fdelaneau.com](https://fdelaneau.com) |
226
+ | John Doe | Co-author | [fdelaneau.com](https://fdelaneau.com) |
package/GOVERNANCE.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gina follows the **BDFL** (Benevolent Dictator For Life) model with a commitment to transparency.
4
4
 
5
- Gina is co-authored by **Martin Luther** ([Rhinostone](https://rhinostone.com)) and **Fabrice Delaneau** ([fdelaneau.com](https://fdelaneau.com)). Final decisions on direction, API design, and releases rest with Martin Luther. Community contributions and RFCs are welcome and taken seriously.
5
+ Gina is co-authored by **Martin Luther** ([Rhinostone](https://rhinostone.com)) and **John Doe** ([fdelaneau.com](https://fdelaneau.com)). Final decisions on direction, API design, and releases rest with Martin Luther. Community contributions and RFCs are welcome and taken seriously.
6
6
 
7
7
  ## How decisions are made
8
8
 
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 | Swig 1.4.2 built-in; streaming SSE/chunked via `renderStream()` |
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()` |
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,10 +37,11 @@ gina bundle:start api @myproject
37
37
  open https://localhost:3100
38
38
  ```
39
39
 
40
- ## What's in 0.3.4
40
+ ## What's in 0.3.5
41
41
 
42
- - **Fixed `require('gina/gna')` explicit exports** — v0.3.3 shipped with stale framework paths in `gna.js`, causing `MODULE_NOT_FOUND` errors; release lifecycle scripts now sync `gna.js` automatically on every version change
43
- - See 0.3.3 for feature additions (live index introspection, `bundle:openapi`, `framework:get`, `port:set`, swig migration, internal `lib/uuid`, popin performance, validator fix, Docker fixes, requireJSON resilience)
42
+ - **Security (CVE-2023-25345 extension)** — bumped `@rhinostone/swig` to 1.5.0, extending path-traversal guards to bracket-notation access, set-bracket assignment, for-loop variables, macro names, and import aliases
43
+ - **Client-side parity** updated vendored browser swig (`core/deps/swig-client/`) to the 1.5.0 build; browser-side templating now matches the server-side `__proto__`/`constructor`/`prototype` blocklist
44
+ - See 0.3.4 for the `require('gina/gna')` stale-path fix, and 0.3.3 for feature additions (live index introspection, `bundle:openapi`, `framework:get`, `port:set`, swig migration, internal `lib/uuid`, popin performance, validator fix, Docker fixes, requireJSON resilience)
44
45
 
45
46
  See the full [Changelog](./CHANGELOG.md) and [Roadmap](./ROADMAP.md).
46
47
 
@@ -63,7 +64,7 @@ Full installation guide, tutorials, configuration reference, and API docs at **[
63
64
 
64
65
  ## Governance
65
66
 
66
- Gina is co-authored by **Martin Luther** ([Rhinostone](https://rhinostone.com)) and **Fabrice Delaneau** ([fdelaneau.com](https://fdelaneau.com)). Final decisions on direction, API design, and releases rest with Martin Luther. Community contributions and RFCs are welcome and taken seriously. See [GOVERNANCE.md](./GOVERNANCE.md) for details.
67
+ Gina is co-authored by **Martin Luther** ([Rhinostone](https://rhinostone.com)) and **John Doe** ([fdelaneau.com](https://fdelaneau.com)). Final decisions on direction, API design, and releases rest with Martin Luther. Community contributions and RFCs are welcome and taken seriously. See [GOVERNANCE.md](./GOVERNANCE.md) for details.
67
68
 
68
69
  ## License (MIT)
69
70
 
@@ -3,5 +3,5 @@
3
3
  #
4
4
 
5
5
  Martin Luther ETOUMAN <contact@gina.io>
6
- Fabrice DELANEAU <contact+gina@fdelaneau.com>
6
+ John Doe <contact+gina@fdelaneau.com>
7
7
  Stephane HEAV <stephane.heav@gmail.com>
@@ -0,0 +1 @@
1
+ 0.3.6-alpha.2
@@ -9015,7 +9015,7 @@ define('gina/link', [ 'require', 'lib/domain', 'lib/merge', 'lib/uuid', 'utils/e
9015
9015
  // is request from same domain ?
9016
9016
  //options.headers['Origin'] = window.protocol+'//'+window.location.host;
9017
9017
  //options.headers['Origin'] = '*';
9018
- //options.headers['Host'] = 'https://freelancer-app.fr.local:3154';
9018
+ //options.headers['Host'] = 'https://myproject.local:3154';
9019
9019
  var hostRootDomain = domainInstance.getRootDomain(window.location.hostname).value;
9020
9020
  var urlRootDomain = domainInstance.getRootDomain(url).value;
9021
9021
  var isSameDomain = (hostRootDomain === urlRootDomain) ? true : false;
@@ -36,7 +36,7 @@ if (!process.env.NODE_COMPILE_CACHE) {
36
36
 
37
37
  // #P4 — V8 pointer compression detection.
38
38
  // Node.js built with --experimental-enable-pointer-compression (e.g. node-caged,
39
- // or a custom build like the freelancer image) caps each V8 isolate at a 4 GB heap
39
+ // or a custom build like the example image) caps each V8 isolate at a 4 GB heap
40
40
  // in exchange for ~50% memory reduction across all pointer-heavy structures
41
41
  // (objects, arrays, linked lists). Detection: heap_size_limit ≤ 4 GB is the hard
42
42
  // ceiling imposed by 32-bit pointer offsets within a 4 GB memory cage.
@@ -8,7 +8,7 @@
8
8
  "email": "contact@gina.io"
9
9
  },
10
10
  {
11
- "name": "Fabrice Delaneau",
11
+ "name": "John Doe",
12
12
  "email": "contact@gina.io"
13
13
  }
14
14
  ],
@@ -8,7 +8,7 @@
8
8
  "email": "contact@gina.io"
9
9
  },
10
10
  {
11
- "name": "Fabrice Delaneau",
11
+ "name": "John Doe",
12
12
  "email": "contact@gina.io"
13
13
  }
14
14
  ],
@@ -8,7 +8,7 @@
8
8
  "email": "contact@gina.io"
9
9
  },
10
10
  {
11
- "name": "Fabrice Delaneau",
11
+ "name": "John Doe",
12
12
  "email": "contact@gina.io"
13
13
  }
14
14
  ],
@@ -2,6 +2,6 @@
2
2
  "name": "gina-framework",
3
3
  "version": "0.3.4",
4
4
  "dependencies": {
5
- "@rhinostone/swig": "^1.5.0"
5
+ "@rhinostone/swig": "^1.6.0"
6
6
  }
7
7
  }
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.3.5/core/gna');
18
+ var _gna = require('./framework/v0.3.6-alpha.2/core/gna');
19
19
 
20
20
  // SuperController and EntitySuper — loaded from their source modules
21
- var SuperController = require('./framework/v0.3.5/core/controller');
22
- var EntitySuper = require('./framework/v0.3.5/core/model/entity');
21
+ var SuperController = require('./framework/v0.3.6-alpha.2/core/controller');
22
+ var EntitySuper = require('./framework/v0.3.6-alpha.2/core/model/entity');
23
23
 
24
24
  // uuid — from the lib registry
25
- var uuid = require('./framework/v0.3.5/lib/uuid');
25
+ var uuid = require('./framework/v0.3.6-alpha.2/lib/uuid');
26
26
 
27
27
  module.exports = {
28
28
 
package/llms.txt CHANGED
@@ -673,7 +673,7 @@ Dev-mode query instrumentation captures every database query tied to the current
673
673
  24. **`gina start` exits with code 1 even on success** — the startup script detaches the daemon process; the shell child exits with code 1 as part of that detachment. The process is running. Always use `gina status` to confirm rather than relying on the exit code.
674
674
  25. **Framework edits in `gina-dev` have no effect on a running bundle until the live install is also patched** — bundles always load from `~/.npm-global/lib/node_modules/gina/` (the main worktree). Editing `gina-dev/framework/…` only affects the next `git merge --ff-only` into `develop`. When testing a framework fix mid-session, apply the same edit to both `gina-dev` and `~/.npm-global/lib/node_modules/gina/` in parallel, then restart the affected bundle.
675
675
  26. **`throwError` call-signature reference** — four valid forms: `(errorObj)` (1-arg object/Error); `(res, string)` (2-arg, code inferred from `res.status || 500`); `(res, code, Error)` (3-arg with Error object); `(res, code, string)` (3-arg with string message, code preserved as of this fix). Always `return` immediately after calling `throwError` in a controller action.
676
- 27. **freelancer/v3 `setting-get-one-design` was a latent crash** — `coreapi` routing has `"url": "/settings/get/design/:designId"` with no `requirements` block. Before the `fitsWithRequirements` fix (gotcha #20), every GET to that URL threw a 500 TypeError. The fix makes it work correctly. Worth testing that route after the next ff-only merge.
676
+ 27. **internal-bundle `setting-get-one-design` was a latent crash** — `coreapi` routing has `"url": "/settings/get/design/:designId"` with no `requirements` block. Before the `fitsWithRequirements` fix (gotcha #20), every GET to that URL threw a 500 TypeError. The fix makes it work correctly. Worth testing that route after the next ff-only merge.
677
677
  28. **Connector code is NOT hot-reloaded** — `core/connectors/*/index.js` modules are loaded once at bundle startup via entity registration, not via `lib/index.js`. `refreshCore()` does not evict them. Any change (new QI fields, `extractIndexes()`, `profile: "timings"`) requires `gina bundle:stop` + `gina bundle:start` or `docker restart <container>`.
678
678
  29. **Couchbase SDK v4 `meta.profile` is always undefined** — the C++ binding (`couchbase-cxx-client`) does not forward the `profile` field from the N1QL server response. `meta.profile` is `undefined` even with `profile: 'timings'` in the request. The EXPLAIN fallback (`explainForIndexes()`) runs `EXPLAIN <statement>` asynchronously and caches results per unique statement. First request for a new statement may show N/A; subsequent requests hit the cache. `USE KEYS` queries use `ExpressionScan`/`KeyScan` operators (no `index` field) — detected separately by `extractIndexes()`.
679
679
  30. **Test lookback constants are fragile** — `inspector.test.js` section 08 scans backward from `_devLog.push(_queryEntry)` by byte distance looking for `envIsDev`. Adding helper functions or fields between the guard and the push increases the distance. Current constant: 1800 chars. Always check after adding code near the connector QI guard.
@@ -693,3 +693,21 @@ Dev-mode query instrumentation captures every database query tied to the current
693
693
  41. **Option B is the active dispatch path in the Couchbase connector** — `register()` in `readSource()` has two paths: Option A (`self._isRegisteredFromProto === true`) and Option B (`!self._isRegisteredFromProto`). Option B is always active for all connector-generated entity methods. When adding debug logging or QI instrumentation to the query execution path, place it in Option B — Option A is dead code.
694
694
  42. **Validator touched-field-only error display** — the validator runs a global validation pass on every field blur to determine submit button state (`isFormValid`). The global pass must NOT display errors for untouched fields — only for `event.target.name` (the field the user actually touched). Two call sites in `validator/src/main.js`: ~line 3337 (within the `isFormValid && gResult.error` block) and ~line 4865 (same pattern in the second validation path). The global pass still correctly disables/enables the submit button.
695
695
  42. **Docker `node_modules` isolation** — Docker containers using `node_modules` anonymous volumes have their own copy of all npm packages. Edits to `node_modules/` on the host are invisible inside the container. To debug SDK-level behaviour, either `docker exec` and edit inside the container, or add logging to the framework connector code (which IS bind-mounted) rather than the SDK itself.
696
+ 43. **`syncDocs` misclassifies stable releases as alpha** (incident 2026-04-13, v0.3.5) — `post_publish.js → syncDocs` skipped the docs `develop → main` merge on a stable publish, logging `[syncDocs] Alpha release — skipping docs sync`. Until this bug is rooted out, every stable publish must manually execute step 12 of the Stable Release Checklist (checkout `main` in `~/Sites/gina/docs/repo`, FF-merge `develop`, push) as a blocking step — not a fallback. Likely a regex/prerelease-detection bug in `syncDocs`.
697
+ 44. **Manual `git mv framework/v<alpha>/ v<stable>/` before `npm publish` requires state-file pre-sync** — `prepare_version.js` reads `selectedVersion` from `~/.gina/main.json`, `~/.gina/<shortVersion>/settings.json`, AND `gina.db` `kv_store` (keys `main`, `settings/<shortVersion>`) — never from `package.json`. If state lags the on-disk rename, the script crashes on `require('framework/v<alpha>/helpers')`. Patch all three stores in lockstep before publish. `gina.db` is the canonical store since #CN2v3 — skipping it silently re-diverges. Use `python3 sqlite3` or `better-sqlite3` parameter binding to update `gina.db` — shell-escaping JSON into a SQL string fails on embedded quotes.
698
+ 45. **README.md is NOT auto-updated by any release script** — the "What's in X.Y.Z" heading and Features-table Swig version reference are hand-maintained. Before every `npm publish`: run `grep -nE "What's in|Swig [0-9]" README.md` to catch stale sections. Stable checklist step 5 covers this for `package.json`/`llms.txt`/etc. but does not enforce README explicitly. Add to pre-flight mental model: README needs manual bump.
699
+ 46. **Docs-repo WIP during release merge: stash, don't file-overwrite** — when merging `develop → main` in `~/Sites/gina/docs/repo` to recover from a `syncDocs` miss, the file-overwrite dance (cp to /tmp, git-show HEAD, edit, restore) only scales to 1–2 files. With significant in-flight work (e.g. Swig migration at 40+ files), use `git stash push -u -m "<purpose>"` → `git checkout main` → `git merge --ff-only develop` → `git push origin main` → `git checkout develop` → `git stash pop`. The `-u` is required for untracked files (e.g. new `.mdx` files).
700
+
701
+ 47. **Single try/catch around sequential git commands silently skips downstream work** — if a `try` block contains `checkout → add → commit → push → checkout main → merge → push` and the `catch` tolerates one failure mode (e.g. "nothing to commit"), every command AFTER the thrower is skipped even when the error was "tolerated". Control leaves the try block on throw. Rule: one try/catch per concern boundary. Put the commit step in its own inner try that tolerates "nothing to commit" and re-throws anything else, so outer sequential steps (push, merge) still run. Git's own commands are idempotent (`merge` on up-to-date main is a harmless no-op) — rely on their idempotency rather than tracking `needsCommit` booleans.
702
+
703
+ 48. **Early-returns on idempotent updates are footguns in multi-side-effect functions** — `if (updated === content) return done()` in `post_publish.js → syncDocs` looked like a harmless perf optimisation but skipped the `git checkout main → merge develop → push main` block entirely. The fix: write-if-changed (no short-circuit) + let the subsequent git steps run; they're already idempotent. Rule: early-returns are only safe in functions that do exactly one thing. If the function has N side effects, the "nothing to do" check must be scoped to just the side effect it's guarding — never to the whole function. _Fixed: 2026-04-13 · commit `c0a20c0c` (develop), `24ea8887` (master)._
704
+
705
+ 49. **`post_publish.js → publishAlpha` recurses into a full nested npm lifecycle** — `execSync('npm publish --tag alpha')` inside publishAlpha triggers `prepare` → `publish` → `postpublish` again. The nested postpublish sees `package.json.version` already bumped to `-alpha.X` (outer bumpVersion ran first) so `self.isAlpha === true` and it correctly skips syncDocs/tagAndMerge. The `[syncDocs] Alpha release — skipping docs sync` log line during a stable publish session is from this nested run, NOT the outer stable run misclassifying — red herring when debugging docs-deploy failures. Full detail: `.claude/architecture/state-and-config.md` § `post_publish.js` — nested `npm publish` recursion.
706
+
707
+ 51. **Non-fatal wrap for post-publish side effects** — the `self.*` chain in `post_publish.js` aborts via `process.exit(1)` on any thrown error (see `begin()` .catch). Every new step added between publish and the release-finalising calls (`tagAndMerge`, `bumpVersion`, `publishAlpha`) must decide: is a throw here worth leaving the release half-shipped? For recoverable polish (lockfile regen, docs sync, GitHub release creation), the answer is no — wrap in try/catch, log `console.warn('[<step>] ... failed (non-fatal — fix manually): ' + err.message)`, and let the chain continue. The `tagAndMerge` GitHub-release block (`ghErr` catch, non-fatal) and `syncDocs` `npm pkg set` + `npm install --package-lock-only` block (#R2, 2026-04-13 · commit `1cff922f`) both follow this pattern. Reserve hard throws for pre-publish gates where aborting *before* artefact push is the whole point.
708
+
709
+ 52. **Todo / spec text drifts from code — always diff before fixing** — `.claude/todo/release-workflow.md` #R2 claimed `syncDocs` "currently calls `npm pkg set devDependencies.gina`" when in fact the call was a manual step 10b in the stable release checklist that had never been automated. The drift came from reading the checklist's intent rather than running `grep 'npm pkg set' script/post_publish.js`. Lesson: before implementing a todo that describes "existing behaviour X", verify X exists in the source tree — intent documents and code documents diverge. The `.claude/todo/*.md` files mix aspirational ("should do Y") with factual ("does Y") entries; treat both as hypotheses until confirmed.
710
+
711
+ 53. **`npm install --package-lock-only --ignore-scripts` is the safe lockfile-regen primitive** — regenerates `package-lock.json` from `package.json` without fetching/installing to `node_modules` and without triggering `prepare`/`preinstall`/`postinstall` lifecycle hooks. Essential when called from inside another npm lifecycle (e.g. `syncDocs` running during gina's `postpublish`) because the docs repo's `prestart` hook (`node scripts/sync-gina-version.js`) would otherwise fire and read stale state. Always validate the command locally with a backup/restore of `package.json` + `package-lock.json` before committing a code path that runs it — `cp *.json /tmp/`, run the commands, `diff` the result, restore.
712
+
713
+ 50. **`package.json` `files` whitelist bypasses `.npmignore` for paths under a listed parent** — empirical audit (#S4, 2026-04-13): `files: ["framework/**", "script/", ...]` produces a 1098-file / 80 MB tarball vs. the `.npmignore`-only baseline of 409 files / 6.9 MB. When `files` lists a parent directory or globstar, nested `.npmignore` rules are bypassed for paths the glob matches — `framework/v*/node_modules` (481 leaks), `asset/plugin/{src,lib}` (incl. `compiler.jar`), `locales/src`, `*.map`, `script/{post_publish,prepare_version}.js` all re-ship. npm docs imply `.npmignore` still filters when `files` is set; in practice it does not for glob-matched paths. Only reliable shape is explicit leaf-level enumeration (one entry per subdirectory), which is fragile — every new subdir needs a `files` update or silently not ships. **Decision:** keep `.npmignore` deny-list; Claude-path leak defense relies on the five layered gates (`.gitignore` → `.npmignore` → pre-commit hook (#S5) → CI scan (#S6) → publish gate + prepack (#S3)). Any future reconsideration must begin with `npm pack --dry-run --ignore-scripts --json` against the proposed shape — reading npm docs alone is misleading.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gina",
3
- "version": "0.3.5",
3
+ "version": "0.3.6-alpha.2",
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",
@@ -37,7 +37,7 @@
37
37
  "email": "martin-luther.etouman@gina.io"
38
38
  },
39
39
  {
40
- "name": "Fabrice DELANEAU",
40
+ "name": "John Doe",
41
41
  "email": "fabrice.delaneau@gina.io",
42
42
  "url": "https://fdelaneau.com"
43
43
  }
@@ -56,7 +56,7 @@
56
56
  "gina-container": "bin/gina-container",
57
57
  "gina-init": "bin/gina-init"
58
58
  },
59
- "main": "./framework/v0.3.5/core/gna",
59
+ "main": "./framework/v0.3.6-alpha.2/core/gna",
60
60
  "types": "./types/index.d.ts",
61
61
  "typesVersions": {
62
62
  "*": {
@@ -0,0 +1,40 @@
1
+ #!/usr/bin/env bash
2
+ #
3
+ # pre-commit — block commits authored under a private identity.
4
+ #
5
+ # Opt-in install (run once from the repo root):
6
+ #
7
+ # cp resources/git-hooks/pre-commit .git/hooks/pre-commit
8
+ # chmod +x .git/hooks/pre-commit
9
+ #
10
+ # Purpose:
11
+ # Contributors sometimes have multiple git identities on one machine
12
+ # (work, personal, internal hostname). Committing to a public project
13
+ # with the wrong identity leaks private info into the public git log.
14
+ # This hook checks the currently-configured user.email against a list
15
+ # of private-domain patterns and aborts the commit if any match.
16
+ #
17
+ # Extend BLOCKED_PATTERNS below for any additional private domain or
18
+ # hostname suffix you want to guard against. The default list reflects
19
+ # the identities that have historically leaked into this repo.
20
+
21
+ set -e
22
+
23
+ BLOCKED_PATTERNS='freelancer\.app|\.local$|rhinostone\.com|freelancer-app\.fr'
24
+
25
+ email="$(git config user.email || true)"
26
+
27
+ if [ -z "$email" ]; then
28
+ echo "[pre-commit] No user.email configured — set one with 'git config user.email you@example.com'." >&2
29
+ exit 1
30
+ fi
31
+
32
+ if echo "$email" | grep -Eq "$BLOCKED_PATTERNS"; then
33
+ echo "[pre-commit] ERROR: commit blocked — user.email '$email' matches a private-identity pattern." >&2
34
+ echo "[pre-commit] Switch identity before committing:" >&2
35
+ echo " git config user.email you@public-domain.example" >&2
36
+ echo "[pre-commit] Then retry the commit." >&2
37
+ exit 1
38
+ fi
39
+
40
+ exit 0
@@ -34,7 +34,7 @@
34
34
  "email": "martin-luther.etouman@gina.io"
35
35
  },
36
36
  {
37
- "name": "Fabrice DELANEAU",
37
+ "name": "John Doe",
38
38
  "email": "fabrice.delaneau@gina.io",
39
39
  "url": "https://fdelaneau.com"
40
40
  }
@@ -13,20 +13,80 @@
13
13
  *
14
14
  * Runs as the `prepack` npm lifecycle hook. Before the tarball is assembled,
15
15
  * this script re-runs `npm pack --dry-run --json --ignore-scripts` and fails
16
- * the publish if any path in the pack listing matches a Claude-related name
17
- * (`CLAUDE.md`, `.claude*`).
16
+ * the publish if the pack listing is dirty on either of two axes:
18
17
  *
19
- * `--ignore-scripts` prevents recursion into the `prepare` script (which would
20
- * otherwise re-invoke `prepare_version.js` and commit a "Prerelease update").
18
+ * 1. Path-level: any file named `CLAUDE.md` or `.claude*`.
19
+ * 2. Content-level: any text file containing a private-token pattern
20
+ * (phone, private email, private address, private domain,
21
+ * co-author legal name that should be scrubbed to the "John Doe"
22
+ * pseudonym used in README/GOVERNANCE/CONTRIBUTING).
23
+ *
24
+ * `--ignore-scripts` prevents recursion into the `prepare` script (which
25
+ * would otherwise re-invoke `prepare_version.js` and commit a "Prerelease
26
+ * update").
21
27
  *
22
28
  * Exit codes:
23
- * 0 — pack listing is clean
24
- * 1 — Claude-related path detected OR check itself errored (fail closed)
29
+ * 0 — pack listing and contents are clean
30
+ * 1 — leakage detected OR check itself errored (fail closed)
25
31
  */
26
32
 
27
33
  var execSync = require('child_process').execSync;
34
+ var fs = require('fs');
35
+
36
+ var PATH_PATTERN = /(^|\/)(CLAUDE\.md|\.claude[a-z]*)/i;
37
+
38
+ // Private tokens that must not appear in published tarball contents.
39
+ // Keep patterns narrow — bare words like "Freelancer" are too broad and
40
+ // produce false positives on legitimate content; the domain form
41
+ // `freelancer.app` catches the leak-relevant variant.
42
+ var CONTENT_TOKENS = [
43
+ { name: 'private phone', pattern: /0618178647/ },
44
+ { name: 'private email', pattern: /[\w.+-]*etouman@rhinostone/i },
45
+ { name: 'private address', pattern: /Boulevard\s+Arago/i },
46
+ { name: 'private domain', pattern: /freelancer\.app/i },
47
+ { name: 'co-author legal name (use "John Doe" pseudonym)',
48
+ pattern: /Fabrice\s+Delaneau/i }
49
+ ];
28
50
 
29
- var PATTERN = /(^|\/)(CLAUDE\.md|\.claude[a-z]*)/i;
51
+ // Heuristic: only read files that are likely text. Saves time on binary
52
+ // assets (images, compiled JARs, compressed .br/.gz) and prevents
53
+ // pattern matches from random byte sequences.
54
+ var TEXT_EXT = /\.(md|txt|json|js|mjs|cjs|ts|tsx|jsx|html|htm|css|sass|scss|less|sh|bash|zsh|yaml|yml|xml|svg|csv|d\.ts|mapping|conf|ini|toml|env|template)$/i;
55
+ var TEXT_BASENAME = /^(AUTHORS|LICENSE|COPYING|CHANGELOG|README|NOTICE|CONTRIBUTING|GOVERNANCE|Makefile|\.npmignore|\.gitignore|\.eslintrc|\.editorconfig)(\.[^.]+)?$/;
56
+
57
+ // Scanner scripts contain the token patterns themselves — skip them to
58
+ // avoid self-matches. Future maintainers: add any new scanner files here.
59
+ var SELF_EXCLUDE = {
60
+ 'script/check_no_claude_leak.js': true,
61
+ 'script/prepare_version.js': true
62
+ };
63
+ // Files larger than this are skipped — production binaries and bundles
64
+ // don't warrant a byte-by-byte scan.
65
+ var MAX_SCAN_BYTES = 2 * 1024 * 1024;
66
+
67
+ function isTextPath(p) {
68
+ if (TEXT_EXT.test(p)) return true;
69
+ var base = p.split('/').pop();
70
+ if (TEXT_BASENAME.test(base)) return true;
71
+ return false;
72
+ }
73
+
74
+ function scanContent(path) {
75
+ var stat;
76
+ try { stat = fs.statSync(path); } catch (e) { return []; }
77
+ if (!stat.isFile() || stat.size > MAX_SCAN_BYTES) return [];
78
+
79
+ var content;
80
+ try { content = fs.readFileSync(path, 'utf8'); } catch (e) { return []; }
81
+
82
+ var hits = [];
83
+ for (var i = 0; i < CONTENT_TOKENS.length; i++) {
84
+ if (CONTENT_TOKENS[i].pattern.test(content)) {
85
+ hits.push(CONTENT_TOKENS[i].name);
86
+ }
87
+ }
88
+ return hits;
89
+ }
30
90
 
31
91
  try {
32
92
  var raw = execSync('npm pack --dry-run --json --ignore-scripts', {
@@ -34,27 +94,53 @@ try {
34
94
  }).toString();
35
95
 
36
96
  var parsed = JSON.parse(raw);
37
- var matches = [];
97
+ var pathMatches = [];
98
+ var contentMatches = [];
38
99
 
39
100
  for (var i = 0; i < parsed.length; i++) {
40
101
  var files = parsed[i].files || [];
41
102
  for (var j = 0; j < files.length; j++) {
42
- if (PATTERN.test(files[j].path)) {
43
- matches.push(files[j].path);
103
+ var p = files[j].path;
104
+
105
+ if (PATH_PATTERN.test(p)) {
106
+ pathMatches.push(p);
107
+ }
108
+
109
+ if (isTextPath(p) && !SELF_EXCLUDE[p]) {
110
+ var hits = scanContent(p);
111
+ for (var k = 0; k < hits.length; k++) {
112
+ contentMatches.push(p + ' — ' + hits[k]);
113
+ }
44
114
  }
45
115
  }
46
116
  }
47
117
 
48
- if (matches.length > 0) {
49
- console.error('[prepack] ERROR: Claude-related files detected in pack listing:');
50
- for (var k = 0; k < matches.length; k++) {
51
- console.error(' - ' + matches[k]);
118
+ var failed = false;
119
+
120
+ if (pathMatches.length > 0) {
121
+ console.error('[prepack] ERROR: Claude-related paths in pack listing:');
122
+ for (var a = 0; a < pathMatches.length; a++) {
123
+ console.error(' - ' + pathMatches[a]);
52
124
  }
53
125
  console.error('[prepack] Fix .npmignore (or package.json "files") before publishing.');
126
+ failed = true;
127
+ }
128
+
129
+ if (contentMatches.length > 0) {
130
+ if (failed) console.error('');
131
+ console.error('[prepack] ERROR: Private tokens in pack contents:');
132
+ for (var b = 0; b < contentMatches.length; b++) {
133
+ console.error(' - ' + contentMatches[b]);
134
+ }
135
+ console.error('[prepack] Scrub these files before publishing.');
136
+ failed = true;
137
+ }
138
+
139
+ if (failed) {
54
140
  process.exit(1);
55
141
  }
56
142
 
57
- console.log('[prepack] OK: pack listing contains no Claude-related paths.');
143
+ console.log('[prepack] OK: pack listing and contents are clean.');
58
144
  process.exit(0);
59
145
  } catch (err) {
60
146
  console.error('[prepack] Check failed: ' + (err.message || err));
@@ -717,6 +717,21 @@ function PostInstall() {
717
717
 
718
718
  restoreSymlinks();
719
719
 
720
+ // #S5 — install gina's pre-commit hook for contributor clones.
721
+ // `.git` exists at self.gina root only in a clone/worktree of the gina
722
+ // repo, not inside `node_modules/gina` on a consumer install. We gate on
723
+ // its presence so end-user `npm install gina` is a no-op here.
724
+ // `fs.existsSync(.git)` matches both main repo (.git dir) and linked
725
+ // worktrees (.git file pointing at ../.git/worktrees/<name>).
726
+ try {
727
+ if ( fs.existsSync( _(self.gina + '/.git', true) ) ) {
728
+ execSync('git -C "' + self.gina + '" config core.hooksPath .githooks');
729
+ console.debug('Installed gina git hooks path (core.hooksPath=.githooks)');
730
+ }
731
+ } catch (_hooksErr) {
732
+ console.warn('Could not install gina git hooks path: ' + (_hooksErr.message || _hooksErr));
733
+ }
734
+
720
735
  // configuring Gina
721
736
  var ginaBinanry = _(self.gina + '/bin/gina', true);
722
737
  if (!self.isCustomPrefix && self.isGlobalInstall) {
@@ -1 +0,0 @@
1
- 0.3.5
File without changes