@starci/hfs 4.3.0 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (515) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/db/migrate.mjs +361 -0
  3. package/db/post-cutover.mjs +136 -0
  4. package/emit/db-types.mjs +10 -1
  5. package/lint/run.mjs +1 -1
  6. package/package.json +4 -1
  7. package/release/gate.mjs +298 -0
  8. package/release/index.mjs +103 -0
  9. package/release/push.mjs +110 -0
  10. package/runtime/knowledge/hfs/canon-pins.yaml +11 -11
  11. package/runtime/knowledge/hfs/fe-stack.yaml +22 -1
  12. package/runtime/knowledge/hfs/rules.yaml +3401 -152
  13. package/runtime/knowledge/hfs/slots.yaml +344 -62
  14. package/runtime/knowledge/patterns/be/api.yaml +32 -5
  15. package/runtime/knowledge/patterns/be/cli.yaml +14 -4
  16. package/runtime/knowledge/patterns/be/event-bus.yaml +3 -3
  17. package/runtime/knowledge/patterns/be/jobs.yaml +20 -2
  18. package/runtime/knowledge/patterns/be/projections.yaml +4 -2
  19. package/runtime/knowledge/patterns/be/queues.yaml +11 -3
  20. package/runtime/knowledge/patterns/be/reactors.yaml +20 -1
  21. package/runtime/knowledge/patterns/be/realtime.yaml +25 -3
  22. package/runtime/knowledge/patterns/be/saga.yaml +20 -3
  23. package/runtime/knowledge/patterns/be/webhooks.yaml +23 -4
  24. package/runtime/knowledge/patterns/fe/folder.yaml +1 -0
  25. package/runtime/knowledge/sonar-gate.yaml +1 -1
  26. package/runtime/modules/kernel/failure-codes.yaml +3113 -43
  27. package/runtime/modules/models/runtimes.yaml +1 -1
  28. package/runtime/modules/schemas/application-stacks.schema.yaml +663 -0
  29. package/runtime/packages/cli/src/catalog.generated.mjs +14104 -0
  30. package/runtime/packages/cli/src/validate-args.mjs +213 -0
  31. package/runtime/scripts/api/git/add.mjs +5 -0
  32. package/runtime/scripts/api/git/init.mjs +7 -0
  33. package/runtime/scripts/api/git/lib.mjs +3 -0
  34. package/runtime/scripts/api/git/tag.mjs +5 -0
  35. package/runtime/scripts/api/node/lib.mjs +20 -0
  36. package/runtime/scripts/api/node/run-node.mjs +6 -0
  37. package/runtime/scripts/api/sops/lib.mjs +41 -0
  38. package/runtime/scripts/api/sops/selected-age-recipient.mjs +7 -0
  39. package/runtime/scripts/api/supabase/database-dump.mjs +5 -0
  40. package/runtime/scripts/api/supabase/database-query.mjs +5 -0
  41. package/runtime/scripts/api/supabase/lib.mjs +44 -0
  42. package/runtime/scripts/api/supabase/migration-repair.mjs +5 -0
  43. package/runtime/scripts/hfs/app-wiring.mjs +201 -0
  44. package/runtime/scripts/hfs/architecture/backend-app-files.mjs +1 -8
  45. package/runtime/scripts/hfs/architecture/backend.mjs +2 -7
  46. package/runtime/scripts/hfs/architecture/client-reaches-server.mjs +6 -3
  47. package/runtime/scripts/hfs/architecture/dead-exports-bindings.mjs +149 -0
  48. package/runtime/scripts/hfs/architecture/dead-exports.mjs +9 -41
  49. package/runtime/scripts/hfs/architecture/default-deny.mjs +8 -6
  50. package/runtime/scripts/hfs/architecture/frontend-world.mjs +1 -1
  51. package/runtime/scripts/hfs/architecture/function-spec-providers.mjs +153 -0
  52. package/runtime/scripts/hfs/architecture/hfs.mjs +3 -3
  53. package/runtime/scripts/hfs/architecture/module-per-transport.mjs +28 -13
  54. package/runtime/scripts/hfs/architecture/next-data-inference.mjs +176 -0
  55. package/runtime/scripts/hfs/architecture/next-data-symbols.mjs +26 -0
  56. package/runtime/scripts/hfs/architecture/next-data.mjs +31 -23
  57. package/runtime/scripts/hfs/architecture/reachability.mjs +14 -0
  58. package/runtime/scripts/hfs/architecture/register-once.mjs +2 -2
  59. package/runtime/scripts/hfs/architecture/source-names.mjs +48 -3
  60. package/runtime/scripts/hfs/architecture/supabase-ast.mjs +211 -11
  61. package/runtime/scripts/hfs/architecture/supabase-be.mjs +1 -1
  62. package/runtime/scripts/hfs/architecture/supabase.mjs +59 -21
  63. package/runtime/scripts/hfs/architecture/surface.mjs +2 -1
  64. package/runtime/scripts/hfs/architecture/tiers.mjs +3 -3
  65. package/runtime/scripts/hfs/architecture/unit-spec-providers.mjs +8 -2
  66. package/runtime/scripts/hfs/check-results.mjs +28 -0
  67. package/runtime/scripts/hfs/check.mjs +46 -47
  68. package/runtime/scripts/hfs/coverage-from.mjs +70 -0
  69. package/runtime/scripts/hfs/db-baseline-verb.mjs +276 -0
  70. package/runtime/scripts/hfs/db-plan-verb.mjs +254 -0
  71. package/runtime/scripts/hfs/db-restamp-verb.mjs +60 -0
  72. package/runtime/scripts/hfs/declaration-shape.mjs +39 -3
  73. package/runtime/scripts/hfs/doc-commands.mjs +367 -0
  74. package/runtime/scripts/hfs/edition-slots.mjs +2 -2
  75. package/runtime/scripts/hfs/example-secrets.mjs +158 -0
  76. package/runtime/scripts/hfs/manifest-shape.mjs +67 -7
  77. package/runtime/scripts/hfs/refusal-codes.mjs +6 -0
  78. package/runtime/scripts/hfs/rule-catalog.mjs +156 -11
  79. package/runtime/scripts/hfs/rule-params-shape.mjs +22 -10
  80. package/runtime/scripts/hfs/rules/a15-findings.mjs +88 -0
  81. package/runtime/scripts/hfs/rules/app-env-required.mjs +20 -0
  82. package/runtime/scripts/hfs/rules/app-root.mjs +2 -2
  83. package/runtime/scripts/hfs/rules/assets.mjs +79 -0
  84. package/runtime/scripts/hfs/rules/boot-proof.mjs +16 -0
  85. package/runtime/scripts/hfs/rules/canon-copy-drift.mjs +59 -0
  86. package/runtime/scripts/hfs/rules/contract.mjs +66 -5
  87. package/runtime/scripts/hfs/rules/coverage-below.mjs +230 -0
  88. package/runtime/scripts/hfs/rules/database-access.mjs +343 -0
  89. package/runtime/scripts/hfs/rules/database-baseline.mjs +142 -0
  90. package/runtime/scripts/hfs/rules/database-config.mjs +250 -2
  91. package/runtime/scripts/hfs/rules/database-constants.mjs +9 -0
  92. package/runtime/scripts/hfs/rules/database-migrations.mjs +286 -7
  93. package/runtime/scripts/hfs/rules/database-plpgsql.mjs +119 -9
  94. package/runtime/scripts/hfs/rules/database-queue-sources.mjs +176 -0
  95. package/runtime/scripts/hfs/rules/database-queues.mjs +361 -0
  96. package/runtime/scripts/hfs/rules/database-sql.mjs +91 -9
  97. package/runtime/scripts/hfs/rules/database.mjs +9 -0
  98. package/runtime/scripts/hfs/rules/deploy-scan.mjs +192 -0
  99. package/runtime/scripts/hfs/rules/deploy-workflow.mjs +219 -0
  100. package/runtime/scripts/hfs/rules/doc-fresh.mjs +286 -0
  101. package/runtime/scripts/hfs/rules/docker-health.mjs +249 -0
  102. package/runtime/scripts/hfs/rules/docker.mjs +24 -7
  103. package/runtime/scripts/hfs/rules/edition.mjs +9 -8
  104. package/runtime/scripts/hfs/rules/env-parity.mjs +373 -0
  105. package/runtime/scripts/hfs/rules/env-value-shape.mjs +113 -0
  106. package/runtime/scripts/hfs/rules/event-bus.mjs +3 -2
  107. package/runtime/scripts/hfs/rules/event-tables.mjs +100 -0
  108. package/runtime/scripts/hfs/rules/fe-contract-documents.mjs +115 -15
  109. package/runtime/scripts/hfs/rules/fe-stack.mjs +57 -0
  110. package/runtime/scripts/hfs/rules/feature-files.mjs +28 -0
  111. package/runtime/scripts/hfs/rules/frontend-tree.mjs +54 -35
  112. package/runtime/scripts/hfs/rules/integration-specs.mjs +3 -2
  113. package/runtime/scripts/hfs/rules/lexicon.mjs +62 -0
  114. package/runtime/scripts/hfs/rules/lite-proof-lane.mjs +89 -0
  115. package/runtime/scripts/hfs/rules/monorepo.mjs +14 -1
  116. package/runtime/scripts/hfs/rules/pipeline.mjs +8 -1
  117. package/runtime/scripts/hfs/rules/release-provenance.mjs +211 -0
  118. package/runtime/scripts/hfs/rules/saga-delivery.mjs +66 -0
  119. package/runtime/scripts/hfs/rules/saga.mjs +8 -16
  120. package/runtime/scripts/hfs/rules/script-hygiene.mjs +151 -0
  121. package/runtime/scripts/hfs/rules/secret-custody-only.mjs +65 -0
  122. package/runtime/scripts/hfs/rules/secrets.mjs +13 -0
  123. package/runtime/scripts/hfs/rules/services.mjs +4 -4
  124. package/runtime/scripts/hfs/rules/stack-tooling.mjs +93 -0
  125. package/runtime/scripts/hfs/rules/stacks-deploy.mjs +76 -0
  126. package/runtime/scripts/hfs/rules/stacks-ingress.mjs +87 -0
  127. package/runtime/scripts/hfs/rules/stacks-lite-backing.mjs +111 -0
  128. package/runtime/scripts/hfs/rules/stacks-release.mjs +366 -0
  129. package/runtime/scripts/hfs/rules/stacks-runtime.mjs +41 -1
  130. package/runtime/scripts/hfs/rules/stacks-swarm.mjs +417 -0
  131. package/runtime/scripts/hfs/rules/supabase-secrets.mjs +1 -1
  132. package/runtime/scripts/hfs/rules/supply-chain.mjs +167 -0
  133. package/runtime/scripts/hfs/rules/unused-symbol-flow.mjs +101 -0
  134. package/runtime/scripts/hfs/rules/unused-symbol-ledger.mjs +77 -0
  135. package/runtime/scripts/hfs/rules/unused-symbol-translators.mjs +165 -0
  136. package/runtime/scripts/hfs/rules/unused-symbol-values.mjs +103 -0
  137. package/runtime/scripts/hfs/rules/unused-symbol.mjs +320 -0
  138. package/runtime/scripts/hfs/runtime-rules/source-ast.mjs +185 -0
  139. package/runtime/scripts/hfs/runtime-rules/workflow-source.mjs +19 -0
  140. package/runtime/scripts/hfs/sealed-members.mjs +101 -0
  141. package/runtime/scripts/hfs/secret-bootstrap-crypto.mjs +200 -0
  142. package/runtime/scripts/hfs/secret-edit.mjs +170 -0
  143. package/runtime/scripts/hfs/secret-init.mjs +127 -19
  144. package/runtime/scripts/hfs/secret-sops.mjs +38 -6
  145. package/runtime/scripts/hfs/secret-store.mjs +56 -54
  146. package/runtime/scripts/hfs/secret.mjs +34 -5
  147. package/runtime/scripts/hfs/slot-imports.mjs +18 -5
  148. package/runtime/scripts/hfs/slots.mjs +1 -0
  149. package/runtime/scripts/hfs/stack-config-kit.mjs +34 -0
  150. package/runtime/scripts/hfs/stack-deploy-config.mjs +313 -0
  151. package/runtime/scripts/hfs/stack-ingress-config.mjs +237 -0
  152. package/runtime/scripts/hfs/stacks-gate.mjs +414 -0
  153. package/runtime/scripts/hfs/starcistacks-runtime.mjs +61 -0
  154. package/runtime/scripts/lib/command-tokens.mjs +126 -0
  155. package/runtime/scripts/lib/compose-values.mjs +11 -0
  156. package/runtime/scripts/lib/deployment-findings.mjs +7 -0
  157. package/runtime/scripts/lib/json-clone.mjs +61 -0
  158. package/runtime/scripts/lib/list.mjs +4 -0
  159. package/runtime/scripts/lib/runtime-example.mjs +13 -0
  160. package/runtime/scripts/lib/secret-patterns.mjs +60 -5
  161. package/runtime/scripts/lib/sql-ast.mjs +32 -0
  162. package/runtime/scripts/lib/stack-services.mjs +1 -1
  163. package/runtime/scripts/lib/swarm-stack.mjs +5 -18
  164. package/runtime/scripts/lib/trim-end.mjs +8 -0
  165. package/runtime/scripts/lib/ts-analysis.mjs +5 -2
  166. package/runtime/scripts/lib/ts-ast.mjs +27 -2
  167. package/runtime/scripts/lib/workflow-events.mjs +8 -0
  168. package/scaffold/add-app.mjs +77 -59
  169. package/scaffold/add-cli-lite.mjs +14 -6
  170. package/scaffold/add-compose.mjs +79 -0
  171. package/scaffold/add-database-lite.mjs +14 -0
  172. package/scaffold/add-fe-overlay.mjs +122 -0
  173. package/scaffold/add-fe-page.mjs +269 -0
  174. package/scaffold/add-inbox-lite.mjs +74 -42
  175. package/scaffold/add-table.mjs +110 -87
  176. package/scaffold/add.mjs +159 -44
  177. package/scaffold/app.mjs +124 -39
  178. package/scaffold/edition-gate.mjs +3 -3
  179. package/scaffold/lite-exports.mjs +2 -1
  180. package/scaffold/service.mjs +2 -2
  181. package/src/main.mjs +229 -116
  182. package/stack/age-install.mjs +37 -0
  183. package/stack/backup.mjs +100 -0
  184. package/stack/build-args.mjs +42 -0
  185. package/stack/build.mjs +173 -0
  186. package/stack/cli.mjs +130 -0
  187. package/stack/config.mjs +57 -0
  188. package/stack/context.mjs +57 -0
  189. package/stack/converge.mjs +107 -0
  190. package/stack/deploy.mjs +301 -0
  191. package/stack/digest.mjs +16 -0
  192. package/stack/docker-transport.mjs +53 -0
  193. package/stack/edge-alias.mjs +118 -0
  194. package/stack/errors.mjs +21 -0
  195. package/stack/image-scan.mjs +152 -0
  196. package/stack/ingress-create.mjs +114 -0
  197. package/stack/ingress-publish.mjs +273 -0
  198. package/stack/ingress.mjs +706 -0
  199. package/stack/jobs.mjs +51 -0
  200. package/stack/live-restore.mjs +177 -0
  201. package/stack/prepare.mjs +266 -0
  202. package/stack/private-file.mjs +22 -0
  203. package/stack/provision.mjs +90 -0
  204. package/stack/prune.mjs +46 -0
  205. package/stack/release-store.mjs +87 -0
  206. package/stack/remote.mjs +205 -0
  207. package/stack/render.mjs +149 -0
  208. package/stack/retire.mjs +47 -0
  209. package/stack/sealed.mjs +149 -0
  210. package/stack/task.mjs +42 -0
  211. package/stack/verify.mjs +99 -0
  212. package/sync/ci-commands.mjs +13 -0
  213. package/sync/index.mjs +108 -52
  214. package/sync/stack-images.mjs +127 -0
  215. package/templates/app/ci-workflows/github/workflows/ci.yml +5 -1
  216. package/templates/app/ci-workflows/github/workflows/images.yml +15 -3
  217. package/templates/app/ci-workflows/github/workflows/stack-deploy.yml +148 -0
  218. package/templates/app/ci-workflows-lite/github/workflows/ci.yml +7 -3
  219. package/templates/app/ci-workflows-lite/github/workflows/db-deploy.yml +38 -6
  220. package/templates/app/ci-workflows-lite/github/workflows/images.yml +14 -2
  221. package/templates/app/ci-workflows-lite/github/workflows/stack-deploy.yml +148 -0
  222. package/templates/app/codegen-graphql.mjs.partial +13 -2
  223. package/templates/app/codegen-lite/scripts/codegen.mjs +6 -1
  224. package/templates/app/codegen-prelude.mjs.partial +8 -0
  225. package/templates/app/gitignore +3 -0
  226. package/templates/app/gitignore-lite +3 -0
  227. package/templates/app/package-scripts/package.json +1 -0
  228. package/templates/app/package-scripts/supabase.json +7 -0
  229. package/templates/app/package-scripts-lite/package.json +1 -7
  230. package/templates/app/skeleton/.editorconfig +1 -0
  231. package/templates/app/skeleton/.gitattributes +7 -1
  232. package/templates/app/skeleton/.github/dependabot.yml +17 -0
  233. package/templates/app/skeleton/.nvmrc +1 -1
  234. package/templates/app/skeleton/.starcistacks/application-stacks.yaml +134 -1
  235. package/templates/app/skeleton/.starcistacks/dev/README.md +16 -0
  236. package/templates/app/skeleton/.starcistacks/dev/environment.json +5 -0
  237. package/templates/app/skeleton/.starcistacks/dev/infra/compose/stack.yaml +71 -0
  238. package/templates/app/skeleton/.starcistacks/dev/runtime/env/KEYS.md +14 -0
  239. package/templates/app/skeleton/.starcistacks/production/README.md +37 -0
  240. package/templates/app/skeleton/.starcistacks/production/environment.json +5 -0
  241. package/templates/app/skeleton/.starcistacks/production/infra/swarm/Caddyfile +15 -0
  242. package/templates/app/skeleton/.starcistacks/production/infra/swarm/owner-actions.md +11 -0
  243. package/templates/app/skeleton/.starcistacks/production/infra/swarm/recovery/restore-proof.md +7 -0
  244. package/templates/app/skeleton/.starcistacks/production/infra/swarm/releases/current.yaml +6 -0
  245. package/templates/app/skeleton/.starcistacks/production/infra/swarm/releases/images.lock.yaml +9 -0
  246. package/templates/app/skeleton/.starcistacks/production/infra/swarm/releases/previous.yaml +6 -0
  247. package/templates/app/skeleton/.starcistacks/production/infra/swarm/stack.yaml +142 -0
  248. package/templates/app/skeleton/.starcistacks/production/runtime/env/KEYS.md +14 -0
  249. package/templates/app/skeleton/README.md +6 -6
  250. package/templates/app/skeleton/scripts/codegen.mjs +1 -2
  251. package/templates/app/skeleton-lite/.editorconfig +16 -0
  252. package/templates/app/skeleton-lite/.gitattributes +8 -0
  253. package/templates/app/skeleton-lite/.github/dependabot.yml +17 -0
  254. package/templates/app/skeleton-lite/.nvmrc +1 -0
  255. package/templates/app/skeleton-lite/.sops.yaml +3 -2
  256. package/templates/app/skeleton-lite/.starcistacks/application-stacks.yaml +178 -1
  257. package/templates/app/skeleton-lite/.starcistacks/dev/README.md +20 -0
  258. package/templates/app/skeleton-lite/.starcistacks/dev/environment.json +2 -1
  259. package/templates/app/skeleton-lite/.starcistacks/dev/infra/swarm/Caddyfile +16 -0
  260. package/templates/app/skeleton-lite/.starcistacks/dev/infra/swarm/owner-actions.md +11 -0
  261. package/templates/app/skeleton-lite/.starcistacks/dev/infra/swarm/recovery/restore-proof.md +7 -0
  262. package/templates/app/skeleton-lite/.starcistacks/dev/infra/swarm/releases/current.yaml +6 -0
  263. package/templates/app/skeleton-lite/.starcistacks/dev/infra/swarm/releases/images.lock.yaml +8 -0
  264. package/templates/app/skeleton-lite/.starcistacks/dev/infra/swarm/releases/previous.yaml +6 -0
  265. package/templates/app/skeleton-lite/.starcistacks/dev/infra/swarm/stack.yaml +120 -0
  266. package/templates/app/skeleton-lite/.starcistacks/dev/runtime/env/KEYS.md +18 -0
  267. package/templates/app/skeleton-lite/.starcistacks/production/README.md +38 -0
  268. package/templates/app/skeleton-lite/.starcistacks/production/environment.json +6 -0
  269. package/templates/app/skeleton-lite/.starcistacks/production/infra/swarm/Caddyfile +11 -0
  270. package/templates/app/skeleton-lite/.starcistacks/production/infra/swarm/owner-actions.md +11 -0
  271. package/templates/app/skeleton-lite/.starcistacks/production/infra/swarm/recovery/restore-proof.md +7 -0
  272. package/templates/app/skeleton-lite/.starcistacks/production/infra/swarm/releases/current.yaml +6 -0
  273. package/templates/app/skeleton-lite/.starcistacks/production/infra/swarm/releases/images.lock.yaml +8 -0
  274. package/templates/app/skeleton-lite/.starcistacks/production/infra/swarm/releases/previous.yaml +6 -0
  275. package/templates/app/skeleton-lite/.starcistacks/production/infra/swarm/stack.yaml +121 -0
  276. package/templates/app/skeleton-lite/.starcistacks/production/runtime/env/KEYS.md +21 -0
  277. package/templates/app/skeleton-lite/.starciwork/brand/index.yaml +12 -0
  278. package/templates/app/skeleton-lite/README.md +5 -3
  279. package/templates/app/skeleton-lite/supabase/config.toml +8 -1
  280. package/templates/app/skeleton-lite/supabase/migrations/__timestamp___baseline.sql +15 -6
  281. package/templates/app/upgrade-full/.starcistacks/dev/README.md +13 -7
  282. package/templates/be/image/worker/Dockerfile +1 -1
  283. package/templates/be/inbox/database-client.spec.ts.tpl +17 -18
  284. package/templates/be/inbox/database-client.ts.tpl +12 -11
  285. package/templates/be/inbox/delivery-recorded.event.ts.tpl +36 -0
  286. package/templates/be/inbox/event-index.ts.tpl +1 -0
  287. package/templates/be/inbox/events.json.tpl +10 -0
  288. package/templates/be/inbox/migration.sql.tpl +1 -0
  289. package/templates/be/inbox/platform/event-bus/event-bus.contracts.ts.tpl +42 -0
  290. package/templates/be/inbox/platform/event-bus/event-bus.decorators.ts.tpl +9 -0
  291. package/templates/be/inbox/platform/event-bus/event-bus.module-definition.ts.tpl +6 -0
  292. package/templates/be/inbox/platform/event-bus/event-bus.module.ts.tpl +19 -0
  293. package/templates/be/inbox/platform/event-bus/event-bus.options.ts.tpl +2 -0
  294. package/templates/be/inbox/platform/event-bus/event-bus.port.ts.tpl +16 -0
  295. package/templates/be/inbox/platform/event-bus/event-bus.service.spec.ts.tpl +45 -0
  296. package/templates/be/inbox/platform/event-bus/event-bus.service.ts.tpl +15 -0
  297. package/templates/be/inbox/platform/event-bus/index.ts.tpl +5 -0
  298. package/templates/be/inbox/platform/event-bus/persistence/event-bus.sql.ts.tpl +5 -0
  299. package/templates/be/inbox/platform/inbox/inbox.decorators.ts.tpl +9 -0
  300. package/templates/be/inbox/platform/inbox/inbox.module-definition.ts.tpl +6 -0
  301. package/templates/be/inbox/platform/inbox/inbox.module.ts.tpl +19 -0
  302. package/templates/be/inbox/platform/inbox/inbox.options.ts.tpl +2 -0
  303. package/templates/be/inbox/platform/inbox/inbox.port.ts.tpl +10 -0
  304. package/templates/be/inbox/platform/inbox/inbox.service.spec.ts.tpl +41 -0
  305. package/templates/be/inbox/platform/inbox/inbox.service.ts.tpl +19 -0
  306. package/templates/be/inbox/platform/inbox/index.ts.tpl +3 -0
  307. package/templates/be/inbox/platform/inbox/persistence/inbox.sql.ts.tpl +7 -0
  308. package/templates/be/inbox/platform/migration.sql.tpl +48 -0
  309. package/templates/be/inbox/service.spec.ts.tpl +42 -9
  310. package/templates/be/inbox/service.ts.tpl +23 -8
  311. package/templates/be/inbox/webhook-door.spec.ts.tpl +1 -1
  312. package/templates/be/inbox/webhook-door.ts.tpl +2 -2
  313. package/templates/be/patterns/api/feature.module-definition.ts.tpl +6 -0
  314. package/templates/be/patterns/api/feature.module.ts.tpl +2 -1
  315. package/templates/be/patterns/api/feature.options.ts.tpl +2 -0
  316. package/templates/be/patterns/api/graphql.module-definition.ts.tpl +6 -0
  317. package/templates/be/patterns/api/graphql.module.ts.tpl +3 -2
  318. package/templates/be/patterns/api/graphql.options.ts.tpl +2 -0
  319. package/templates/be/patterns/cli/group.module-definition.ts.tpl +6 -0
  320. package/templates/be/patterns/cli/group.module.ts.tpl +2 -1
  321. package/templates/be/patterns/cli/group.options.ts.tpl +2 -0
  322. package/templates/be/patterns/event-bus/platform/errors/event-bus.error.ts.tpl +0 -3
  323. package/templates/be/patterns/event-bus/platform/messages/event-bus.messages.ts.tpl +0 -2
  324. package/templates/be/patterns/jobs/job.module-definition.ts.tpl +6 -0
  325. package/templates/be/patterns/jobs/job.module.ts.tpl +2 -1
  326. package/templates/be/patterns/jobs/job.options.ts.tpl +2 -0
  327. package/templates/be/patterns/jobs/job.queue.module-definition.ts.tpl +6 -0
  328. package/templates/be/patterns/jobs/job.queue.module.ts.tpl +6 -3
  329. package/templates/be/patterns/jobs/job.queue.options.ts.tpl +2 -0
  330. package/templates/be/patterns/jobs/platform/fenced.processor.spec.ts.tpl +3 -1
  331. package/templates/be/patterns/outbox/platform/outbox-relay.policy.spec.ts.tpl +25 -9
  332. package/templates/be/patterns/queues/platform/queue.config.ts.tpl +1 -1
  333. package/templates/be/patterns/queues/platform/queue.index.ts.tpl +1 -1
  334. package/templates/be/patterns/queues/platform/queue.module-definition.ts.tpl +2 -2
  335. package/templates/be/patterns/queues/platform/queue.module.ts.tpl +11 -0
  336. package/templates/be/patterns/queues/platform/queue.options.ts.tpl +10 -0
  337. package/templates/be/patterns/queues/queue.module-definition.ts.tpl +6 -0
  338. package/templates/be/patterns/queues/queue.module.ts.tpl +2 -1
  339. package/templates/be/patterns/queues/queue.options.ts.tpl +2 -0
  340. package/templates/be/patterns/reactors/message.module-definition.ts.tpl +6 -0
  341. package/templates/be/patterns/reactors/message.module.ts.tpl +6 -3
  342. package/templates/be/patterns/reactors/message.options.ts.tpl +2 -0
  343. package/templates/be/patterns/reactors/reactor.module-definition.ts.tpl +6 -0
  344. package/templates/be/patterns/reactors/reactor.module.ts.tpl +2 -1
  345. package/templates/be/patterns/reactors/reactor.options.ts.tpl +2 -0
  346. package/templates/be/patterns/realtime/channel.gateway.spec.ts.tpl +188 -0
  347. package/templates/be/patterns/realtime/channel.gateway.ts.tpl +22 -0
  348. package/templates/be/patterns/realtime/channel.graphql.module-definition.ts.tpl +6 -0
  349. package/templates/be/patterns/realtime/channel.graphql.module.ts.tpl +2 -1
  350. package/templates/be/patterns/realtime/channel.graphql.options.ts.tpl +2 -0
  351. package/templates/be/patterns/realtime/channel.websocket.module-definition.ts.tpl +6 -0
  352. package/templates/be/patterns/realtime/channel.websocket.module.ts.tpl +110 -0
  353. package/templates/be/patterns/realtime/channel.websocket.options.ts.tpl +7 -0
  354. package/templates/be/patterns/saga/saga.message.module-definition.ts.tpl +6 -0
  355. package/templates/be/patterns/saga/saga.message.module.ts.tpl +6 -3
  356. package/templates/be/patterns/saga/saga.message.options.ts.tpl +2 -0
  357. package/templates/be/patterns/saga/saga.module-definition.ts.tpl +6 -0
  358. package/templates/be/patterns/saga/saga.module.ts.tpl +2 -1
  359. package/templates/be/patterns/saga/saga.options.ts.tpl +2 -0
  360. package/templates/be/patterns/webhooks/webhook.http.module-definition.ts.tpl +6 -0
  361. package/templates/be/patterns/webhooks/webhook.http.module.ts.tpl +2 -1
  362. package/templates/be/patterns/webhooks/webhook.http.options.ts.tpl +2 -0
  363. package/templates/be/platform/graphql/localize-errors.mapper.spec.ts +80 -26
  364. package/templates/be/platform/graphql/localize-errors.mapper.ts +2 -5
  365. package/templates/be/skeleton/apps/__app__/src/app.module.ts +11 -9
  366. package/templates/be/skeleton/apps/__app__/src/compose/api.ts +4 -0
  367. package/templates/be/skeleton/apps/__app__/src/compose/domain.ts +11 -0
  368. package/templates/be/skeleton/apps/__app__/src/compose/platform.ts +2 -0
  369. package/templates/be/skeleton/apps/__app__/src/compose/system.ts +5 -0
  370. package/templates/be/skeleton/apps/__app__/src/compose/webhooks.ts +4 -0
  371. package/templates/be/skeleton/apps/__app__/src/main.ts +15 -1
  372. package/templates/be/skeleton/apps/cli/src/app.module.ts +3 -13
  373. package/templates/be/skeleton/apps/cli/src/cli.options.ts +6 -14
  374. package/templates/be/skeleton/apps/cli/src/compose/cli.ts +5 -0
  375. package/templates/be/skeleton/apps/cli/src/compose/platform.ts +24 -0
  376. package/templates/be/skeleton/src/features/api/system-health/application/check-readiness.contracts.ts +2 -0
  377. package/templates/be/skeleton/src/features/api/system-health/application/check-readiness.handler.ts +22 -0
  378. package/templates/be/skeleton/src/features/api/system-health/application/check-readiness.query.ts +11 -0
  379. package/templates/be/skeleton/src/features/api/system-health/system-health.module-definition.ts +6 -0
  380. package/templates/be/skeleton/src/features/api/system-health/system-health.module.ts +5 -3
  381. package/templates/be/skeleton/src/features/api/system-health/system-health.options.ts +2 -0
  382. package/templates/be/skeleton/src/features/api/system-health/transport/http/ready.controller.ts +19 -0
  383. package/templates/be/skeleton/src/features/api/system-health/transport/http/system-health-http.module-definition.ts +6 -0
  384. package/templates/be/skeleton/src/features/api/system-health/transport/http/system-health-http.module.ts +8 -3
  385. package/templates/be/skeleton/src/features/api/system-health/transport/http/system-health-http.options.ts +2 -0
  386. package/templates/be/skeleton/src/features/cli/cli.module-definition.ts +6 -0
  387. package/templates/be/skeleton/src/features/cli/cli.module.ts +3 -2
  388. package/templates/be/skeleton/src/features/cli/cli.options.ts +2 -0
  389. package/templates/be/skeleton/src/features/cli/migrate/migrate.module-definition.ts +6 -0
  390. package/templates/be/skeleton/src/features/cli/migrate/migrate.module.ts +2 -1
  391. package/templates/be/skeleton/src/features/cli/migrate/migrate.options.ts +2 -0
  392. package/templates/be/skeleton/src/features/cli/seed/seed.module-definition.ts +6 -0
  393. package/templates/be/skeleton/src/features/cli/seed/seed.module.ts +2 -1
  394. package/templates/be/skeleton/src/features/cli/seed/seed.options.ts +2 -0
  395. package/templates/be/skeleton/src/features/cli/seed/subs/run.cli.spec.ts +5 -6
  396. package/templates/be/skeleton/src/modules/domain/identity/admission.policy.spec.ts +56 -4
  397. package/templates/be/skeleton/src/modules/domain/identity/admission.policy.ts +36 -5
  398. package/templates/be/skeleton/src/modules/domain/identity/auth.guard.spec.ts +39 -8
  399. package/templates/be/skeleton/src/modules/domain/identity/auth.guard.ts +14 -8
  400. package/templates/be/skeleton/src/modules/domain/identity/credential.contracts.ts +26 -0
  401. package/templates/be/skeleton/src/modules/domain/identity/credential.guard.spec.ts +119 -0
  402. package/templates/be/skeleton/src/modules/domain/identity/credential.guard.ts +43 -0
  403. package/templates/be/skeleton/src/modules/domain/identity/identity.contracts.ts +16 -0
  404. package/templates/be/skeleton/src/modules/domain/identity/identity.decorators.ts +18 -1
  405. package/templates/be/skeleton/src/modules/domain/identity/identity.module.ts +22 -4
  406. package/templates/be/skeleton/src/modules/domain/identity/identity.options.ts +8 -2
  407. package/templates/be/skeleton/src/modules/domain/identity/index.ts +1 -0
  408. package/templates/be/skeleton/src/modules/platform/database/connection-source.client.spec.ts +11 -4
  409. package/templates/be/skeleton/src/modules/platform/database/database-probe.service.spec.ts +32 -0
  410. package/templates/be/skeleton/src/modules/platform/database/database-probe.service.ts +14 -0
  411. package/templates/be/skeleton/src/modules/platform/database/database.module.ts +7 -1
  412. package/templates/be/skeleton/src/modules/platform/database/index.ts +2 -0
  413. package/templates/be/skeleton/src/modules/platform/database/primary.decorators.ts +8 -0
  414. package/templates/be/skeleton/src/modules/platform/database/seed-connections.client.spec.ts +25 -6
  415. package/templates/be/skeleton/src/modules/platform/errors/errors.filter.spec.ts +16 -6
  416. package/templates/be/skeleton/src/modules/platform/http-security/edge-security.service.spec.ts +130 -0
  417. package/templates/be/skeleton/src/modules/platform/http-security/edge-security.service.ts +58 -0
  418. package/templates/be/skeleton/src/modules/platform/http-security/errors/http-security.error.ts +3 -0
  419. package/templates/be/skeleton/src/modules/platform/http-security/execution-request.mapper.spec.ts +16 -4
  420. package/templates/be/skeleton/src/modules/platform/http-security/http-security.config.ts +16 -10
  421. package/templates/be/skeleton/src/modules/platform/http-security/http-security.module.ts +3 -1
  422. package/templates/be/skeleton/src/modules/platform/http-security/http-security.options.ts +2 -0
  423. package/templates/be/skeleton/src/modules/platform/http-security/index.ts +5 -0
  424. package/templates/be/skeleton/src/modules/platform/http-security/messages/http-security.messages.ts +12 -5
  425. package/templates/be/skeleton/src/modules/platform/http-security/rate-limit.guard.spec.ts +13 -8
  426. package/templates/be/skeleton/src/modules/platform/http-security/readiness.contracts.ts +5 -0
  427. package/templates/be/skeleton/src/modules/platform/http-security/readiness.decorators.ts +7 -0
  428. package/templates/be/skeleton/src/modules/platform/http-security/readiness.service.spec.ts +86 -0
  429. package/templates/be/skeleton/src/modules/platform/http-security/readiness.service.ts +39 -0
  430. package/templates/be/skeleton/src/modules/platform/http-security/webhook-signature.service.spec.ts +139 -131
  431. package/templates/be/skeleton/src/modules/platform/i18n/index.ts +1 -1
  432. package/templates/be/skeleton/src/modules/platform/logging/json-logger.service.spec.ts +91 -67
  433. package/templates/be/skeleton/src/modules/platform/logging/json-logger.service.ts +5 -4
  434. package/templates/be/skeleton/src/modules/platform/logging/logging.log-events.ts +0 -2
  435. package/templates/be/skeleton/src/modules/platform/primitives/outcome.mapper.spec.ts +20 -6
  436. package/templates/be/skeleton/src/modules/platform/primitives/sequence.policy.spec.ts +16 -4
  437. package/templates/be/skeleton/src/modules/platform/retry/index.ts +3 -0
  438. package/templates/be/skeleton/src/modules/platform/retry/retry.decorators.ts +9 -0
  439. package/templates/be/skeleton/src/modules/platform/retry/retry.module-definition.ts +7 -0
  440. package/templates/be/skeleton/src/modules/platform/retry/retry.module.ts +19 -0
  441. package/templates/be/skeleton/src/modules/platform/retry/retry.options.ts +2 -0
  442. package/templates/be/skeleton/src/modules/platform/retry/retry.port.ts +11 -0
  443. package/templates/be/skeleton/src/modules/platform/retry/system-timer.service.spec.ts +36 -0
  444. package/templates/be/skeleton/src/modules/platform/retry/system-timer.service.ts +10 -0
  445. package/templates/be/skeleton/src/tests/contract/http-security/http-security.contract-spec.ts +54 -0
  446. package/templates/be/skeleton-lite/apps/api/src/app.module.ts +14 -18
  447. package/templates/be/skeleton-lite/apps/api/src/compose/api.ts +4 -0
  448. package/templates/be/skeleton-lite/apps/api/src/compose/domain.ts +10 -0
  449. package/templates/be/skeleton-lite/apps/api/src/compose/integrations.ts +16 -0
  450. package/templates/be/skeleton-lite/apps/api/src/compose/platform.ts +2 -0
  451. package/templates/be/skeleton-lite/apps/api/src/compose/system.ts +5 -0
  452. package/templates/be/skeleton-lite/apps/api/src/compose/webhooks.ts +4 -0
  453. package/templates/be/skeleton-lite/apps/api/src/main.ts +2 -3
  454. package/templates/be/skeleton-lite/apps/cli/src/compose/platform.ts +12 -0
  455. package/templates/be/skeleton-lite/src/modules/domain/identity/admission.policy.spec.ts +71 -5
  456. package/templates/be/skeleton-lite/src/modules/domain/identity/admission.policy.ts +29 -2
  457. package/templates/be/skeleton-lite/src/modules/domain/identity/auth.guard.spec.ts +68 -15
  458. package/templates/be/skeleton-lite/src/modules/domain/identity/auth.guard.ts +14 -9
  459. package/templates/be/skeleton-lite/src/modules/domain/identity/identity.contracts.ts +9 -2
  460. package/templates/be/skeleton-lite/src/modules/domain/identity/identity.decorators.ts +16 -1
  461. package/templates/be/skeleton-lite/src/modules/domain/identity/identity.module.ts +19 -4
  462. package/templates/be/skeleton-lite/src/modules/domain/identity/identity.options.ts +5 -1
  463. package/templates/be/skeleton-lite/src/modules/domain/identity/index.ts +2 -1
  464. package/templates/be/skeleton-lite/src/modules/integrations/supabase/errors/supabase.error.ts +0 -3
  465. package/templates/be/skeleton-lite/src/modules/integrations/supabase/supabase.client.spec.ts +17 -5
  466. package/templates/be/skeleton-lite/src/modules/platform/database/database.module.ts +24 -13
  467. package/templates/be/skeleton-lite/src/modules/platform/database/database.port.ts +5 -0
  468. package/templates/be/skeleton-lite/src/modules/platform/database/errors/database.error.ts +16 -0
  469. package/templates/be/skeleton-lite/src/modules/platform/database/index.ts +3 -0
  470. package/templates/be/skeleton-lite/src/modules/platform/http-security/http-security.module.ts +5 -2
  471. package/templates/be/skeleton-lite/src/modules/platform/http-security/index.ts +4 -1
  472. package/templates/be/skeleton-lite/src/modules/platform/i18n/index.ts +1 -1
  473. package/templates/be/skeleton-lite/src/modules/platform/logging/logging.log-events.ts +7 -0
  474. package/templates/be/skeleton-lite/src/tests/fixtures/builders/api.builder.ts +29 -0
  475. package/templates/be/skeleton-lite/src/tests/fixtures/builders/cli.builder.ts +16 -0
  476. package/templates/be/table/api/feature.module-definition.ts.tpl +6 -0
  477. package/templates/be/table/api/feature.module.ts.tpl +2 -1
  478. package/templates/be/table/api/feature.options.ts.tpl +2 -0
  479. package/templates/be/table/api/graphql.module-definition.ts.tpl +6 -0
  480. package/templates/be/table/api/graphql.module.ts.tpl +3 -2
  481. package/templates/be/table/api/graphql.options.ts.tpl +2 -0
  482. package/templates/be/table/migration.sql.tpl +1 -0
  483. package/templates/be/upgrade-full/apps/cli/src/app.module.ts +4 -6
  484. package/templates/be/upgrade-full/apps/cli/src/cli.env.ts +7 -0
  485. package/templates/be/upgrade-full/apps/cli/src/compose/cli.ts +5 -0
  486. package/templates/be/upgrade-full/apps/cli/src/compose/platform.ts +9 -0
  487. package/templates/be/upgrade-full/apps/cli/src/main.ts +3 -0
  488. package/templates/be/upgrade-full/src/features/cli/cli.module.ts +3 -2
  489. package/templates/fe/auth/supabase-client.ts.tpl +34 -0
  490. package/templates/fe/skeleton/apps/__app__/src/app/auth/callback/route.ts +11 -0
  491. package/templates/fe/skeleton/apps/__app__/src/components/blocks/SignInForm/index.tsx +6 -1
  492. package/templates/fe/skeleton/apps/__app__/src/components/leaves/Icon/index.tsx +4 -0
  493. package/templates/fe/skeleton/apps/__app__/src/features/overlays/AppGuideOverlay/component.tsx +31 -0
  494. package/templates/fe/skeleton/apps/__app__/src/features/overlays/AppGuideOverlay/index.tsx +24 -0
  495. package/templates/fe/skeleton/apps/__app__/src/hooks/auth/useSession.ts +6 -1
  496. package/templates/fe/skeleton/apps/__app__/src/hooks/auth/useSignOut.ts +3 -4
  497. package/templates/fe/skeleton/apps/__app__/src/hooks/zustand/appGuide/index.ts +1 -0
  498. package/templates/fe/skeleton/apps/__app__/src/hooks/zustand/appGuide/store.ts +15 -0
  499. package/templates/fe/skeleton/apps/__app__/src/modules/auth/pkce-client.ts +18 -0
  500. package/templates/fe/skeleton/apps/__app__/src/modules/auth/server.ts +19 -0
  501. package/templates/fe/skeleton/apps/app/src/features/pages/AppHomePage/index.tsx +7 -1
  502. package/templates/fe/skeleton/apps/app/src/modules/i18n/messages/en.json +57 -0
  503. package/templates/fe/skeleton/apps/app/src/modules/i18n/messages/vi.json +6 -0
  504. package/templates/fe/skeleton/apps/landing/src/modules/i18n/messages/en.json +31 -0
  505. package/templates/fe/skeleton/packages/__project__-i18n/src/routing.ts +1 -1
  506. package/templates/fe/skeleton/packages/__project__-ui/src/index.ts +1 -0
  507. package/templates/fe/skeleton-lite/apps/__app__/src/modules/auth/client.ts +1 -34
  508. package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppHomePage/index.tsx +7 -1
  509. package/templates/fe/skeleton-lite/apps/web/src/modules/i18n/messages/en.json +57 -0
  510. package/templates/fe/skeleton-lite/apps/web/src/modules/i18n/messages/vi.json +30 -24
  511. package/templates/fe/skeleton-lite/apps/web/src/modules/i18n/routing.ts +1 -1
  512. package/templates/fe/transport/graphql/clients/clients/auth.ts +1 -1
  513. package/templates/fe/transport/graphql/clients/links/locale.ts +2 -2
  514. package/upgrade/check.mjs +3 -1
  515. package/upgrade/index.mjs +53 -40
@@ -1,12 +1,11 @@
1
1
  {{header}}
2
- # Builds the image of every app on the release tag, so a Dockerfile that no longer builds fails the release (or a manual dispatch) that carries it.
2
+ # Builds the image of every app on its release tag, so a Dockerfile that no longer builds fails that release.
3
3
  # It never pushes: publishing an image is the product's decision, not this file's.
4
4
  name: images
5
5
 
6
6
  on:
7
7
  push:
8
8
  tags: ["v*"]
9
- workflow_dispatch:
10
9
 
11
10
  permissions:
12
11
  contents: read
@@ -26,12 +25,25 @@ jobs:
26
25
  {{imageMatrix}}
27
26
  steps:
28
27
  - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
28
+ - name: release tag matches package version
29
+ run: node -e "const version=require('./package.json').version;if(process.env.GITHUB_REF_NAME!=='v'+version)process.exit(1)"
29
30
  - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
30
31
  - uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
31
32
  with:
32
33
  context: .
33
34
  file: ${{ matrix.file }}
34
35
  push: false
35
- tags: {{imageProject}}/${{ matrix.name }}:ci
36
+ tags: {{imageProject}}/${{ matrix.name }}:${{ github.ref_name }}
37
+ # OCI keeps the SBOM and provenance attestations without publishing to a registry.
38
+ outputs: type=oci,dest=${{ runner.temp }}/${{ matrix.name }}.oci.tar
39
+ sbom: true
40
+ provenance: mode=max
36
41
  cache-from: type=gha,scope=${{ matrix.name }}
37
42
  cache-to: type=gha,scope=${{ matrix.name }},mode=max
43
+ - name: retain image with SBOM and provenance
44
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
45
+ with:
46
+ name: image-${{ matrix.name }}-${{ github.sha }}-${{ github.run_attempt }}
47
+ path: ${{ runner.temp }}/${{ matrix.name }}.oci.tar
48
+ if-no-files-found: error
49
+ compression-level: 0
@@ -0,0 +1,148 @@
1
+ {{header}}
2
+ # Deploys the app's Docker Swarm stack. This file only assembles arguments: the logic lives in the verbs connect, build-args, deploy,
3
+ # rollback and disconnect of "starci app stack". It runs by hand only (Actions > deploy stack > Run workflow) from a release tag v*
4
+ # whose version is the package.json version; it has no push or schedule trigger.
5
+ # operation deploy builds and pushes one image per environments.<env>.deploy.images entry of .starcistacks/application-stacks.yaml,
6
+ # then deploys their immutable digests (render, provision, converge, verify, accept; a failure redeploys the previous release)
7
+ # operation rollback redeploys a stored release; "release" is 16 lowercase hex characters, empty means the previous accepted release
8
+ # The environment input names a protected GitHub environment (required reviewers) that holds:
9
+ # vars VPS_HOST, VPS_USER (the swarm manager); a variable named in deploy.passEnv, when the stack interpolates one
10
+ # secrets SOPS_AGE_KEY (the age identity of .sops.yaml), VPS_SSH_KEY (CI-only deploy key), VPS_KNOWN_HOSTS (pinned host keys)
11
+ # Nothing else is a secret: images are pushed with the workflow token. Dispatch inputs reach scripts only through env.
12
+ name: deploy stack
13
+
14
+ on:
15
+ workflow_dispatch:
16
+ inputs:
17
+ environment:
18
+ description: Protected environment holding the VPS variables and the sealed custody under .starcistacks
19
+ required: true
20
+ type: environment
21
+ operation:
22
+ description: Deploy a new release or roll back to a stored one
23
+ required: true
24
+ type: choice
25
+ default: deploy
26
+ options:
27
+ - deploy
28
+ - rollback
29
+ release:
30
+ description: "Rollback only: release id (16 lowercase hex) to deploy again; empty means the previous accepted release"
31
+ required: false
32
+ type: string
33
+ default: ""
34
+
35
+ permissions:
36
+ contents: read
37
+
38
+ concurrency:
39
+ group: stack-${{ inputs.environment }}
40
+ cancel-in-progress: false
41
+
42
+ jobs:
43
+ release:
44
+ if: ${{ inputs.operation == 'deploy' }}
45
+ runs-on: ubuntu-latest
46
+ environment: ${{ inputs.environment }}
47
+ timeout-minutes: 60
48
+ permissions:
49
+ contents: read
50
+ packages: write
51
+ env:
52
+ STACK_ENVIRONMENT: ${{ inputs.environment }}
53
+ XDG_DATA_HOME: ${{ runner.temp }}/starci-data
54
+ steps:{{stackGuard}}
55
+ - name: require release tag
56
+ shell: bash
57
+ run: '[[ "$GITHUB_REF" == refs/tags/v* ]] || exit 1'
58
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
59
+ - name: release tag matches package version
60
+ run: node -e "const version=require('./package.json').version;if(process.env.GITHUB_REF_NAME!=='v'+version)process.exit(1)"
61
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
62
+ with:
63
+ node-version: {{nodeMajor}}
64
+ cache: npm
65
+ - run: npm ci --ignore-scripts
66
+ - name: install SOPS
67
+ uses: mdgreenwald/mozilla-sops-action@bb2d96a13ef438ad122e5827a57ebd75d6ff118d # v2.1.0
68
+ with:
69
+ version: v3.13.2
70
+ - name: image repositories
71
+ id: names
72
+ shell: bash
73
+ run: |
74
+ owner="${GITHUB_REPOSITORY_OWNER,,}"{{stackNames}}
75
+ - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
76
+ - uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
77
+ with:
78
+ registry: ghcr.io
79
+ username: ${{ github.actor }}
80
+ password: ${{ github.token }}{{stackImageSteps}}
81
+ - name: connect to the swarm manager
82
+ env:
83
+ VPS_SSH_KEY: ${{ secrets.VPS_SSH_KEY }}
84
+ VPS_KNOWN_HOSTS: ${{ secrets.VPS_KNOWN_HOSTS }}
85
+ VPS_HOST: ${{ vars.VPS_HOST }}
86
+ VPS_USER: ${{ vars.VPS_USER }}
87
+ run: npx --no-install starci app stack connect --env "$STACK_ENVIRONMENT" --execute
88
+ - name: deploy the release
89
+ env:
90
+ SOPS_AGE_KEY: ${{ secrets.SOPS_AGE_KEY }}{{stackImageEnv}}{{stackPassEnv}}
91
+ run: |
92
+ npx --no-install starci app stack deploy --env "$STACK_ENVIRONMENT" \{{stackImageArgs}}
93
+ --source-sha "$GITHUB_SHA" --execute
94
+ - name: disconnect from the swarm manager
95
+ if: ${{ always() }}
96
+ run: npx --no-install starci app stack disconnect --env "$STACK_ENVIRONMENT" --execute
97
+
98
+ rollback:
99
+ if: ${{ inputs.operation == 'rollback' }}
100
+ runs-on: ubuntu-latest
101
+ environment: ${{ inputs.environment }}
102
+ timeout-minutes: 30
103
+ permissions:
104
+ contents: read
105
+ packages: read
106
+ env:
107
+ STACK_ENVIRONMENT: ${{ inputs.environment }}
108
+ XDG_DATA_HOME: ${{ runner.temp }}/starci-data
109
+ steps:
110
+ - name: require release tag
111
+ shell: bash
112
+ run: '[[ "$GITHUB_REF" == refs/tags/v* ]] || exit 1'
113
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
114
+ - name: release tag matches package version
115
+ run: node -e "const version=require('./package.json').version;if(process.env.GITHUB_REF_NAME!=='v'+version)process.exit(1)"
116
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
117
+ with:
118
+ node-version: {{nodeMajor}}
119
+ cache: npm
120
+ - run: npm ci --ignore-scripts
121
+ - name: install SOPS
122
+ uses: mdgreenwald/mozilla-sops-action@bb2d96a13ef438ad122e5827a57ebd75d6ff118d # v2.1.0
123
+ with:
124
+ version: v3.13.2
125
+ - uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
126
+ with:
127
+ registry: ghcr.io
128
+ username: ${{ github.actor }}
129
+ password: ${{ github.token }}
130
+ - name: connect to the swarm manager
131
+ env:
132
+ VPS_SSH_KEY: ${{ secrets.VPS_SSH_KEY }}
133
+ VPS_KNOWN_HOSTS: ${{ secrets.VPS_KNOWN_HOSTS }}
134
+ VPS_HOST: ${{ vars.VPS_HOST }}
135
+ VPS_USER: ${{ vars.VPS_USER }}
136
+ run: npx --no-install starci app stack connect --env "$STACK_ENVIRONMENT" --execute
137
+ - name: redeploy the stored release
138
+ env:
139
+ SOPS_AGE_KEY: ${{ secrets.SOPS_AGE_KEY }}
140
+ RELEASE: ${{ inputs.release }}
141
+ shell: bash
142
+ run: |
143
+ release=()
144
+ [ -z "$RELEASE" ] || release=(--release "$RELEASE")
145
+ npx --no-install starci app stack rollback --env "$STACK_ENVIRONMENT" "${release[@]}" --execute
146
+ - name: disconnect from the swarm manager
147
+ if: ${{ always() }}
148
+ run: npx --no-install starci app stack disconnect --env "$STACK_ENVIRONMENT" --execute
@@ -30,18 +30,22 @@ jobs:
30
30
  node-version: {{nodeMajor}}
31
31
  cache: npm
32
32
  - run: npm ci --ignore-scripts
33
+ - name: production dependency audit
34
+ run: npm audit --omit=dev --audit-level=high
33
35
  - name: lint
34
36
  if: env.SONAR_TOKEN == ''
35
- run: npm run lint
37
+ run: {{ciLint}}
36
38
  - name: lint with Sonar import
37
39
  if: env.SONAR_TOKEN != ''
38
- run: npm run lint -- --sonar reports/lint.sonar.json
40
+ run: {{ciLintSonar}}
39
41
  - name: format
40
42
  run: npm run format:check
41
43
  - name: typecheck
42
44
  run: npm run typecheck
43
45
  - name: unit
44
46
  run: npm test -- --ci
47
+ - name: coverage proof
48
+ run: {{ciCoverageProof}}
45
49
  - name: coverage upload
46
50
  uses: codecov/codecov-action@0fb7174895f61a3b6b78fc075e0cd60383518dac # v5.5.5
47
51
  if: ${{ !cancelled() && startsWith(github.ref, 'refs/tags/v') }}
@@ -55,7 +59,7 @@ jobs:
55
59
  - name: build fe
56
60
  run: npm run build:fe
57
61
  - name: database migration checks
58
- run: npm run db:lint
62
+ run: {{ciDatabaseLint}}
59
63
  {{> app/ci-workflows/sonar-steps.yml}}
60
64
 
61
65
  db-types:
@@ -5,27 +5,59 @@ on:
5
5
  workflow_dispatch:
6
6
  inputs:
7
7
  environment:
8
- description: GitHub environment whose Supabase secrets will be used
8
+ description: Protected environment with sealed Supabase custody under .starcistacks
9
9
  required: true
10
10
  type: environment
11
+ backup_receipt:
12
+ description: Tracked backup receipt path verified by the deployment owner before migration
13
+ required: true
14
+ type: string
11
15
 
12
16
  permissions:
13
17
  contents: read
14
18
 
19
+ concurrency:
20
+ group: database-${{ inputs.environment }}
21
+ cancel-in-progress: false
22
+
15
23
  jobs:
16
24
  deploy:
17
25
  runs-on: ubuntu-latest
18
26
  environment: ${{ inputs.environment }}
19
27
  env:
20
- SUPABASE_ACCESS_TOKEN: ${{ secrets.SUPABASE_ACCESS_TOKEN }}
21
- SUPABASE_DB_PASSWORD: ${{ secrets.SUPABASE_DB_PASSWORD }}
22
- SUPABASE_PROJECT_ID: ${{ secrets.SUPABASE_PROJECT_ID }}
28
+ STACK_ENVIRONMENT: ${{ inputs.environment }}
29
+ BACKUP_RECEIPT: ${{ inputs.backup_receipt }}
30
+ SOPS_AGE_KEY: ${{ secrets.SOPS_AGE_KEY }}
31
+ XDG_DATA_HOME: ${{ runner.temp }}/starci-data
23
32
  steps:
33
+ - name: require release tag
34
+ shell: bash
35
+ run: '[[ "$GITHUB_REF" == refs/tags/v* ]] || exit 1'
24
36
  - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
37
+ - name: release tag matches package version
38
+ run: node -e "const version=require('./package.json').version;if(process.env.GITHUB_REF_NAME!=='v'+version)process.exit(1)"
25
39
  - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
26
40
  with:
27
41
  node-version: {{nodeMajor}}
28
42
  cache: npm
29
43
  - run: npm ci --ignore-scripts
30
- - name: push migrations
31
- run: npm run db:push
44
+ - name: install SOPS
45
+ uses: mdgreenwald/mozilla-sops-action@bb2d96a13ef438ad122e5827a57ebd75d6ff118d # v2.1.0
46
+ with:
47
+ version: v3.13.2
48
+ - name: materialize sealed custody and push migrations
49
+ shell: bash
50
+ run: |
51
+ set -euo pipefail
52
+ [[ "$STACK_ENVIRONMENT" =~ ^[a-z][a-z0-9-]*$ ]]
53
+ git ls-files --error-unmatch -- "$BACKUP_RECEIPT" > /dev/null
54
+ test -s "$BACKUP_RECEIPT"
55
+ secret_dir="$XDG_DATA_HOME/StarCi/secrets/{{project}}/$STACK_ENVIRONMENT"
56
+ trap 'rm -rf -- "$secret_dir"' EXIT
57
+ npx --no-install starci app secret materialize "$STACK_ENVIRONMENT"
58
+ export SUPABASE_ACCESS_TOKEN="$(cat "$secret_dir/SUPABASE_ACCESS_TOKEN")"
59
+ export SUPABASE_DB_PASSWORD="$(cat "$secret_dir/SUPABASE_DB_PASSWORD")"
60
+ project_id="$(cat "$secret_dir/SUPABASE_PROJECT_ID")"
61
+ npx --no-install supabase link --project-ref "$project_id"
62
+ npm run db:push -- --dry-run
63
+ npm run db:push
@@ -6,7 +6,6 @@ name: images
6
6
  on:
7
7
  push:
8
8
  tags: ["v*"]
9
- workflow_dispatch:
10
9
 
11
10
  permissions:
12
11
  contents: read
@@ -26,12 +25,25 @@ jobs:
26
25
  {{imageMatrix}}
27
26
  steps:
28
27
  - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
28
+ - name: release tag matches package version
29
+ run: node -e "const version=require('./package.json').version;if(process.env.GITHUB_REF_NAME!=='v'+version)process.exit(1)"
29
30
  - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
30
31
  - uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
31
32
  with:
32
33
  context: .
33
34
  file: ${{ matrix.file }}
34
35
  push: false
35
- tags: {{imageProject}}/${{ matrix.name }}:ci
36
+ tags: {{imageProject}}/${{ matrix.name }}:${{ github.ref_name }}
37
+ # OCI keeps the SBOM and provenance attestations without publishing to a registry.
38
+ outputs: type=oci,dest=${{ runner.temp }}/${{ matrix.name }}.oci.tar
39
+ sbom: true
40
+ provenance: mode=max
36
41
  cache-from: type=gha,scope=${{ matrix.name }}
37
42
  cache-to: type=gha,scope=${{ matrix.name }},mode=max
43
+ - name: retain image with SBOM and provenance
44
+ uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2
45
+ with:
46
+ name: image-${{ matrix.name }}-${{ github.sha }}-${{ github.run_attempt }}
47
+ path: ${{ runner.temp }}/${{ matrix.name }}.oci.tar
48
+ if-no-files-found: error
49
+ compression-level: 0
@@ -0,0 +1,148 @@
1
+ {{header}}
2
+ # Deploys the app's Docker Swarm stack. This file only assembles arguments: the logic lives in the verbs connect, build-args, deploy,
3
+ # rollback and disconnect of "starci app stack". It runs by hand only (Actions > deploy stack > Run workflow) from a release tag v*
4
+ # whose version is the package.json version; it has no push or schedule trigger.
5
+ # operation deploy builds and pushes one image per environments.<env>.deploy.images entry of .starcistacks/application-stacks.yaml,
6
+ # then deploys their immutable digests (render, provision, converge, verify, accept; a failure redeploys the previous release)
7
+ # operation rollback redeploys a stored release; "release" is 16 lowercase hex characters, empty means the previous accepted release
8
+ # The environment input names a protected GitHub environment (required reviewers) that holds:
9
+ # vars VPS_HOST, VPS_USER (the swarm manager); a variable named in deploy.passEnv, when the stack interpolates one
10
+ # secrets SOPS_AGE_KEY (the age identity of .sops.yaml), VPS_SSH_KEY (CI-only deploy key), VPS_KNOWN_HOSTS (pinned host keys)
11
+ # Nothing else is a secret: images are pushed with the workflow token. Dispatch inputs reach scripts only through env.
12
+ name: deploy stack
13
+
14
+ on:
15
+ workflow_dispatch:
16
+ inputs:
17
+ environment:
18
+ description: Protected environment holding the VPS variables and the sealed custody under .starcistacks
19
+ required: true
20
+ type: environment
21
+ operation:
22
+ description: Deploy a new release or roll back to a stored one
23
+ required: true
24
+ type: choice
25
+ default: deploy
26
+ options:
27
+ - deploy
28
+ - rollback
29
+ release:
30
+ description: "Rollback only: release id (16 lowercase hex) to deploy again; empty means the previous accepted release"
31
+ required: false
32
+ type: string
33
+ default: ""
34
+
35
+ permissions:
36
+ contents: read
37
+
38
+ concurrency:
39
+ group: stack-${{ inputs.environment }}
40
+ cancel-in-progress: false
41
+
42
+ jobs:
43
+ release:
44
+ if: ${{ inputs.operation == 'deploy' }}
45
+ runs-on: ubuntu-latest
46
+ environment: ${{ inputs.environment }}
47
+ timeout-minutes: 60
48
+ permissions:
49
+ contents: read
50
+ packages: write
51
+ env:
52
+ STACK_ENVIRONMENT: ${{ inputs.environment }}
53
+ XDG_DATA_HOME: ${{ runner.temp }}/starci-data
54
+ steps:{{stackGuard}}
55
+ - name: require release tag
56
+ shell: bash
57
+ run: '[[ "$GITHUB_REF" == refs/tags/v* ]] || exit 1'
58
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
59
+ - name: release tag matches package version
60
+ run: node -e "const version=require('./package.json').version;if(process.env.GITHUB_REF_NAME!=='v'+version)process.exit(1)"
61
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
62
+ with:
63
+ node-version: {{nodeMajor}}
64
+ cache: npm
65
+ - run: npm ci --ignore-scripts
66
+ - name: install SOPS
67
+ uses: mdgreenwald/mozilla-sops-action@bb2d96a13ef438ad122e5827a57ebd75d6ff118d # v2.1.0
68
+ with:
69
+ version: v3.13.2
70
+ - name: image repositories
71
+ id: names
72
+ shell: bash
73
+ run: |
74
+ owner="${GITHUB_REPOSITORY_OWNER,,}"{{stackNames}}
75
+ - uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3.12.0
76
+ - uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
77
+ with:
78
+ registry: ghcr.io
79
+ username: ${{ github.actor }}
80
+ password: ${{ github.token }}{{stackImageSteps}}
81
+ - name: connect to the swarm manager
82
+ env:
83
+ VPS_SSH_KEY: ${{ secrets.VPS_SSH_KEY }}
84
+ VPS_KNOWN_HOSTS: ${{ secrets.VPS_KNOWN_HOSTS }}
85
+ VPS_HOST: ${{ vars.VPS_HOST }}
86
+ VPS_USER: ${{ vars.VPS_USER }}
87
+ run: npx --no-install starci app stack connect --env "$STACK_ENVIRONMENT" --execute
88
+ - name: deploy the release
89
+ env:
90
+ SOPS_AGE_KEY: ${{ secrets.SOPS_AGE_KEY }}{{stackImageEnv}}{{stackPassEnv}}
91
+ run: |
92
+ npx --no-install starci app stack deploy --env "$STACK_ENVIRONMENT" \{{stackImageArgs}}
93
+ --source-sha "$GITHUB_SHA" --execute
94
+ - name: disconnect from the swarm manager
95
+ if: ${{ always() }}
96
+ run: npx --no-install starci app stack disconnect --env "$STACK_ENVIRONMENT" --execute
97
+
98
+ rollback:
99
+ if: ${{ inputs.operation == 'rollback' }}
100
+ runs-on: ubuntu-latest
101
+ environment: ${{ inputs.environment }}
102
+ timeout-minutes: 30
103
+ permissions:
104
+ contents: read
105
+ packages: read
106
+ env:
107
+ STACK_ENVIRONMENT: ${{ inputs.environment }}
108
+ XDG_DATA_HOME: ${{ runner.temp }}/starci-data
109
+ steps:
110
+ - name: require release tag
111
+ shell: bash
112
+ run: '[[ "$GITHUB_REF" == refs/tags/v* ]] || exit 1'
113
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4.4.0
114
+ - name: release tag matches package version
115
+ run: node -e "const version=require('./package.json').version;if(process.env.GITHUB_REF_NAME!=='v'+version)process.exit(1)"
116
+ - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
117
+ with:
118
+ node-version: {{nodeMajor}}
119
+ cache: npm
120
+ - run: npm ci --ignore-scripts
121
+ - name: install SOPS
122
+ uses: mdgreenwald/mozilla-sops-action@bb2d96a13ef438ad122e5827a57ebd75d6ff118d # v2.1.0
123
+ with:
124
+ version: v3.13.2
125
+ - uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
126
+ with:
127
+ registry: ghcr.io
128
+ username: ${{ github.actor }}
129
+ password: ${{ github.token }}
130
+ - name: connect to the swarm manager
131
+ env:
132
+ VPS_SSH_KEY: ${{ secrets.VPS_SSH_KEY }}
133
+ VPS_KNOWN_HOSTS: ${{ secrets.VPS_KNOWN_HOSTS }}
134
+ VPS_HOST: ${{ vars.VPS_HOST }}
135
+ VPS_USER: ${{ vars.VPS_USER }}
136
+ run: npx --no-install starci app stack connect --env "$STACK_ENVIRONMENT" --execute
137
+ - name: redeploy the stored release
138
+ env:
139
+ SOPS_AGE_KEY: ${{ secrets.SOPS_AGE_KEY }}
140
+ RELEASE: ${{ inputs.release }}
141
+ shell: bash
142
+ run: |
143
+ release=()
144
+ [ -z "$RELEASE" ] || release=(--release "$RELEASE")
145
+ npx --no-install starci app stack rollback --env "$STACK_ENVIRONMENT" "${release[@]}" --execute
146
+ - name: disconnect from the swarm manager
147
+ if: ${{ always() }}
148
+ run: npx --no-install starci app stack disconnect --env "$STACK_ENVIRONMENT" --execute
@@ -8,12 +8,12 @@ const posix = (file) => file.split(path.sep).join("/")
8
8
  const schemas = (fs.existsSync(CONTRACTS) ? fs.readdirSync(CONTRACTS) : [])
9
9
  .map((app) => path.join(CONTRACTS, app, "schema.graphql"))
10
10
  .filter((file) => fs.existsSync(file))
11
- .sort()
11
+ .sort(byCodeUnit)
12
12
  .map(posix)
13
13
  const operationRoots = (fs.existsSync(FE_APPS) ? fs.readdirSync(FE_APPS) : [])
14
14
  .map((app) => path.join(FE_APPS, app, "src", "modules", "api", "graphql"))
15
15
  .filter((dir) => fs.existsSync(dir))
16
- .sort()
16
+ .sort(byCodeUnit)
17
17
  .map(posix)
18
18
  if (schemas.length === 0 || operationRoots.length === 0) {
19
19
  process.stdout.write("codegen: no GraphQL contract under be/contracts yet\n")
@@ -31,4 +31,15 @@ if (schemas.length === 0 || operationRoots.length === 0) {
31
31
  ]),
32
32
  )
33
33
  await generate({ schema: schemas, generates, ignoreNoDocuments: true, silent: true }, true)
34
+ // Stamp only a successful generation, using the same sorted paths and LF-normalized schemas as R52.
35
+ const hash = createHash("sha256")
36
+ for (const schema of schemas) {
37
+ const source = fs.readFileSync(schema, "utf8").replaceAll("\r\n", "\n")
38
+ hash.update(`${schema}\0${source}\0`)
39
+ }
40
+ const digest = hash.digest("hex")
41
+ for (const root of operationRoots) {
42
+ const generated = `${root}/__generated__`
43
+ if (fs.existsSync(generated)) fs.writeFileSync(`${generated}/.schema-sha256`, `${digest}\n`)
44
+ }
34
45
  }
@@ -7,6 +7,11 @@ import { createHash } from "node:crypto"
7
7
  import fs from "node:fs"
8
8
  import path from "node:path"
9
9
 
10
+ const byCodeUnit = (left, right) => {
11
+ if (left === right) return 0
12
+ return left < right ? -1 : 1
13
+ }
14
+
10
15
  const MIGRATIONS = path.join("supabase", "migrations")
11
16
  const TYPES = path.join("supabase", "types", "database.types.ts")
12
17
  const STAMP = /^\/\/ migrations-sha256: ([0-9a-f]{64})$/
@@ -20,7 +25,7 @@ if (!process.argv.includes("--graphql")) {
20
25
  const hash = createHash("sha256")
21
26
  for (const name of (fs.existsSync(MIGRATIONS) ? fs.readdirSync(MIGRATIONS) : [])
22
27
  .filter((file) => file.endsWith(".sql"))
23
- .sort()) {
28
+ .sort(byCodeUnit)) {
24
29
  hash.update(`${name}\0${fs.readFileSync(path.join(MIGRATIONS, name), "utf8").replace(/\r\n/g, "\n")}\0`)
25
30
  }
26
31
  const digest = hash.digest("hex")
@@ -0,0 +1,8 @@
1
+ import fs from "node:fs"
2
+ import path from "node:path"
3
+ import { createHash } from "node:crypto"
4
+
5
+ const byCodeUnit = (left, right) => {
6
+ if (left === right) return 0
7
+ return left < right ? -1 : 1
8
+ }
@@ -31,3 +31,6 @@ next-env.d.ts
31
31
  .starcistacks/*/infra/terraform/files/
32
32
  .starcistacks/*/infra/terraform/*.tar.gz
33
33
  !.starcistacks/**/*.enc
34
+
35
+ # Host-local agent credentials and app age identity never enter Git.
36
+ .claude/
@@ -34,3 +34,6 @@ next-env.d.ts
34
34
  .starcistacks/*/infra/terraform/files/
35
35
  .starcistacks/*/infra/terraform/*.tar.gz
36
36
  !.starcistacks/**/*.enc
37
+
38
+ # Host-local agent credentials and app age identity never enter Git.
39
+ .claude/
@@ -10,6 +10,7 @@
10
10
  "test:e2e": "npm run typecheck:tests && cd be && jest --selectProjects e2e",
11
11
  "test:contract": "npm run typecheck:tests && cd be && jest --selectProjects contract",
12
12
  "test:stack": "starci app stack",
13
+ {{supabaseScripts}}
13
14
  "contract:emit": "starci app emit"
14
15
  }
15
16
  }
@@ -0,0 +1,7 @@
1
+ "db:start": "supabase start",
2
+ "db:stop": "supabase stop",
3
+ "db:reset": "supabase db reset",
4
+ "db:new": "supabase migration new",
5
+ "db:push": "supabase db push",
6
+ "db:types": "npm run contract:emit",
7
+ "db:lint": "{{appBinary}} check --fast",
@@ -7,13 +7,7 @@
7
7
  "test": "cd be && jest --selectProjects unit --coverage",
8
8
  "test:affected": "cd be && jest --selectProjects unit --passWithNoTests",
9
9
  "test:integration": "npm run typecheck:tests && cd be && jest --selectProjects integration",
10
- "db:start": "supabase start",
11
- "db:stop": "supabase stop",
12
- "db:reset": "supabase db reset",
13
- "db:new": "supabase migration new",
14
- "db:push": "supabase db push",
15
- "db:types": "npm run contract:emit",
16
- "db:lint": "{{appBinary}} check --fast",
10
+ {{> app/package-scripts/supabase.json}}
17
11
  "contract:emit": "{{appBinary}} emit"
18
12
  }
19
13
  }
@@ -1,3 +1,4 @@
1
+ {{header}}
1
2
  root = true
2
3
 
3
4
  [*]
@@ -1,2 +1,8 @@
1
- * text=auto
1
+ {{header}}
2
+ * text=auto eol=lf
2
3
  *.enc binary
4
+ # Scripts and the deploy data are mounted into Linux containers: CRLF there fails (set: Illegal option -).
5
+ *.sh text eol=lf
6
+ *.mjs text eol=lf
7
+ .starcistacks/** text eol=lf
8
+ .starcistacks/**/*.enc binary
@@ -0,0 +1,17 @@
1
+ {{header}}
2
+ version: 2
3
+ updates:
4
+ - package-ecosystem: npm
5
+ directory: /
6
+ schedule:
7
+ interval: weekly
8
+ - package-ecosystem: github-actions
9
+ directory: /
10
+ schedule:
11
+ interval: weekly
12
+ - package-ecosystem: docker
13
+ directories:
14
+ - /be/apps/*
15
+ - /fe/apps/*
16
+ schedule:
17
+ interval: weekly
@@ -1 +1 @@
1
- 22
1
+ {{nodeMajor}}