@starci/hfs 4.0.8 → 4.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (703) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/LICENSE +21 -0
  3. package/README.md +81 -39
  4. package/emit/contracts.mjs +56 -9
  5. package/emit/db-types.mjs +169 -0
  6. package/emit/events.mjs +41 -0
  7. package/emit/operations-worker.mjs +1 -1
  8. package/emit/operations.mjs +2 -2
  9. package/emit/schema-worker.mjs +1 -1
  10. package/lint/bound-sys.cjs +50 -0
  11. package/lint/run.mjs +131 -24
  12. package/package.json +16 -10
  13. package/report/sonar.mjs +8 -8
  14. package/runtime/engine/admission.mjs +308 -0
  15. package/runtime/engine/canonical-json.mjs +10 -0
  16. package/runtime/engine/config.mjs +486 -0
  17. package/runtime/engine/db/blob.mjs +315 -0
  18. package/runtime/engine/db/ledger-paths.mjs +83 -0
  19. package/runtime/engine/db/ledger.mjs +1118 -0
  20. package/runtime/engine/db/machine-connection.mjs +135 -0
  21. package/runtime/engine/db/machine-schema.mjs +84 -0
  22. package/runtime/engine/db/machine.mjs +1367 -0
  23. package/runtime/engine/db/migrations/machine/0001-init.sql +924 -0
  24. package/runtime/engine/db/migrations/runtime/0001-init.sql +1108 -0
  25. package/runtime/engine/db/provider-reservations.mjs +101 -0
  26. package/runtime/engine/digest.mjs +16 -0
  27. package/runtime/engine/invalid-config.mjs +15 -0
  28. package/runtime/engine/orca-config.mjs +27 -0
  29. package/runtime/engine/refuse.mjs +11 -0
  30. package/runtime/engine/secrets.mjs +130 -0
  31. package/runtime/knowledge/hfs/canon-pins.yaml +162 -31
  32. package/runtime/knowledge/hfs/peer-integrations.yaml +2 -2
  33. package/runtime/knowledge/hfs/rules.yaml +2059 -0
  34. package/runtime/knowledge/hfs/slots.yaml +912 -120
  35. package/runtime/knowledge/patterns/be/api.yaml +369 -0
  36. package/runtime/knowledge/patterns/be/cli.yaml +297 -0
  37. package/runtime/knowledge/patterns/be/domain.yaml +113 -0
  38. package/runtime/knowledge/patterns/be/event-bus.yaml +285 -0
  39. package/runtime/knowledge/patterns/be/jobs.yaml +261 -0
  40. package/runtime/knowledge/patterns/be/projections.yaml +178 -0
  41. package/runtime/knowledge/patterns/be/queues.yaml +236 -0
  42. package/runtime/knowledge/patterns/be/reactors.yaml +140 -0
  43. package/runtime/knowledge/patterns/be/realtime.yaml +222 -0
  44. package/runtime/knowledge/patterns/be/saga.yaml +248 -0
  45. package/runtime/knowledge/patterns/be/webhooks.yaml +221 -0
  46. package/runtime/knowledge/patterns/fe/folder.yaml +131 -25
  47. package/runtime/knowledge/sonar-gate.yaml +52 -18
  48. package/runtime/modules/kernel/failure-codes.yaml +611 -51
  49. package/runtime/modules/models/registry.yaml +553 -0
  50. package/runtime/modules/models/runtimes.yaml +695 -0
  51. package/runtime/modules/ops/_labels.yaml +53 -0
  52. package/runtime/scripts/api/fs/forbidden-root.mjs +51 -0
  53. package/runtime/scripts/api/fs/is-link-like.mjs +25 -0
  54. package/runtime/scripts/api/fs/lib.mjs +16 -2
  55. package/runtime/scripts/api/fs/safe-remove.mjs +12 -132
  56. package/runtime/scripts/api/git/config-get.mjs +10 -0
  57. package/runtime/scripts/api/git/diff.mjs +5 -0
  58. package/runtime/scripts/api/git/lib.mjs +18 -26
  59. package/runtime/scripts/api/git/log.mjs +5 -0
  60. package/runtime/scripts/api/git/ls-files.mjs +6 -0
  61. package/runtime/scripts/api/git/ls-tree.mjs +5 -0
  62. package/runtime/scripts/api/git/merge-base.mjs +9 -0
  63. package/runtime/scripts/api/git/remote.mjs +5 -0
  64. package/runtime/scripts/api/git/rev-parse-query.mjs +5 -0
  65. package/runtime/scripts/api/git/show.mjs +6 -0
  66. package/runtime/scripts/api/node/lib.mjs +14 -0
  67. package/runtime/scripts/api/node/spawn-node.mjs +6 -0
  68. package/runtime/scripts/api/process/lib.mjs +111 -0
  69. package/runtime/scripts/api/process/owned-process.mjs +78 -0
  70. package/runtime/scripts/api/process/resolve-real-tool.mjs +46 -0
  71. package/runtime/scripts/api/process/run-program.mjs +7 -0
  72. package/runtime/scripts/api/process/stop-owned-process.mjs +9 -0
  73. package/runtime/scripts/api/sops/decrypt.mjs +9 -12
  74. package/runtime/scripts/api/sops/lib.mjs +255 -0
  75. package/runtime/scripts/api/sops/seal.mjs +22 -0
  76. package/runtime/scripts/connectors/lib.mjs +488 -0
  77. package/runtime/scripts/hfs/architecture/ast-walks.mjs +220 -0
  78. package/runtime/scripts/hfs/architecture/backend.mjs +16 -23
  79. package/runtime/scripts/hfs/architecture/background-unowned.mjs +16 -34
  80. package/runtime/scripts/hfs/architecture/client-reaches-server.mjs +3 -1
  81. package/runtime/scripts/hfs/architecture/clones.mjs +4 -4
  82. package/runtime/scripts/hfs/architecture/config.mjs +9 -6
  83. package/runtime/scripts/hfs/architecture/connection-map.mjs +20 -8
  84. package/runtime/scripts/hfs/architecture/context-coupling.mjs +88 -0
  85. package/runtime/scripts/hfs/architecture/context-map.mjs +237 -0
  86. package/runtime/scripts/hfs/architecture/context-owner.mjs +82 -0
  87. package/runtime/scripts/hfs/architecture/context-platform-tables.mjs +47 -0
  88. package/runtime/scripts/hfs/architecture/context-transaction.mjs +60 -0
  89. package/runtime/scripts/hfs/architecture/contract-fixture-guard.mjs +4 -10
  90. package/runtime/scripts/hfs/architecture/contracts.mjs +33 -162
  91. package/runtime/scripts/hfs/architecture/dead-exports.mjs +58 -29
  92. package/runtime/scripts/hfs/architecture/doc-language.mjs +1 -1
  93. package/runtime/scripts/hfs/architecture/entrypoint.mjs +2 -1
  94. package/runtime/scripts/hfs/architecture/fe-slot-allows.mjs +2 -2
  95. package/runtime/scripts/hfs/architecture/feature-shape.mjs +5 -2
  96. package/runtime/scripts/hfs/architecture/framework-pinned.mjs +1 -1
  97. package/runtime/scripts/hfs/architecture/frontend.mjs +17 -43
  98. package/runtime/scripts/hfs/architecture/hfs.mjs +24 -39
  99. package/runtime/scripts/hfs/architecture/i18n-keys.mjs +1 -1
  100. package/runtime/scripts/hfs/architecture/index.mjs +17 -4
  101. package/runtime/scripts/hfs/architecture/machine-ast.mjs +44 -11
  102. package/runtime/scripts/hfs/architecture/managed-scripts.mjs +27 -0
  103. package/runtime/scripts/hfs/architecture/module-per-transport.mjs +30 -6
  104. package/runtime/scripts/hfs/architecture/next-data.mjs +22 -63
  105. package/runtime/scripts/hfs/architecture/owners.mjs +35 -15
  106. package/runtime/scripts/hfs/architecture/register-once.mjs +2 -1
  107. package/runtime/scripts/hfs/architecture/registration.mjs +23 -81
  108. package/runtime/scripts/hfs/architecture/required-files.mjs +20 -12
  109. package/runtime/scripts/hfs/architecture/schema-owner.mjs +17 -114
  110. package/runtime/scripts/hfs/architecture/server-action.mjs +24 -0
  111. package/runtime/scripts/hfs/architecture/side-boundary.mjs +16 -0
  112. package/runtime/scripts/hfs/architecture/source-names.mjs +27 -147
  113. package/runtime/scripts/hfs/architecture/sql-owner.mjs +59 -18
  114. package/runtime/scripts/hfs/architecture/sql-returning.mjs +64 -0
  115. package/runtime/scripts/hfs/architecture/supabase-ast.mjs +111 -0
  116. package/runtime/scripts/hfs/architecture/supabase-be.mjs +131 -0
  117. package/runtime/scripts/hfs/architecture/supabase-tables.mjs +42 -0
  118. package/runtime/scripts/hfs/architecture/supabase.mjs +434 -0
  119. package/runtime/scripts/hfs/architecture/surface.mjs +9 -3
  120. package/runtime/scripts/hfs/architecture/test-world-files.mjs +9 -19
  121. package/runtime/scripts/hfs/architecture/tiers.mjs +47 -5
  122. package/runtime/scripts/hfs/architecture/transport-owner.mjs +3 -3
  123. package/runtime/scripts/hfs/architecture/typescript.mjs +12 -26
  124. package/runtime/scripts/hfs/architecture.mjs +4 -4
  125. package/runtime/scripts/hfs/check.mjs +75 -72
  126. package/runtime/scripts/hfs/coverage-scope.mjs +162 -0
  127. package/runtime/scripts/hfs/declaration-shape.mjs +62 -0
  128. package/runtime/scripts/hfs/declaration-slots.mjs +75 -0
  129. package/runtime/scripts/hfs/edition-slots.mjs +66 -0
  130. package/runtime/scripts/hfs/manifest-shape.mjs +109 -32
  131. package/runtime/scripts/hfs/param-names.mjs +18 -0
  132. package/runtime/scripts/hfs/path-findings.mjs +1 -1
  133. package/runtime/scripts/hfs/repo-identity.mjs +9 -6
  134. package/runtime/scripts/hfs/rule-params-shape.mjs +50 -0
  135. package/runtime/scripts/hfs/rules/app-root.mjs +51 -0
  136. package/runtime/scripts/hfs/rules/cli.mjs +37 -0
  137. package/runtime/scripts/hfs/rules/contract-compat.mjs +71 -0
  138. package/runtime/scripts/hfs/rules/contract.mjs +10 -9
  139. package/runtime/scripts/hfs/rules/database-config.mjs +102 -0
  140. package/runtime/scripts/hfs/rules/database-constants.mjs +13 -0
  141. package/runtime/scripts/hfs/rules/database-migrations.mjs +111 -0
  142. package/runtime/scripts/hfs/rules/database-plpgsql.mjs +233 -0
  143. package/runtime/scripts/hfs/rules/database-sql.mjs +336 -0
  144. package/runtime/scripts/hfs/rules/database.mjs +68 -0
  145. package/runtime/scripts/hfs/rules/deps.mjs +1 -1
  146. package/runtime/scripts/hfs/rules/docker.mjs +259 -0
  147. package/runtime/scripts/hfs/rules/edition.mjs +111 -0
  148. package/runtime/scripts/hfs/rules/event-bus.mjs +153 -0
  149. package/runtime/scripts/hfs/rules/fe-contract-documents.mjs +1 -1
  150. package/runtime/scripts/hfs/rules/fe-no-tests.mjs +6 -5
  151. package/runtime/scripts/hfs/rules/frontend-tree.mjs +9 -9
  152. package/runtime/scripts/hfs/rules/integration-specs.mjs +3 -6
  153. package/runtime/scripts/hfs/rules/kinds.mjs +84 -0
  154. package/runtime/scripts/hfs/rules/lint-suppression.mjs +1 -1
  155. package/runtime/scripts/hfs/rules/monorepo.mjs +179 -0
  156. package/runtime/scripts/hfs/rules/peer-integrations.mjs +3 -3
  157. package/runtime/scripts/hfs/rules/pipeline.mjs +11 -21
  158. package/runtime/scripts/hfs/rules/proof-commands.mjs +2 -2
  159. package/runtime/scripts/hfs/rules/read.mjs +1 -1
  160. package/runtime/scripts/hfs/rules/repo-local-checks.mjs +2 -2
  161. package/runtime/scripts/hfs/rules/saga.mjs +170 -0
  162. package/runtime/scripts/hfs/rules/secrets.mjs +3 -3
  163. package/runtime/scripts/hfs/rules/services.mjs +220 -0
  164. package/runtime/scripts/hfs/rules/spec-placement.mjs +1 -1
  165. package/runtime/scripts/hfs/rules/stacks.mjs +3 -3
  166. package/runtime/scripts/hfs/rules/supabase-secrets.mjs +89 -0
  167. package/runtime/scripts/hfs/rules/test-topology.mjs +2 -2
  168. package/runtime/scripts/hfs/secret.mjs +209 -0
  169. package/runtime/scripts/hfs/slots.mjs +78 -108
  170. package/runtime/scripts/hfs/sql/pg-parse.mjs +46 -0
  171. package/runtime/scripts/hfs/test-world-slot.mjs +6 -0
  172. package/runtime/scripts/hfs/tree.mjs +5 -4
  173. package/runtime/scripts/hfs/typescript-programs.mjs +0 -5
  174. package/runtime/scripts/hfs/view.mjs +3 -2
  175. package/runtime/scripts/lib/clip.mjs +19 -0
  176. package/runtime/scripts/lib/display-names.mjs +259 -0
  177. package/runtime/scripts/lib/dockerfile.mjs +124 -0
  178. package/runtime/scripts/lib/env.mjs +10 -0
  179. package/runtime/scripts/lib/event-contract.mjs +103 -0
  180. package/runtime/scripts/lib/example-refs.mjs +158 -0
  181. package/runtime/scripts/lib/fs-kind.mjs +14 -4
  182. package/runtime/scripts/lib/git.mjs +36 -0
  183. package/runtime/scripts/lib/graphql-contract.mjs +1 -1
  184. package/runtime/scripts/lib/i18n.mjs +86 -0
  185. package/runtime/scripts/lib/json-schema.mjs +52 -0
  186. package/runtime/scripts/lib/json.mjs +13 -3
  187. package/runtime/scripts/lib/language.mjs +24 -5
  188. package/runtime/scripts/lib/list.mjs +20 -0
  189. package/runtime/scripts/lib/mutation-fence.mjs +15 -0
  190. package/runtime/scripts/lib/package-at.mjs +37 -0
  191. package/runtime/scripts/lib/path-key.mjs +57 -2
  192. package/runtime/scripts/lib/process-identity.mjs +6 -0
  193. package/runtime/scripts/lib/read-text.mjs +34 -0
  194. package/runtime/scripts/lib/read-yaml.mjs +18 -0
  195. package/runtime/scripts/lib/redact.mjs +161 -0
  196. package/runtime/scripts/lib/regex.mjs +4 -0
  197. package/runtime/scripts/lib/same-text.mjs +5 -0
  198. package/runtime/scripts/lib/secret-patterns.mjs +4 -3
  199. package/runtime/scripts/lib/sleep-sync.mjs +2 -1
  200. package/runtime/scripts/lib/sleep.mjs +7 -0
  201. package/runtime/scripts/lib/sops-envelope.mjs +112 -0
  202. package/runtime/scripts/lib/source-phrases.mjs +34 -0
  203. package/runtime/scripts/lib/sqlite.mjs +21 -0
  204. package/runtime/scripts/lib/stack-services.mjs +7 -31
  205. package/runtime/scripts/lib/ts-ast.mjs +35 -0
  206. package/runtime/scripts/lib/walk.mjs +4 -3
  207. package/scaffold/add-app.mjs +174 -0
  208. package/scaffold/add-cli-lite.mjs +257 -0
  209. package/scaffold/add-inbox-lite.mjs +314 -0
  210. package/scaffold/add-table.mjs +344 -0
  211. package/scaffold/add.mjs +299 -0
  212. package/scaffold/app.mjs +358 -69
  213. package/scaffold/edition-gate.mjs +25 -0
  214. package/scaffold/image.mjs +19 -0
  215. package/scaffold/lite-exports.mjs +186 -0
  216. package/scaffold/service.mjs +32 -26
  217. package/scaffold/supabase-ports.mjs +26 -0
  218. package/src/main.mjs +327 -0
  219. package/sync/cli.mjs +6 -9
  220. package/sync/format.mjs +1 -1
  221. package/sync/hygiene.mjs +10 -10
  222. package/sync/index.mjs +167 -104
  223. package/sync/managed.mjs +19 -11
  224. package/sync/sonar-key.mjs +5 -0
  225. package/templates/app/ci-workflows/github/workflows/ci.yml +14 -14
  226. package/templates/app/ci-workflows/github/workflows/images.yml +37 -0
  227. package/templates/app/ci-workflows/sonar-steps.yml +9 -0
  228. package/templates/app/ci-workflows-lite/github/workflows/ci.yml +66 -0
  229. package/templates/app/ci-workflows-lite/github/workflows/db-deploy.yml +31 -0
  230. package/templates/app/ci-workflows-lite/github/workflows/images.yml +37 -0
  231. package/templates/app/codegen-lite/scripts/codegen.mjs +32 -0
  232. package/templates/app/docker-ignore/dockerignore +50 -0
  233. package/templates/app/gitignore-lite +35 -0
  234. package/templates/app/hooks/husky/pre-commit +3 -8
  235. package/templates/app/hooks/husky/pre-push +45 -6
  236. package/templates/app/package-scripts/core.json +8 -0
  237. package/templates/app/package-scripts/package.json +3 -10
  238. package/templates/app/package-scripts-lite/package.json +15 -0
  239. package/templates/app/quality-config/codecov.yml +15 -3
  240. package/templates/app/quality-config/sonar-base.properties +4 -0
  241. package/templates/app/quality-config/sonar-project.properties +1 -4
  242. package/templates/app/quality-config-lite/sonar-project.properties +5 -0
  243. package/templates/app/skeleton/.starcistacks/dev/seeds/primary-notes.sql +5 -0
  244. package/templates/app/skeleton/.starciwork/features/system-health/index.yaml +4 -0
  245. package/templates/app/skeleton/.starciwork/{features/index.yaml → index.yaml} +2 -2
  246. package/templates/app/skeleton/README.md +7 -5
  247. package/templates/app/skeleton-lite/.sops.yaml +3 -0
  248. package/templates/app/skeleton-lite/.starcistacks/dev/environment.json +5 -0
  249. package/templates/app/skeleton-lite/.starcistacks/dev/secrets/.gitkeep +1 -0
  250. package/templates/app/skeleton-lite/.starciwork/shell/index.yaml +55 -0
  251. package/templates/app/skeleton-lite/README.md +40 -0
  252. package/templates/app/skeleton-lite/supabase/config.toml +41 -0
  253. package/templates/app/skeleton-lite/supabase/migrations/__timestamp___baseline.sql +56 -0
  254. package/templates/app/skeleton-lite/supabase/seed.sql +0 -0
  255. package/templates/app/task-graph/turbo.json +23 -0
  256. package/templates/app/tool-config-lite/prettierignore +2 -0
  257. package/templates/app/tool-config-lite/prettierrc +1 -0
  258. package/templates/app/upgrade-full/.starcistacks/application-stacks.yaml +38 -0
  259. package/templates/app/upgrade-full/.starcistacks/dev/README.md +10 -0
  260. package/templates/app/upgrade-full/.starcistacks/dev/infra/compose/api.yaml +13 -0
  261. package/templates/app/upgrade-full/.starcistacks/dev/infra/compose/compose.yaml +3 -0
  262. package/templates/app/upgrade-full/.starcistacks/dev/infra/compose/postgres.yaml +12 -0
  263. package/templates/app/upgrade-full/.starcistacks/dev/infra/metadata.json +7 -0
  264. package/templates/be/common/main-listen.ts.partial +14 -0
  265. package/templates/be/common/sql-ident.ts.partial +7 -0
  266. package/templates/be/common/sql-tag.ts.partial +5 -0
  267. package/templates/be/image/api/Dockerfile +38 -0
  268. package/templates/be/image/cli/Dockerfile +38 -0
  269. package/templates/be/image/worker/Dockerfile +36 -0
  270. package/templates/be/inbox/database-client.ts.tpl +50 -0
  271. package/templates/be/inbox/index.ts.tpl +2 -0
  272. package/templates/be/inbox/migration.sql.tpl +29 -0
  273. package/templates/be/inbox/module-definition.ts.tpl +6 -0
  274. package/templates/be/inbox/module.ts.tpl +14 -0
  275. package/templates/be/inbox/options.ts.tpl +2 -0
  276. package/templates/be/inbox/service.ts.tpl +33 -0
  277. package/templates/be/inbox/sql.ts.tpl +16 -0
  278. package/templates/be/inbox/webhook-door.ts.tpl +36 -0
  279. package/templates/be/patterns/api/application.command.http.ts.tpl +10 -0
  280. package/templates/be/patterns/api/application.command.ts.tpl +10 -0
  281. package/templates/be/patterns/api/application.contracts.ts.tpl +11 -0
  282. package/templates/be/patterns/api/application.handler.http.ts.tpl +22 -0
  283. package/templates/be/patterns/api/application.handler.ts.tpl +22 -0
  284. package/templates/be/patterns/api/feature.index.http.ts.tpl +1 -0
  285. package/templates/be/patterns/api/feature.index.ts.tpl +1 -0
  286. package/templates/be/patterns/api/feature.module.ts.tpl +6 -0
  287. package/templates/be/patterns/api/graphql.input.ts.tpl +13 -0
  288. package/templates/be/patterns/api/graphql.mapper.ts.tpl +9 -0
  289. package/templates/be/patterns/api/graphql.module.ts.tpl +7 -0
  290. package/templates/be/patterns/api/graphql.resolver.ts.tpl +27 -0
  291. package/templates/be/patterns/api/graphql.type.ts.tpl +9 -0
  292. package/templates/be/patterns/api/http.controller.ts.tpl +27 -0
  293. package/templates/be/patterns/api/http.mapper.ts.tpl +9 -0
  294. package/templates/be/patterns/api/http.module.ts.tpl +7 -0
  295. package/templates/be/patterns/api/http.request.ts.tpl +10 -0
  296. package/templates/be/patterns/api/http.response.ts.tpl +5 -0
  297. package/templates/be/patterns/cli/group.cli.spec.ts.tpl +15 -0
  298. package/templates/be/patterns/cli/group.cli.ts.tpl +11 -0
  299. package/templates/be/patterns/cli/group.module.ts.tpl +7 -0
  300. package/templates/be/patterns/cli/sub.run.cli.spec.ts.tpl +17 -0
  301. package/templates/be/patterns/cli/sub.run.cli.ts.tpl +15 -0
  302. package/templates/be/patterns/event-bus/platform/errors/event-bus.error.ts.tpl +22 -0
  303. package/templates/be/patterns/event-bus/platform/event-bus.config.ts.tpl +19 -0
  304. package/templates/be/patterns/event-bus/platform/event-bus.contracts.ts.tpl +58 -0
  305. package/templates/be/patterns/event-bus/platform/event-bus.decorators.ts.tpl +46 -0
  306. package/templates/be/patterns/event-bus/platform/event-bus.log-events.ts.tpl +12 -0
  307. package/templates/be/patterns/event-bus/platform/event-bus.module-definition.ts.tpl +10 -0
  308. package/templates/be/patterns/event-bus/platform/event-bus.module.ts.tpl +52 -0
  309. package/templates/be/patterns/event-bus/platform/event-bus.options.ts.tpl +19 -0
  310. package/templates/be/patterns/event-bus/platform/event-bus.port.ts.tpl +28 -0
  311. package/templates/be/patterns/event-bus/platform/event-bus.service.spec.ts.tpl +165 -0
  312. package/templates/be/patterns/event-bus/platform/event-bus.service.ts.tpl +93 -0
  313. package/templates/be/patterns/event-bus/platform/event-envelope.policy.spec.ts.tpl +90 -0
  314. package/templates/be/patterns/event-bus/platform/event-envelope.policy.ts.tpl +58 -0
  315. package/templates/be/patterns/event-bus/platform/event-relay.service.spec.ts.tpl +136 -0
  316. package/templates/be/patterns/event-bus/platform/event-relay.service.ts.tpl +56 -0
  317. package/templates/be/patterns/event-bus/platform/event-runner.service.spec.ts.tpl +272 -0
  318. package/templates/be/patterns/event-bus/platform/event-runner.service.ts.tpl +128 -0
  319. package/templates/be/patterns/event-bus/platform/event-transport.port.ts.tpl +180 -0
  320. package/templates/be/patterns/event-bus/platform/event.policy.spec.ts.tpl +67 -0
  321. package/templates/be/patterns/event-bus/platform/event.policy.ts.tpl +38 -0
  322. package/templates/be/patterns/event-bus/platform/index.ts.tpl +11 -0
  323. package/templates/be/patterns/event-bus/platform/kafka-event-transport.client.spec.ts.tpl +348 -0
  324. package/templates/be/patterns/event-bus/platform/kafka-event-transport.client.ts.tpl +241 -0
  325. package/templates/be/patterns/event-bus/platform/messages/event-bus.messages.ts.tpl +15 -0
  326. package/templates/be/patterns/event-bus/platform/persistence/connection.ts.tpl +8 -0
  327. package/templates/be/patterns/event-bus/platform/persistence/entities/event-outbox.entity.ts.tpl +37 -0
  328. package/templates/be/patterns/event-bus/platform/persistence/event-bus.rows.ts.tpl +11 -0
  329. package/templates/be/patterns/event-bus/platform/persistence/event-bus.sql.ts.tpl +12 -0
  330. package/templates/be/patterns/event-bus/platform/persistence/migrations/1789800009000-create-event-outbox.ts.tpl +26 -0
  331. package/templates/be/patterns/jobs/job.index.ts.tpl +1 -0
  332. package/templates/be/patterns/jobs/job.module.ts.tpl +6 -0
  333. package/templates/be/patterns/jobs/job.processor.ts.tpl +20 -0
  334. package/templates/be/patterns/jobs/job.queue.module.ts.tpl +20 -0
  335. package/templates/be/patterns/jobs/job.step.ts.tpl +19 -0
  336. package/templates/be/patterns/jobs/platform/fenced.processor.spec.ts.tpl +31 -0
  337. package/templates/be/patterns/jobs/platform/fenced.processor.ts.tpl +13 -0
  338. package/templates/be/patterns/jobs/platform/job-claim.service.spec.ts.tpl +150 -0
  339. package/templates/be/patterns/jobs/platform/job-claim.service.ts.tpl +100 -0
  340. package/templates/be/patterns/jobs/platform/job-runner.service.spec.ts.tpl +138 -0
  341. package/templates/be/patterns/jobs/platform/job-runner.service.ts.tpl +69 -0
  342. package/templates/be/patterns/jobs/platform/jobs.config.ts.tpl +11 -0
  343. package/templates/be/patterns/jobs/platform/jobs.contracts.ts.tpl +62 -0
  344. package/templates/be/patterns/jobs/platform/jobs.decorators.ts.tpl +31 -0
  345. package/templates/be/patterns/jobs/platform/jobs.error.ts.tpl +22 -0
  346. package/templates/be/patterns/jobs/platform/jobs.index.ts.tpl +11 -0
  347. package/templates/be/patterns/jobs/platform/jobs.log-events.ts.tpl +9 -0
  348. package/templates/be/patterns/jobs/platform/jobs.messages.ts.tpl +15 -0
  349. package/templates/be/patterns/jobs/platform/jobs.module-definition.ts.tpl +10 -0
  350. package/templates/be/patterns/jobs/platform/jobs.module.ts.tpl +32 -0
  351. package/templates/be/patterns/jobs/platform/jobs.options.ts.tpl +11 -0
  352. package/templates/be/patterns/jobs/platform/jobs.port.ts.tpl +36 -0
  353. package/templates/be/patterns/jobs/platform/persistence.connection.ts.tpl +8 -0
  354. package/templates/be/patterns/jobs/platform/persistence.job.entity.ts.tpl +53 -0
  355. package/templates/be/patterns/jobs/platform/persistence.jobs.rows.ts.tpl +13 -0
  356. package/templates/be/patterns/jobs/platform/persistence.jobs.sql.ts.tpl +33 -0
  357. package/templates/be/patterns/jobs/platform/persistence.migration.ts.tpl +29 -0
  358. package/templates/be/patterns/outbox/platform/index.ts.tpl +2 -0
  359. package/templates/be/patterns/outbox/platform/outbox-relay.policy.spec.ts.tpl +96 -0
  360. package/templates/be/patterns/outbox/platform/outbox-relay.policy.ts.tpl +78 -0
  361. package/templates/be/patterns/outbox/platform/outbox.log-events.ts.tpl +5 -0
  362. package/templates/be/patterns/projections/migration.ts.tpl +18 -0
  363. package/templates/be/patterns/projections/persistence.connection.ts.tpl +8 -0
  364. package/templates/be/patterns/projections/projection.entity.ts.tpl +9 -0
  365. package/templates/be/patterns/projections/projection.index.ts.tpl +3 -0
  366. package/templates/be/patterns/projections/projection.module-definition.ts.tpl +7 -0
  367. package/templates/be/patterns/projections/projection.module.ts.tpl +18 -0
  368. package/templates/be/patterns/projections/projection.options.ts.tpl +2 -0
  369. package/templates/be/patterns/projections/projection.projection.spec.ts.tpl +55 -0
  370. package/templates/be/patterns/projections/projection.projection.ts.tpl +21 -0
  371. package/templates/be/patterns/queues/platform/bullmq-queue-transport.client.spec.ts.tpl +142 -0
  372. package/templates/be/patterns/queues/platform/bullmq-queue-transport.client.ts.tpl +81 -0
  373. package/templates/be/patterns/queues/platform/persistence.connection.ts.tpl +8 -0
  374. package/templates/be/patterns/queues/platform/persistence.migration.ts.tpl +25 -0
  375. package/templates/be/patterns/queues/platform/persistence.queue-outbox.entity.ts.tpl +25 -0
  376. package/templates/be/patterns/queues/platform/persistence.queue.rows.ts.tpl +9 -0
  377. package/templates/be/patterns/queues/platform/persistence.queue.sql.ts.tpl +12 -0
  378. package/templates/be/patterns/queues/platform/queue-outbox.service.spec.ts.tpl +48 -0
  379. package/templates/be/patterns/queues/platform/queue-outbox.service.ts.tpl +17 -0
  380. package/templates/be/patterns/queues/platform/queue-relay.service.spec.ts.tpl +128 -0
  381. package/templates/be/patterns/queues/platform/queue-relay.service.ts.tpl +48 -0
  382. package/templates/be/patterns/queues/platform/queue-transport.port.ts.tpl +115 -0
  383. package/templates/be/patterns/queues/platform/queue-worker.service.spec.ts.tpl +91 -0
  384. package/templates/be/patterns/queues/platform/queue-worker.service.ts.tpl +45 -0
  385. package/templates/be/patterns/queues/platform/queue.config.ts.tpl +15 -0
  386. package/templates/be/patterns/queues/platform/queue.contracts.ts.tpl +31 -0
  387. package/templates/be/patterns/queues/platform/queue.decorators.ts.tpl +45 -0
  388. package/templates/be/patterns/queues/platform/queue.index.ts.tpl +7 -0
  389. package/templates/be/patterns/queues/platform/queue.log-events.ts.tpl +5 -0
  390. package/templates/be/patterns/queues/platform/queue.module-definition.ts.tpl +10 -0
  391. package/templates/be/patterns/queues/platform/queue.module.ts.tpl +62 -0
  392. package/templates/be/patterns/queues/platform/queue.options.ts.tpl +22 -0
  393. package/templates/be/patterns/queues/platform/queue.policy.spec.ts.tpl +19 -0
  394. package/templates/be/patterns/queues/platform/queue.policy.ts.tpl +11 -0
  395. package/templates/be/patterns/queues/platform/queue.port.ts.tpl +14 -0
  396. package/templates/be/patterns/queues/queue.index.ts.tpl +3 -0
  397. package/templates/be/patterns/queues/queue.module.ts.tpl +6 -0
  398. package/templates/be/patterns/queues/queue.queue.ts.tpl +23 -0
  399. package/templates/be/patterns/reactors/application.command.ts.tpl +10 -0
  400. package/templates/be/patterns/reactors/application.contracts.ts.tpl +12 -0
  401. package/templates/be/patterns/reactors/application.handler.ts.tpl +22 -0
  402. package/templates/be/patterns/reactors/consumer.ts.tpl +19 -0
  403. package/templates/be/patterns/reactors/message.module.ts.tpl +20 -0
  404. package/templates/be/patterns/reactors/reactor.index.ts.tpl +1 -0
  405. package/templates/be/patterns/reactors/reactor.module.ts.tpl +6 -0
  406. package/templates/be/patterns/realtime/channel.graphql.module.ts.tpl +6 -0
  407. package/templates/be/patterns/realtime/channel.index.ts.tpl +1 -0
  408. package/templates/be/patterns/realtime/channel.input.ts.tpl +12 -0
  409. package/templates/be/patterns/realtime/channel.subscription.spec.ts.tpl +51 -0
  410. package/templates/be/patterns/realtime/channel.subscription.ts.tpl +32 -0
  411. package/templates/be/patterns/realtime/channel.type.ts.tpl +9 -0
  412. package/templates/be/patterns/saga/saga.compensate.command.ts.tpl +11 -0
  413. package/templates/be/patterns/saga/saga.compensate.contracts.ts.tpl +7 -0
  414. package/templates/be/patterns/saga/saga.compensate.handler.ts.tpl +22 -0
  415. package/templates/be/patterns/saga/saga.compensation.ts.tpl +21 -0
  416. package/templates/be/patterns/saga/saga.complete.command.ts.tpl +11 -0
  417. package/templates/be/patterns/saga/saga.complete.contracts.ts.tpl +7 -0
  418. package/templates/be/patterns/saga/saga.complete.handler.ts.tpl +22 -0
  419. package/templates/be/patterns/saga/saga.done.consumer.ts.tpl +21 -0
  420. package/templates/be/patterns/saga/saga.failed.consumer.ts.tpl +21 -0
  421. package/templates/be/patterns/saga/saga.index.ts.tpl +1 -0
  422. package/templates/be/patterns/saga/saga.message.module.ts.tpl +23 -0
  423. package/templates/be/patterns/saga/saga.module.ts.tpl +20 -0
  424. package/templates/be/patterns/saga/saga.service.spec.ts.tpl +70 -0
  425. package/templates/be/patterns/saga/saga.service.ts.tpl +44 -0
  426. package/templates/be/patterns/saga/saga.state.ts.tpl +14 -0
  427. package/templates/be/patterns/saga/saga.step.ts.tpl +11 -0
  428. package/templates/be/patterns/saga/saga.undo.command.ts.tpl +10 -0
  429. package/templates/be/patterns/saga/saga.undo.contracts.ts.tpl +5 -0
  430. package/templates/be/patterns/saga/saga.undo.handler.ts.tpl +21 -0
  431. package/templates/be/patterns/webhooks/webhook.door.spec.ts.tpl +72 -0
  432. package/templates/be/patterns/webhooks/webhook.door.ts.tpl +36 -0
  433. package/templates/be/patterns/webhooks/webhook.http.module.ts.tpl +6 -0
  434. package/templates/be/patterns/webhooks/webhook.index.ts.tpl +1 -0
  435. package/templates/be/patterns/webhooks/webhook.request.ts.tpl +9 -0
  436. package/templates/be/skeleton/apps/__app__/src/__app__.options.ts +3 -0
  437. package/templates/be/skeleton/apps/__app__/src/app.module.ts +15 -2
  438. package/templates/be/skeleton/apps/__app__/src/main.ts +7 -15
  439. package/templates/be/skeleton/apps/cli/src/app.module.ts +30 -0
  440. package/templates/be/skeleton/apps/cli/src/cli.options.ts +22 -0
  441. package/templates/be/skeleton/apps/cli/src/main.ts +24 -0
  442. package/templates/be/skeleton/src/features/cli/cli.module.ts +7 -0
  443. package/templates/be/skeleton/src/features/cli/index.ts +1 -0
  444. package/templates/be/skeleton/src/features/cli/migrate/migrate.cli.spec.ts +17 -0
  445. package/templates/be/skeleton/src/features/cli/migrate/migrate.cli.ts +15 -0
  446. package/templates/be/skeleton/src/features/cli/migrate/migrate.module.ts +7 -0
  447. package/templates/be/skeleton/src/features/cli/migrate/subs/run.cli.spec.ts +17 -0
  448. package/templates/be/skeleton/src/features/cli/migrate/subs/run.cli.ts +18 -0
  449. package/templates/be/skeleton/src/features/cli/seed/seed.cli.spec.ts +17 -0
  450. package/templates/be/skeleton/src/features/cli/seed/seed.cli.ts +15 -0
  451. package/templates/be/skeleton/src/features/cli/seed/seed.module.ts +7 -0
  452. package/templates/be/skeleton/src/features/cli/seed/subs/run.cli.spec.ts +33 -0
  453. package/templates/be/skeleton/src/features/cli/seed/subs/run.cli.ts +34 -0
  454. package/templates/be/skeleton/src/modules/domain/identity/admission.policy.spec.ts +13 -0
  455. package/templates/be/skeleton/src/modules/domain/identity/auth.guard.spec.ts +40 -0
  456. package/templates/be/skeleton/src/modules/domain/identity/messages/identity.messages.ts +1 -1
  457. package/templates/be/skeleton/src/modules/domain/note/errors/note.error.ts +16 -0
  458. package/templates/be/skeleton/src/modules/domain/note/index.ts +3 -0
  459. package/templates/be/skeleton/src/modules/domain/note/note.contracts.ts +19 -0
  460. package/templates/be/skeleton/src/modules/domain/note/note.decorators.ts +9 -0
  461. package/templates/be/skeleton/src/modules/domain/note/note.module-definition.ts +7 -0
  462. package/templates/be/skeleton/src/modules/domain/note/note.module.ts +19 -0
  463. package/templates/be/skeleton/src/modules/domain/note/note.options.ts +2 -0
  464. package/templates/be/skeleton/src/modules/domain/note/note.service.spec.ts +76 -0
  465. package/templates/be/skeleton/src/modules/domain/note/note.service.ts +37 -0
  466. package/templates/be/skeleton/src/modules/domain/note/persistence/connection.ts +8 -0
  467. package/templates/be/skeleton/src/modules/domain/note/persistence/entities/note.entity.ts +17 -0
  468. package/templates/be/skeleton/src/modules/domain/note/persistence/migrations/1790000000000-init-note.ts +22 -0
  469. package/templates/be/skeleton/src/modules/domain/note/persistence/note.rows.ts +17 -0
  470. package/templates/be/skeleton/src/modules/domain/note/persistence/note.sql.ts +4 -0
  471. package/templates/be/skeleton/src/modules/platform/config/env-source.config.ts +20 -0
  472. package/templates/be/skeleton/src/modules/platform/config/index.ts +1 -1
  473. package/templates/be/skeleton/src/modules/platform/cqrs/cqrs.contracts.ts +18 -0
  474. package/templates/be/skeleton/src/modules/platform/database/connection-source.client.spec.ts +41 -0
  475. package/templates/be/skeleton/src/modules/platform/database/connection-source.client.ts +17 -0
  476. package/templates/be/skeleton/src/modules/platform/database/database.module-definition.ts +13 -0
  477. package/templates/be/skeleton/src/modules/platform/database/database.module.ts +77 -0
  478. package/templates/be/skeleton/src/modules/platform/database/database.options.ts +30 -0
  479. package/templates/be/skeleton/src/modules/platform/database/database.port.ts +65 -0
  480. package/templates/be/skeleton/src/modules/platform/database/database.sql.ts +47 -0
  481. package/templates/be/skeleton/src/modules/platform/database/errors/database.error.ts +16 -0
  482. package/templates/be/skeleton/src/modules/platform/database/index.ts +9 -0
  483. package/templates/be/skeleton/src/modules/platform/database/migrate-connections.client.ts +30 -0
  484. package/templates/be/skeleton/src/modules/platform/database/migration-runner.service.spec.ts +84 -0
  485. package/templates/be/skeleton/src/modules/platform/database/migration-runner.service.ts +23 -0
  486. package/templates/be/skeleton/src/modules/platform/database/primary.config.ts +9 -0
  487. package/templates/be/skeleton/src/modules/platform/database/primary.connection.ts +2 -0
  488. package/templates/be/skeleton/src/modules/platform/database/primary.decorators.ts +10 -0
  489. package/templates/be/skeleton/src/modules/platform/database/seed-connections.client.spec.ts +108 -0
  490. package/templates/be/skeleton/src/modules/platform/database/seed-connections.client.ts +75 -0
  491. package/templates/be/skeleton/src/modules/platform/database/seed-runner.service.spec.ts +88 -0
  492. package/templates/be/skeleton/src/modules/platform/database/seed-runner.service.ts +29 -0
  493. package/templates/be/skeleton/src/modules/platform/errors/errors.filter.spec.ts +48 -0
  494. package/templates/be/skeleton/src/modules/platform/errors/messages/errors.messages.ts +1 -1
  495. package/templates/be/skeleton/src/modules/platform/http-security/errors/http-security.error.ts +12 -0
  496. package/templates/be/skeleton/src/modules/platform/http-security/execution-request.mapper.spec.ts +16 -0
  497. package/templates/be/skeleton/src/modules/platform/http-security/http-security.config.ts +8 -1
  498. package/templates/be/skeleton/src/modules/platform/http-security/http-security.decorators.ts +8 -0
  499. package/templates/be/skeleton/src/modules/platform/http-security/http-security.module.ts +14 -1
  500. package/templates/be/skeleton/src/modules/platform/http-security/http-security.options.ts +12 -0
  501. package/templates/be/skeleton/src/modules/platform/http-security/messages/http-security.messages.ts +10 -2
  502. package/templates/be/skeleton/src/modules/platform/http-security/origin.guard.spec.ts +63 -0
  503. package/templates/be/skeleton/src/modules/platform/http-security/rate-limit.guard.spec.ts +108 -0
  504. package/templates/be/skeleton/src/modules/platform/http-security/request-validation.service.spec.ts +39 -0
  505. package/templates/be/skeleton/src/modules/platform/http-security/request-validation.service.ts +25 -0
  506. package/templates/be/skeleton/src/modules/platform/http-security/webhook-signature.service.spec.ts +172 -0
  507. package/templates/be/skeleton/src/modules/platform/http-security/webhook-signature.service.ts +66 -0
  508. package/templates/be/skeleton/src/modules/platform/logging/logging.log-events.ts +3 -1
  509. package/templates/be/skeleton/src/modules/platform/primitives/outcome.mapper.spec.ts +52 -0
  510. package/templates/be/skeleton-lite/apps/api/Dockerfile +37 -0
  511. package/templates/be/skeleton-lite/apps/api/src/api.options.ts +16 -0
  512. package/templates/be/skeleton-lite/apps/api/src/app.module.ts +81 -0
  513. package/templates/be/skeleton-lite/apps/api/src/main.ts +34 -0
  514. package/templates/be/skeleton-lite/src/modules/domain/identity/admission.policy.ts +14 -0
  515. package/templates/be/skeleton-lite/src/modules/domain/identity/auth.guard.ts +50 -0
  516. package/templates/be/skeleton-lite/src/modules/domain/identity/identity.contracts.ts +26 -0
  517. package/templates/be/skeleton-lite/src/modules/domain/identity/identity.decorators.ts +19 -0
  518. package/templates/be/skeleton-lite/src/modules/domain/identity/identity.module.ts +26 -0
  519. package/templates/be/skeleton-lite/src/modules/domain/identity/identity.options.ts +7 -0
  520. package/templates/be/skeleton-lite/src/modules/domain/identity/index.ts +6 -0
  521. package/templates/be/skeleton-lite/src/modules/integrations/supabase/errors/supabase.error.ts +19 -0
  522. package/templates/be/skeleton-lite/src/modules/integrations/supabase/index.ts +10 -0
  523. package/templates/be/skeleton-lite/src/modules/integrations/supabase/supabase.client.ts +24 -0
  524. package/templates/be/skeleton-lite/src/modules/integrations/supabase/supabase.config.ts +8 -0
  525. package/templates/be/skeleton-lite/src/modules/integrations/supabase/supabase.decorators.ts +17 -0
  526. package/templates/be/skeleton-lite/src/modules/integrations/supabase/supabase.jwks.ts +32 -0
  527. package/templates/be/skeleton-lite/src/modules/integrations/supabase/supabase.options.ts +24 -0
  528. package/templates/be/skeleton-lite/src/modules/platform/cqrs/index.ts +4 -0
  529. package/templates/be/skeleton-lite/src/modules/platform/database/database.module.ts +54 -0
  530. package/templates/be/skeleton-lite/src/modules/platform/database/database.options.ts +23 -0
  531. package/templates/be/skeleton-lite/src/modules/platform/database/database.port.ts +10 -0
  532. package/templates/be/skeleton-lite/src/modules/platform/database/database.sql.ts +49 -0
  533. package/templates/be/skeleton-lite/src/modules/platform/database/index.ts +4 -0
  534. package/templates/be/skeleton-lite/src/modules/platform/database/migration-runner.service.ts +21 -0
  535. package/templates/be/skeleton-lite/src/modules/platform/database/primary.config.ts +11 -0
  536. package/templates/be/skeleton-lite/src/modules/platform/database/seed-runner.service.ts +28 -0
  537. package/templates/be/skeleton-lite/src/modules/platform/http-security/http-security.module.ts +25 -0
  538. package/templates/be/skeleton-lite/src/modules/platform/http-security/index.ts +9 -0
  539. package/templates/be/skeleton-lite/src/modules/platform/i18n/index.ts +4 -0
  540. package/templates/be/skeleton-lite/src/modules/platform/logging/index.ts +5 -0
  541. package/templates/be/table/error.ts.tpl +16 -0
  542. package/templates/be/table/index.ts.tpl +2 -0
  543. package/templates/be/table/migration.sql.tpl +51 -0
  544. package/templates/be/table/module-definition.ts.tpl +7 -0
  545. package/templates/be/table/module.ts.tpl +14 -0
  546. package/templates/be/table/options.ts.tpl +2 -0
  547. package/templates/be/table/rows.ts.tpl +4 -0
  548. package/templates/be/table/service.ts.tpl +23 -0
  549. package/templates/be/table/sql.ts.tpl +4 -0
  550. package/templates/be/tool-config/jest.config.js +3 -1
  551. package/templates/be/upgrade-full/apps/cli/src/app.module.ts +14 -0
  552. package/templates/be/upgrade-full/apps/cli/src/main.ts +26 -0
  553. package/templates/be/upgrade-full/src/features/cli/cli.module.ts +6 -0
  554. package/templates/be/upgrade-full/src/features/cli/migrate/subs/run.cli.ts +23 -0
  555. package/templates/common/gitignore.base +1 -2
  556. package/templates/fe/app/package.json.tpl +1 -0
  557. package/templates/fe/app/tsconfig.json +12 -0
  558. package/templates/fe/common/app-layout.tsx.partial +8 -0
  559. package/templates/fe/common/site-shell.tsx.partial +9 -0
  560. package/templates/fe/image/next/Dockerfile +42 -0
  561. package/templates/fe/skeleton/apps/app/next.config.ts +23 -0
  562. package/templates/fe/skeleton/apps/app/postcss.config.mjs +7 -0
  563. package/templates/fe/skeleton/apps/{__app__ → app}/src/app/[locale]/error.tsx +2 -2
  564. package/templates/fe/skeleton/apps/app/src/app/[locale]/layout.tsx +22 -0
  565. package/templates/fe/skeleton/apps/{__app__ → app}/src/app/[locale]/loading.tsx +2 -2
  566. package/templates/fe/skeleton/apps/{__app__ → app}/src/app/[locale]/not-found.tsx +2 -2
  567. package/templates/fe/skeleton/apps/app/src/app/[locale]/page.tsx +9 -0
  568. package/templates/fe/skeleton/apps/{__app__ → app}/src/app/global-error.tsx +2 -2
  569. package/templates/fe/skeleton/apps/app/src/app/globals.css +10 -0
  570. package/templates/fe/skeleton/apps/app/src/features/layouts/AppLayout/index.tsx +18 -0
  571. package/templates/fe/skeleton/apps/app/src/features/pages/AppErrorPage/component.tsx +19 -0
  572. package/templates/fe/skeleton/apps/app/src/features/pages/AppErrorPage/index.tsx +11 -0
  573. package/templates/fe/skeleton/apps/app/src/features/pages/AppGlobalErrorPage/index.tsx +16 -0
  574. package/templates/fe/skeleton/apps/app/src/features/pages/AppHomePage/component.tsx +10 -0
  575. package/templates/fe/skeleton/apps/app/src/features/pages/AppHomePage/index.tsx +15 -0
  576. package/templates/fe/skeleton/apps/app/src/features/pages/AppLoadingPage/index.tsx +8 -0
  577. package/templates/fe/skeleton/apps/app/src/features/pages/AppNotFoundPage/index.tsx +9 -0
  578. package/templates/fe/skeleton/apps/app/src/modules/i18n/index.ts +4 -0
  579. package/templates/fe/skeleton/apps/app/src/modules/i18n/messages/vi.json +28 -0
  580. package/templates/fe/skeleton/apps/app/src/modules/i18n/request.ts +4 -0
  581. package/templates/fe/skeleton/apps/app/src/modules/routes/index.ts +4 -0
  582. package/templates/fe/skeleton/apps/app/src/proxy.ts +1 -0
  583. package/templates/fe/skeleton/apps/{__app__ → landing}/next.config.ts +4 -2
  584. package/templates/fe/skeleton/apps/landing/postcss.config.mjs +7 -0
  585. package/templates/fe/skeleton/apps/landing/src/app/[locale]/error.tsx +10 -0
  586. package/templates/fe/skeleton/apps/landing/src/app/[locale]/layout.tsx +22 -0
  587. package/templates/fe/skeleton/apps/landing/src/app/[locale]/loading.tsx +6 -0
  588. package/templates/fe/skeleton/apps/landing/src/app/[locale]/not-found.tsx +6 -0
  589. package/templates/fe/skeleton/apps/landing/src/app/[locale]/page.tsx +9 -0
  590. package/templates/fe/skeleton/apps/landing/src/app/global-error.tsx +10 -0
  591. package/templates/fe/skeleton/apps/landing/src/app/globals.css +10 -0
  592. package/templates/fe/skeleton/apps/landing/src/features/layouts/LandingLayout/index.tsx +24 -0
  593. package/templates/fe/skeleton/apps/landing/src/features/pages/LandingErrorPage/component.tsx +18 -0
  594. package/templates/fe/skeleton/apps/landing/src/features/pages/LandingErrorPage/index.tsx +11 -0
  595. package/templates/fe/skeleton/apps/landing/src/features/pages/LandingGlobalErrorPage/index.tsx +16 -0
  596. package/templates/fe/skeleton/apps/landing/src/features/pages/LandingLoadingPage/index.tsx +8 -0
  597. package/templates/fe/skeleton/apps/landing/src/features/pages/LandingNotFoundPage/index.tsx +9 -0
  598. package/templates/fe/skeleton/apps/landing/src/features/pages/LandingPage/component.tsx +24 -0
  599. package/templates/fe/skeleton/apps/landing/src/features/pages/LandingPage/index.tsx +16 -0
  600. package/templates/fe/skeleton/apps/landing/src/modules/config/index.ts +12 -0
  601. package/templates/fe/skeleton/apps/landing/src/modules/i18n/index.ts +7 -0
  602. package/templates/fe/skeleton/apps/landing/src/modules/i18n/messages/vi.json +31 -0
  603. package/templates/fe/skeleton/apps/landing/src/modules/i18n/request.ts +4 -0
  604. package/templates/fe/skeleton/apps/landing/src/modules/routes/index.ts +4 -0
  605. package/templates/fe/skeleton/apps/landing/src/proxy.ts +1 -0
  606. package/templates/fe/skeleton/packages/__project__-i18n/src/index.ts +49 -0
  607. package/templates/fe/skeleton/packages/__project__-i18n/src/proxy.ts +24 -0
  608. package/templates/fe/skeleton/packages/__project__-i18n/src/routing.ts +20 -0
  609. package/templates/fe/skeleton/packages/__project__-ui/src/branches/Providers/index.tsx +23 -0
  610. package/templates/fe/skeleton/packages/__project__-ui/src/composites/ErrorNotice/index.tsx +14 -0
  611. package/templates/fe/skeleton/packages/__project__-ui/src/composites/GlobalErrorNotice/index.tsx +25 -0
  612. package/templates/fe/skeleton/packages/__project__-ui/src/composites/LoadingNotice/index.tsx +9 -0
  613. package/templates/fe/skeleton/packages/__project__-ui/src/composites/LocaleShell/index.tsx +21 -0
  614. package/templates/fe/skeleton/packages/__project__-ui/src/composites/NotFoundNotice/index.tsx +19 -0
  615. package/templates/fe/skeleton/packages/__project__-ui/src/composites/SiteShell/classNames.ts +4 -0
  616. package/templates/fe/skeleton/packages/__project__-ui/src/composites/SiteShell/index.tsx +19 -0
  617. package/templates/fe/skeleton/packages/__project__-ui/src/index.ts +6 -0
  618. package/templates/fe/skeleton-lite/apps/web/next.config.ts +22 -0
  619. package/templates/fe/skeleton-lite/apps/web/src/app/[locale]/error.tsx +10 -0
  620. package/templates/fe/skeleton-lite/apps/web/src/app/[locale]/layout.tsx +37 -0
  621. package/templates/fe/skeleton-lite/apps/web/src/app/[locale]/loading.tsx +6 -0
  622. package/templates/fe/skeleton-lite/apps/web/src/app/[locale]/not-found.tsx +6 -0
  623. package/templates/fe/skeleton-lite/apps/web/src/app/[locale]/page.tsx +9 -0
  624. package/templates/fe/skeleton-lite/apps/web/src/app/[locale]/providers.tsx +26 -0
  625. package/templates/fe/skeleton-lite/apps/web/src/app/auth/callback/route.ts +24 -0
  626. package/templates/fe/skeleton-lite/apps/web/src/app/global-error.tsx +10 -0
  627. package/templates/fe/{skeleton/apps/__app__ → skeleton-lite/apps/web}/src/app/globals.css +1 -1
  628. package/templates/fe/skeleton-lite/apps/web/src/app/health/live/route.ts +5 -0
  629. package/templates/fe/skeleton-lite/apps/web/src/components/blocks/SignInForm/component.tsx +29 -0
  630. package/templates/fe/skeleton-lite/apps/web/src/components/blocks/SignInForm/index.tsx +41 -0
  631. package/templates/fe/skeleton-lite/apps/web/src/components/blocks/SignOutButton/component.tsx +17 -0
  632. package/templates/fe/skeleton-lite/apps/web/src/components/blocks/SignOutButton/index.tsx +38 -0
  633. package/templates/fe/skeleton-lite/apps/web/src/components/composites/ErrorNotice/index.tsx +13 -0
  634. package/templates/fe/skeleton-lite/apps/web/src/components/composites/GlobalErrorNotice/index.tsx +24 -0
  635. package/templates/fe/skeleton-lite/apps/web/src/components/composites/LoadingNotice/index.tsx +7 -0
  636. package/templates/fe/skeleton-lite/apps/web/src/components/composites/NotFoundNotice/index.tsx +18 -0
  637. package/templates/fe/skeleton-lite/apps/web/src/components/composites/SiteShell/classNames.ts +4 -0
  638. package/templates/fe/skeleton-lite/apps/web/src/components/composites/SiteShell/index.tsx +13 -0
  639. package/templates/fe/skeleton-lite/apps/web/src/features/layouts/AppLayout/index.tsx +31 -0
  640. package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppErrorPage/component.tsx +12 -0
  641. package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppErrorPage/index.tsx +10 -0
  642. package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppGlobalErrorPage/index.tsx +15 -0
  643. package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppHomePage/component.tsx +14 -0
  644. package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppHomePage/index.tsx +30 -0
  645. package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppLoadingPage/index.tsx +8 -0
  646. package/templates/fe/skeleton-lite/apps/web/src/features/pages/AppNotFoundPage/index.tsx +9 -0
  647. package/templates/fe/skeleton-lite/apps/web/src/modules/brand/brand.css +20 -0
  648. package/templates/fe/skeleton-lite/apps/web/src/modules/brand/index.ts +2 -0
  649. package/templates/fe/skeleton-lite/apps/web/src/modules/config/index.ts +20 -0
  650. package/templates/fe/skeleton-lite/apps/web/src/modules/db/auth/read-session.ts +25 -0
  651. package/templates/fe/skeleton-lite/apps/web/src/modules/db/auth/write-sign-in.ts +25 -0
  652. package/templates/fe/skeleton-lite/apps/web/src/modules/db/auth/write-sign-out.ts +17 -0
  653. package/templates/fe/skeleton-lite/apps/web/src/modules/db/browser.ts +14 -0
  654. package/templates/fe/skeleton-lite/apps/web/src/modules/db/index.ts +3 -0
  655. package/templates/fe/skeleton-lite/apps/web/src/modules/db/outcome.ts +59 -0
  656. package/templates/fe/skeleton-lite/apps/web/src/modules/db/principal.ts +29 -0
  657. package/templates/fe/skeleton-lite/apps/web/src/modules/db/server.ts +70 -0
  658. package/templates/fe/skeleton-lite/apps/web/src/modules/db/validation/validation.mapper.ts +50 -0
  659. package/templates/fe/skeleton-lite/apps/web/src/modules/i18n/index.ts +8 -0
  660. package/templates/fe/skeleton-lite/apps/web/src/modules/i18n/messages/vi.json +48 -0
  661. package/templates/fe/skeleton-lite/apps/web/src/modules/i18n/request.ts +16 -0
  662. package/templates/fe/skeleton-lite/apps/web/src/modules/i18n/routing.ts +14 -0
  663. package/templates/fe/skeleton-lite/apps/web/src/modules/routes/index.ts +7 -0
  664. package/templates/fe/skeleton-lite/apps/web/src/modules/routes/safe-next-path.ts +26 -0
  665. package/templates/fe/skeleton-lite/apps/web/src/proxy.ts +43 -0
  666. package/templates/fe/table/read.ts.tpl +16 -0
  667. package/templates/fe/table/write.ts.tpl +16 -0
  668. package/upgrade/check.mjs +137 -0
  669. package/upgrade/index.mjs +524 -0
  670. package/bin/hfs.mjs +0 -233
  671. package/runtime/scripts/api/fs/rmdir-link.mjs +0 -12
  672. package/runtime/scripts/lib/test-secrets.mjs +0 -116
  673. package/templates/fe/skeleton/apps/__app__/src/app/[locale]/layout.tsx +0 -20
  674. package/templates/fe/skeleton/apps/__app__/src/app/[locale]/page.tsx +0 -9
  675. package/templates/fe/skeleton/apps/__app__/src/components/composites/FailureScreen/index.tsx +0 -28
  676. package/templates/fe/skeleton/apps/__app__/src/features/layouts/LocaleShell/index.tsx +0 -35
  677. package/templates/fe/skeleton/apps/__app__/src/features/pages/ErrorPage/component.tsx +0 -19
  678. package/templates/fe/skeleton/apps/__app__/src/features/pages/ErrorPage/index.tsx +0 -11
  679. package/templates/fe/skeleton/apps/__app__/src/features/pages/GlobalErrorPage/component.tsx +0 -24
  680. package/templates/fe/skeleton/apps/__app__/src/features/pages/GlobalErrorPage/index.tsx +0 -14
  681. package/templates/fe/skeleton/apps/__app__/src/features/pages/HomePage/component.tsx +0 -21
  682. package/templates/fe/skeleton/apps/__app__/src/features/pages/HomePage/index.tsx +0 -15
  683. package/templates/fe/skeleton/apps/__app__/src/features/pages/LoadingPage/component.tsx +0 -23
  684. package/templates/fe/skeleton/apps/__app__/src/features/pages/LoadingPage/index.tsx +0 -8
  685. package/templates/fe/skeleton/apps/__app__/src/features/pages/NotFoundPage/component.tsx +0 -28
  686. package/templates/fe/skeleton/apps/__app__/src/features/pages/NotFoundPage/index.tsx +0 -8
  687. package/templates/fe/skeleton/apps/__app__/src/modules/i18n/config.ts +0 -8
  688. package/templates/fe/skeleton/apps/__app__/src/modules/i18n/index.ts +0 -2
  689. package/templates/fe/skeleton/apps/__app__/src/modules/i18n/messages/vi.json +0 -25
  690. package/templates/fe/skeleton/apps/__app__/src/modules/i18n/request.ts +0 -19
  691. package/templates/fe/skeleton/apps/__app__/src/modules/i18n/routing.ts +0 -9
  692. package/templates/fe/skeleton/apps/__app__/src/modules/routes/index.ts +0 -4
  693. package/templates/fe/skeleton/apps/__app__/src/proxy.ts +0 -10
  694. /package/templates/be/skeleton/src/features/{system-health → api/system-health}/application/check-liveness.contracts.ts +0 -0
  695. /package/templates/be/skeleton/src/features/{system-health → api/system-health}/application/check-liveness.handler.ts +0 -0
  696. /package/templates/be/skeleton/src/features/{system-health → api/system-health}/application/check-liveness.query.ts +0 -0
  697. /package/templates/be/skeleton/src/features/{system-health → api/system-health}/index.ts +0 -0
  698. /package/templates/be/skeleton/src/features/{system-health → api/system-health}/system-health.module.ts +0 -0
  699. /package/templates/be/skeleton/src/features/{system-health → api/system-health}/transport/http/live.controller.ts +0 -0
  700. /package/templates/be/skeleton/src/features/{system-health → api/system-health}/transport/http/system-health-http.module.ts +0 -0
  701. /package/templates/fe/skeleton/apps/{__app__ → app}/src/app/health/live/route.ts +0 -0
  702. /package/templates/fe/skeleton/apps/{__app__ → app}/src/modules/config/index.ts +0 -0
  703. /package/templates/fe/{skeleton/apps/__app__ → skeleton-lite/apps/web}/postcss.config.mjs +0 -0
@@ -0,0 +1,553 @@
1
+ schema: starci/profile-registry@1
2
+ purpose: >-
3
+ The ONE model catalog of the runtime. Concrete model ids — provider,
4
+ capability tier and per-token price — live under `models`; the provider
5
+ quota/capacity pools, their roles, concurrency and per-difficulty model pins
6
+ live under `pools`; every launch target lives under `targets`, carrying
7
+ `defaultModel` where it names a single model. No other file in the repo
8
+ states a model id, tier, price or pool: those cite these keys.
9
+
10
+ # Canonical naming. Keep these roles distinct
11
+ # in contracts and receipts; an `agent` and a `provider` may carry the same
12
+ # string, but the fields are not interchangeable — `agent` names the execution
13
+ # adapter while model-routing `provider` remains quota authority.
14
+ glossary:
15
+ launcher: human chat surface explicitly selecting the StarCi entry (codex-chat | claude-chat | devin-chat)
16
+ host: Orca execution environment owning terminals, worktrees and managed operation workers
17
+ agent: execution adapter / Orca agent id (codex | claude | devin | cursor)
18
+ provider: credential, billing and quota family used by allocation
19
+ model: a concrete model id (a `models` key below) that worker-start --model takes
20
+ target: a StarCi routing/capability target (a `targets` key below)
21
+ pool: one provider quota/capacity window (a `pools` key below), routed to as a target
22
+
23
+ # Price table that turns measured token counts (llm_usage, scripts/lib/llm-usage.mjs
24
+ # priceOf/costOfRow) into cost_usd. The runtime never guesses a price: a model absent
25
+ # from `models`, or with a null rate, leaves cost_usd NULL. Nothing reads a provider
26
+ # price feed; the owner declares the rates below from the provider's own price page
27
+ # and dates the edit (pricing.asOf).
28
+ pricing:
29
+ currency: USD
30
+ unit: per-million-tokens
31
+ asOf: '2026-10-03'
32
+ source: >-
33
+ Official list prices read 2026-09-29 (WebFetch): claude-* from https://claude.com/pricing (5-minute cache write TTL);
34
+ gpt-6-luna from https://developers.openai.com/api/docs/pricing. GPT-6.1 Sol list prices read 2026-10-03 from
35
+ https://developers.openai.com/api/docs/models/gpt-6.1-sol: Standard processing tier, contexts at or below 272K
36
+ tokens (input 2, output 10, cached input 0.10 per 1M tokens). Larger-context and other processing-tier multipliers
37
+ are not applied because the CLI reports no billing tier. swe-2-max (Devin) has
38
+ no official per-token price page read, so its rates stay null and cost_usd stays NULL for it. A subscription seat
39
+ (Claude Max, Codex Pro, Devin plan) bills a flat fee, so cost_usd is the API-equivalent list price.
40
+ matching: >-
41
+ priceOf(model): the exact `models` key first, then the longest declared id that is a prefix of the model
42
+ (a dated snapshot id `claude-opus-5-5-20260901` prices as `claude-opus-5-5`). The four rates are USD per 1M tokens:
43
+ input = fresh (non-cached) input, cacheRead = cached input read, cacheWrite = cache creation, output = generated
44
+ tokens including reasoning. A model whose used rate is null gets cost_usd NULL (a partial sum is never written).
45
+
46
+ # The concrete model ids the runtime may name: provider (quota family), tier (the
47
+ # capability class the catalog assigns it) and the per-token price row costOfRow
48
+ # consumes. A launch-only target's `targets.<t>.defaultModel` and every pool's
49
+ # `pools.<p>.models`/`defaultModel` pin keys of this map — nothing else.
50
+ models:
51
+ claude-opus-5-5: {provider: claude, tier: frontier, price: {input: 4, output: 20, cacheRead: 0.2, cacheWrite: 5, source: official}}
52
+ claude-sonnet-5-5: {provider: claude, tier: standard, price: {input: 2, output: 10, cacheRead: 0.2, cacheWrite: 2.5, source: official}}
53
+ gpt-6.1-sol: {provider: codex, tier: frontier, price: {input: 2, output: 10, cacheRead: 0.1, cacheWrite: 2.5, source: official}}
54
+ gpt-6-luna: {provider: codex, tier: economy, price: {input: 0.1, output: 0.5, cacheRead: 0.01, cacheWrite: 0.125, source: official}}
55
+ swe-2-max: {provider: devin, tier: frontier, price: {input: null, output: null, cacheRead: null, cacheWrite: null, source: unset}}
56
+
57
+ # The provider quota/capacity pools the allocator serves. `models` pins the launch
58
+ # model per difficulty (easy|medium|hard|insane) — a missing pin is a typed error,
59
+ # never a fallback to a neighbouring tier's model; `defaultModel` is the model a
60
+ # launch takes when no difficulty pin applies. `maxParallel` is the only concurrency
61
+ # authority (registry.yaml executionModel.concurrency).
62
+ pools:
63
+ # One Codex account window carries both models: Luna is the easy/medium model, Sol the hard and insane one.
64
+ # Role/tier/tool/quality gates still apply on top of the difficulty pin; an owner allocation changes
65
+ # capacity, never qualification or effect authority.
66
+ codex-agent:
67
+ target: codex-agent
68
+ provider: codex
69
+ roles: [implement, verify, write, decide, plan]
70
+ maxParallel: 10
71
+ defaultModel: gpt-6-luna
72
+ models:
73
+ easy: gpt-6-luna
74
+ medium: gpt-6-luna
75
+ hard: gpt-6.1-sol
76
+ insane: gpt-6.1-sol
77
+ effort:
78
+ easy: low
79
+ medium: medium
80
+ hard: high
81
+ insane: max
82
+ # One Claude session/week window, all five roles on the same pinned model at every difficulty. The Claude
83
+ # CLI lists no models, so the dispatch's model attestation is what proves the claude-opus-5-5 id.
84
+ claude-agent:
85
+ target: claude-agent
86
+ provider: claude
87
+ roles: [implement, verify, write, decide, plan]
88
+ maxParallel: 6
89
+ defaultModel: claude-opus-5-5
90
+ models:
91
+ easy: claude-opus-5-5
92
+ medium: claude-opus-5-5
93
+ hard: claude-opus-5-5
94
+ insane: claude-opus-5-5
95
+ # Devin has no machine-readable account headroom equivalent to Orca's provider windows. Owner-assigned
96
+ # capacity: 10 parallel lanes, opened by the owner's default grant (config.yaml allocation.grants
97
+ # devin-agent=10@implement+verify+write applies to every workflow; once config.yaml declares a grants list,
98
+ # `starci kernel route` rejects a grant-gated pool that list does not open). The CLI's auth/readiness and observed
99
+ # launch/refusal status are the live capacity signal on top of this cap. swe-2-max is a medium+ agent: no
100
+ # easy or insane pin, and the easy tier does not list the pool.
101
+ devin-agent:
102
+ target: devin-agent
103
+ provider: devin
104
+ roles: [implement, verify, write]
105
+ maxParallel: 10
106
+ capacityAuthority: explicit-workflow-quota
107
+ quotaTelemetry: launch-status
108
+ defaultModel: swe-2-max
109
+ models:
110
+ medium: swe-2-max
111
+ hard: swe-2-max
112
+
113
+ runtimes:
114
+ - codex
115
+ - claude
116
+ - devin
117
+ - cursor
118
+ aliases:
119
+ openai: codex
120
+ anthropic: claude
121
+ cognition: devin
122
+ executionModel:
123
+ # Two agent levels, one host. A chat submits the goal and then monitors; it is
124
+ # never an agent layer above the kernel.
125
+ levels: [workflow-kernel, operation-agent]
126
+ host: orca
127
+ chat: trigger-and-monitor-only
128
+ workflowKernel: one-long-lived-agent-per-workflow
129
+ kernelAuthority: sole-workflow-state-writer-through-scripts/kernel/cli.mjs
130
+ operationAgent: one-ephemeral-agent-per-job
131
+ operationMapping: one-operation-instance-one-agent
132
+ isolationBoundary: operation
133
+ worktree: isolated-child-per-job
134
+ scheduling: dependency-dag
135
+ fanOutWithinOperation: forbidden
136
+ concreteAgentBinding: provider-profile-model
137
+ # Concurrency is one number per pool and it lives in one file.
138
+ concurrency: modules/models/registry.yaml pools.<pool>.maxParallel
139
+ orchestration:
140
+ runtime: orca
141
+ owner: source-host
142
+ defaultOperationTarget: devin-agent
143
+ workspaceRouting: .workspaces/projects/<project>/work.json
144
+ # Owner ruling: owner gates are the StarCi entry's scope-bound acceptance
145
+ # for goal definition and native workflow startup, plus settle-time evidence verdicts — there is no
146
+ # separate approvals engine or policy file.
147
+ approvalMode: entry-skill-owner-ok
148
+ dispatch: The native lifecycle claims an accepted queued goal and spawns that workflow's one long-lived kernel agent
149
+ (scripts/kernel/start-workflow.mjs). The kernel is the sole workflow-state writer; `starci kernel dispatch --spawn`
150
+ launches one isolated agent per ready operation in the workflow's one worktree, using the first eligible target in
151
+ that operation's chain. The kernel never implements, repairs or tests on behalf of an operation agent.
152
+ targets:
153
+ # Pool targets are named by a `pools` key above, whose `models` map pins the launch model per
154
+ # difficulty and whose `defaultModel` covers an unpinned difficulty. A pool target names no model itself.
155
+ codex-agent:
156
+ runtime: codex
157
+ orcaLaunch: {agent: codex} # orca orchestration worker-start --agent codex
158
+ # Launch-only targets: an explicit `--model gpt-6.1-sol` or `--model gpt-6-luna` request reaches that one model
159
+ # on the Codex provider window. They are off every automatic chain; allocation routes the codex-agent pool.
160
+ # `defaultModel` is the launch model resolveWorkerLaunchModel returns for them (they hold no pools entry).
161
+ gpt-6.1-sol:
162
+ runtime: codex
163
+ defaultModel: gpt-6.1-sol
164
+ orcaLaunch: {agent: codex} # orca orchestration worker-start --agent codex
165
+ gpt-6-luna:
166
+ runtime: codex
167
+ defaultModel: gpt-6-luna
168
+ orcaLaunch: {agent: codex} # orca orchestration worker-start --agent codex
169
+ # Cursor: Orca agent id `cursor` (binary cursor-agent). A launch-only target like gpt-6.1-sol: off every automatic chain,
170
+ # reached by an explicit `--model auto` (the CLI's default) or any id of the account's `cursor-agent --list-models`.
171
+ # Live proof 2026-10-02: worker-start --agent cursor --model auto reached worker_done and released cleanly. No Cursor
172
+ # quota probe exists, so no automatic chain routes to it. `defaultModel: auto` is the CLI's selector keyword —
173
+ # Orca's catalog default — not a `models` entry (Cursor publishes no fixed priced catalog).
174
+ cursor-agent:
175
+ runtime: cursor
176
+ defaultModel: auto
177
+ orcaLaunch: {agent: cursor} # orca orchestration worker-start --agent cursor
178
+ claude-agent:
179
+ runtime: claude
180
+ orcaLaunch: {agent: claude} # orca orchestration worker-start --agent claude
181
+ devin-agent:
182
+ runtime: devin
183
+ executionHosts: [orca]
184
+ orcaLaunch: {agent: devin} # orca orchestration worker-start --agent devin
185
+ # An operator whose kind runtimes.yaml roleOfKind marks think work with no declared order carries the
186
+ # think order of runtimes.yaml allocation.preference.think (Opus, then Sol) and nothing else;
187
+ # scripts/route/route-model.mjs refuses any other pool for it. A kind's declared order wins: owner routing
188
+ # 2026-09-26 gives the ui order (Codex, then Devin) to interface.audit, e2e.verify,
189
+ # security.verify and uat.assisted.verify, the implement order (Devin, Codex, Opus) to the
190
+ # mechanical ops provision.ask, workspace.manage, task.execute and knowledge.repair, and sol-think (Sol,
191
+ # Opus overflow) to the kernel's own model calls, which carry no operator entry. Owner decision 2026-09-25
192
+ # (72h scripts/agent/model-scorecard.mjs evidence):
193
+ # hands-on implementation chains lead with Devin; scaffold, docs, content and grammar chains (the
194
+ # roleOfKind order scaffold) lead with Devin; the image-tool chains are Codex alone.
195
+ operators:
196
+ architecture.decide:
197
+ skill: starci
198
+ chain: [claude-agent, codex-agent]
199
+ environments:
200
+ - {environment: claude, profiles: [claude-agent]}
201
+ - {environment: codex, profiles: [codex-agent]}
202
+ backend.implement:
203
+ skill: starci
204
+ chain: [devin-agent, codex-agent, claude-agent]
205
+ environments:
206
+ - {environment: devin, profiles: [devin-agent]}
207
+ - {environment: codex, profiles: [codex-agent]}
208
+ - {environment: claude, profiles: [claude-agent]}
209
+ brand.decide:
210
+ skill: starci
211
+ # Owner ruling 2026-09-27 (draw-devin-brand-claude): Claude decides the brand and its direction (runtimes.yaml
212
+ # order brand), Codex is the fallback. A decide operation that also produces bytes: when the product has no
213
+ # mascot, the Codex runtime, the only one carrying the image model ($imagegen), generates one placeholder;
214
+ # Claude decides the identity and defers that artwork with a brief.
215
+ chain: [claude-agent, codex-agent]
216
+ environments:
217
+ - {environment: claude, profiles: [claude-agent]}
218
+ - {environment: codex, profiles: [codex-agent]}
219
+ decision.prepare:
220
+ skill: starci
221
+ chain: [claude-agent, codex-agent]
222
+ environments:
223
+ - {environment: claude, profiles: [claude-agent]}
224
+ - {environment: codex, profiles: [codex-agent]}
225
+ docs.author:
226
+ skill: starci
227
+ # Authoring reference docs is write-role work over the record tree: the full writing chain.
228
+ chain: [devin-agent, codex-agent, claude-agent]
229
+ environments:
230
+ - {environment: devin, profiles: [devin-agent]}
231
+ - {environment: codex, profiles: [codex-agent]}
232
+ - {environment: claude, profiles: [claude-agent]}
233
+ provision.ask:
234
+ skill: starci
235
+ # Asking for a provision is naming it exactly and waiting: a mechanical op the hands take — the
236
+ # implement order (owner routing 2026-09-26).
237
+ chain: [devin-agent, codex-agent, claude-agent]
238
+ environments:
239
+ - {environment: devin, profiles: [devin-agent]}
240
+ - {environment: codex, profiles: [codex-agent]}
241
+ - {environment: claude, profiles: [claude-agent]}
242
+ business.decide:
243
+ skill: starci
244
+ chain: [claude-agent, codex-agent]
245
+ environments:
246
+ - {environment: claude, profiles: [claude-agent]}
247
+ - {environment: codex, profiles: [codex-agent]}
248
+ content.generate:
249
+ skill: starci
250
+ chain: [devin-agent, codex-agent, claude-agent]
251
+ environments:
252
+ - {environment: devin, profiles: [devin-agent]}
253
+ - {environment: codex, profiles: [codex-agent]}
254
+ - {environment: claude, profiles: [claude-agent]}
255
+ code.refactor:
256
+ skill: starci
257
+ # Restructuring code under a behaviour invariant is implementation work: the full coding chain.
258
+ chain: [devin-agent, codex-agent, claude-agent]
259
+ environments:
260
+ - {environment: devin, profiles: [devin-agent]}
261
+ - {environment: codex, profiles: [codex-agent]}
262
+ - {environment: claude, profiles: [claude-agent]}
263
+ e2e.verify:
264
+ skill: starci
265
+ # End-to-end proof is UI verification: the ui order, Sol first with the hands as fallback
266
+ # (owner routing 2026-09-26).
267
+ chain: [codex-agent, devin-agent]
268
+ environments:
269
+ - {environment: codex, profiles: [codex-agent]}
270
+ - {environment: devin, profiles: [devin-agent]}
271
+ integration.verify:
272
+ skill: starci
273
+ # A live call to a real provider is the same kind of work as the API proof: run code, read the response
274
+ # back, keep the output. Its hard floor starts the chain at Devin.
275
+ chain: [devin-agent, claude-agent, codex-agent]
276
+ environments:
277
+ - {environment: devin, profiles: [devin-agent]}
278
+ - {environment: claude, profiles: [claude-agent]}
279
+ - {environment: codex, profiles: [codex-agent]}
280
+ grammar.update:
281
+ skill: starci
282
+ # Growing the installed grammar is code, stories, tests, a published version and a canon entry: hands-on
283
+ # work at a hard floor on the scaffold order, Devin first (owner decision 2026-09-25).
284
+ chain: [devin-agent, codex-agent, claude-agent]
285
+ environments:
286
+ - {environment: devin, profiles: [devin-agent]}
287
+ - {environment: codex, profiles: [codex-agent]}
288
+ - {environment: claude, profiles: [claude-agent]}
289
+ goal.revise:
290
+ skill: starci
291
+ # Revising a live goal is a decision about the work, not work on it: the reasoning chain.
292
+ chain: [claude-agent, codex-agent]
293
+ environments:
294
+ - {environment: claude, profiles: [claude-agent]}
295
+ - {environment: codex, profiles: [codex-agent]}
296
+ interface.asset:
297
+ skill: starci
298
+ # Generating the artwork a candidate embeds needs the same image model the drawing used, so the chain is
299
+ # the same single Codex link: a runtime that cannot render an image cannot carry this operation at all.
300
+ chain: [codex-agent]
301
+ environments:
302
+ - {environment: codex, profiles: [codex-agent]}
303
+ interface.draw:
304
+ skill: starci
305
+ # Owner ruling 2026-09-27 (draw-devin-brand-claude): Devin draws - token-render HTML/CSS in the Grammar's tokens
306
+ # captured by Playwright in the product checkout (its card carries browser-dom) - and Codex (Sol) is the fallback.
307
+ # No drawer paints raster art: a raster region is an artworkSlot interface.asset generates on Codex's image tool.
308
+ chain: [devin-agent, codex-agent]
309
+ environments:
310
+ - {environment: devin, profiles: [devin-agent]}
311
+ - {environment: codex, profiles: [codex-agent]}
312
+ interface.implement:
313
+ skill: starci
314
+ chain: [devin-agent, codex-agent, claude-agent]
315
+ environments:
316
+ - {environment: devin, profiles: [devin-agent]}
317
+ - {environment: codex, profiles: [codex-agent]}
318
+ - {environment: claude, profiles: [claude-agent]}
319
+ interface.audit:
320
+ skill: starci
321
+ # Visual/Grammar conformance is an independent verdict about quality: the ui order, Sol first
322
+ # (owner routing 2026-09-26). Its browser-dom host tool (route.riskHints) admits only a pool
323
+ # whose agent card lists it (capabilities.hostTools): Devin and Codex; Claude is passed over.
324
+ chain: [codex-agent, devin-agent]
325
+ environments:
326
+ - {environment: codex, profiles: [codex-agent]}
327
+ - {environment: devin, profiles: [devin-agent]}
328
+ knowledge.repair:
329
+ skill: starci
330
+ # Repairing a canonical rule file is a mechanical op: the implement order (owner routing 2026-09-26).
331
+ chain: [devin-agent, codex-agent, claude-agent]
332
+ environments:
333
+ - {environment: devin, profiles: [devin-agent]}
334
+ - {environment: codex, profiles: [codex-agent]}
335
+ - {environment: claude, profiles: [claude-agent]}
336
+ unit.verify:
337
+ skill: starci
338
+ # Running the whole unit suite is mechanical, hands-on verify work: the same chain as the performance run.
339
+ chain: [devin-agent, claude-agent, codex-agent]
340
+ environments:
341
+ - {environment: devin, profiles: [devin-agent]}
342
+ - {environment: claude, profiles: [claude-agent]}
343
+ - {environment: codex, profiles: [codex-agent]}
344
+ perf.verify:
345
+ skill: starci
346
+ # Measuring a performance budget runs the product and reads numbers back: the hands-on verify chain.
347
+ chain: [devin-agent, claude-agent, codex-agent]
348
+ environments:
349
+ - {environment: devin, profiles: [devin-agent]}
350
+ - {environment: claude, profiles: [claude-agent]}
351
+ - {environment: codex, profiles: [codex-agent]}
352
+ release.deliver:
353
+ skill: starci
354
+ chain: [devin-agent, codex-agent, claude-agent]
355
+ environments:
356
+ - {environment: devin, profiles: [devin-agent]}
357
+ - {environment: codex, profiles: [codex-agent]}
358
+ - {environment: claude, profiles: [claude-agent]}
359
+ request.analyze:
360
+ skill: starci
361
+ # Turning a raw request into a scoped, checkable goal is planning work: the reasoning chain, the cheap pool never.
362
+ chain: [claude-agent, codex-agent]
363
+ environments:
364
+ - {environment: claude, profiles: [claude-agent]}
365
+ - {environment: codex, profiles: [codex-agent]}
366
+ review.verify:
367
+ skill: starci
368
+ chain: [devin-agent, claude-agent, codex-agent]
369
+ environments:
370
+ - {environment: devin, profiles: [devin-agent]}
371
+ - {environment: claude, profiles: [claude-agent]}
372
+ - {environment: codex, profiles: [codex-agent]}
373
+ handover.review:
374
+ skill: starci
375
+ # Writing the owner's handover is judging what was delivered and what was not proven: a verdict the hands
376
+ # give (owner decision 2026-09-25 review-hands), Opus and Sol as overflow.
377
+ chain: [devin-agent, claude-agent, codex-agent]
378
+ environments:
379
+ - {environment: devin, profiles: [devin-agent]}
380
+ - {environment: claude, profiles: [claude-agent]}
381
+ - {environment: codex, profiles: [codex-agent]}
382
+ runtime.operate:
383
+ skill: starci
384
+ chain: [devin-agent, codex-agent, claude-agent]
385
+ environments:
386
+ - {environment: devin, profiles: [devin-agent]}
387
+ - {environment: codex, profiles: [codex-agent]}
388
+ - {environment: claude, profiles: [claude-agent]}
389
+ scope.finish:
390
+ skill: starci
391
+ chain: [devin-agent, codex-agent, claude-agent]
392
+ environments:
393
+ - {environment: devin, profiles: [devin-agent]}
394
+ - {environment: codex, profiles: [codex-agent]}
395
+ - {environment: claude, profiles: [claude-agent]}
396
+ scope.define:
397
+ skill: starci
398
+ # Cutting a goal into bounded nodes is a decision about the work: the reasoning chain.
399
+ chain: [claude-agent, codex-agent]
400
+ environments:
401
+ - {environment: claude, profiles: [claude-agent]}
402
+ - {environment: codex, profiles: [codex-agent]}
403
+ security.verify:
404
+ skill: starci
405
+ # Auditing code against the security baseline is a verdict about quality: the ui order, Sol first
406
+ # (owner routing 2026-09-26).
407
+ chain: [codex-agent, devin-agent]
408
+ environments:
409
+ - {environment: codex, profiles: [codex-agent]}
410
+ - {environment: devin, profiles: [devin-agent]}
411
+ task.execute:
412
+ skill: starci
413
+ # A bounded, evidence-grounded workflow selection is a mechanical op: the implement order
414
+ # (owner routing 2026-09-26).
415
+ chain: [devin-agent, codex-agent, claude-agent]
416
+ environments:
417
+ - {environment: devin, profiles: [devin-agent]}
418
+ - {environment: codex, profiles: [codex-agent]}
419
+ - {environment: claude, profiles: [claude-agent]}
420
+ test.author:
421
+ skill: starci
422
+ # Authoring the regression check a behaviour-invariant change is measured against is implementation work:
423
+ # the full coding chain.
424
+ chain: [devin-agent, codex-agent, claude-agent]
425
+ environments:
426
+ - {environment: devin, profiles: [devin-agent]}
427
+ - {environment: codex, profiles: [codex-agent]}
428
+ - {environment: claude, profiles: [claude-agent]}
429
+ uat.verify:
430
+ skill: starci
431
+ chain: [devin-agent, claude-agent, codex-agent]
432
+ environments:
433
+ - {environment: devin, profiles: [devin-agent]}
434
+ - {environment: claude, profiles: [claude-agent]}
435
+ - {environment: codex, profiles: [codex-agent]}
436
+ uat.assisted.prepare:
437
+ skill: starci
438
+ # Preparation authors deterministic scripts/evidence but performs no product journey.
439
+ chain: [devin-agent, codex-agent, claude-agent]
440
+ environments:
441
+ - {environment: devin, profiles: [devin-agent]}
442
+ - {environment: codex, profiles: [codex-agent]}
443
+ - {environment: claude, profiles: [claude-agent]}
444
+ uat.assisted.verify:
445
+ skill: starci
446
+ # Receipt acceptance is an elevated verdict over evidence: the ui order, Sol first
447
+ # (owner routing 2026-09-26).
448
+ chain: [codex-agent, devin-agent]
449
+ environments:
450
+ - {environment: codex, profiles: [codex-agent]}
451
+ - {environment: devin, profiles: [devin-agent]}
452
+ work.author:
453
+ skill: starci
454
+ # Authoring the Work records - a node's scope and checks, a whole feature's drafts - is authoring the hands
455
+ # do (owner decision 2026-09-25 review-hands: "work.author" with test/UAT authoring); the kernel's cut
456
+ # decision (implementation.plan) stays on the think order.
457
+ chain: [devin-agent, claude-agent, codex-agent]
458
+ environments:
459
+ - {environment: devin, profiles: [devin-agent]}
460
+ - {environment: claude, profiles: [claude-agent]}
461
+ - {environment: codex, profiles: [codex-agent]}
462
+ workspace.manage:
463
+ skill: starci
464
+ # Workspace bookkeeping is a mechanical op: the implement order (owner routing 2026-09-26).
465
+ chain: [devin-agent, codex-agent, claude-agent]
466
+ environments:
467
+ - {environment: devin, profiles: [devin-agent]}
468
+ - {environment: codex, profiles: [codex-agent]}
469
+ - {environment: claude, profiles: [claude-agent]}
470
+ fallback:
471
+ allowedReasons:
472
+ - unavailable
473
+ - quota-exhausted
474
+ - rate-limited
475
+ - startup-failure
476
+ - unsupported
477
+ requiredEffectState: none
478
+ blockedReasons:
479
+ - permission-denied
480
+ - user-checkpoint
481
+ - business-ambiguity
482
+ - safety-block
483
+ - partial-or-unknown-effects
484
+ selection: |-
485
+ Orca supplies the observed external-agent inventory. Resolve the selected skill and
486
+ operator chain from top to bottom, choosing the first ready runtime/profile. Fall through only
487
+ after an allowed failure with verified no-effect state. This policy never installs an agent,
488
+ authenticates a provider, grants tools or expands the workflow authority. Every pool launches the one
489
+ way (modules/kernel/start-workflow.yaml): `orca orchestration worker-start --agent
490
+ <runtime> [--model <id> --effort <level>] --spec <prompt>` (Orca files the Task), the unattended flags from Orca's per-agent
491
+ default args; the launcher takes the agent terminal from the start receipt (else worker-show) and attests the effective agent and model
492
+ (worker-show). Devin takes no model flag (Orca: --model is for Claude, Codex and Cursor) and starts on its CLI default.
493
+ costPolicy: |-
494
+ Runtime pools are provider quota windows: the Codex pool carries gpt-6-luna for easy and medium work and
495
+ gpt-6.1-sol for hard and insane work, the Claude pool carries claude-opus-5-5 for every role,
496
+ and Devin opens through the owner's default grant (config.yaml allocation.grants). modules/models/runtimes.yaml
497
+ roleOfKind splits the kinds: strategy (decide, plan and every other think kind that is not a verdict, a
498
+ kernel call or a mechanical op) runs the Claude pool, then the Codex pool on Sol; the kernel's own model
499
+ calls walk sol-think - the Codex pool first, the Claude pool as overflow (owner routing 2026-09-26);
500
+ review - the verify kinds still on the review order and work.author (owner decision 2026-09-25
501
+ review-hands) - runs the Devin pool, with Claude and Codex as
502
+ overflow only (the cross-family rule sends a review of Devin's work to them); the ui order leads interface.audit, e2e.verify, security.verify and uat.assisted.verify
503
+ with the Codex pool, Devin behind it; the mechanical ops - provision.ask, workspace.manage,
504
+ task.execute and knowledge.repair - walk the implement order the hands serve whatever their kind role;
505
+ hands-on work runs the Devin and Codex pools with the Claude pool as overflow. brand.decide is think work that also generates a placeholder mascot when the product has none;
506
+ the Claude pool decides the identity and defers that artwork with a concrete brief, and the Codex pool, the
507
+ only one with an image generator, generates it when it takes the launch.
508
+ interface.draw token-renders its shapes (HTML/CSS in the Grammar's tokens, Playwright capture) and walks the
509
+ draw order: the Devin pool first, the Codex pool as fallback (owner ruling 2026-09-27); its raster regions are
510
+ artworkSlots, never painted by the drawer. interface.asset generates that artwork and therefore carries the
511
+ single image-capable Codex route, with no deferral fallback - a deferred
512
+ slot is exactly what this operation exists to close. grammar.update is the opposite case: it grows the
513
+ installed grammar as code - a typed unit with its stories, its tests, its published version and its canon
514
+ entry - so it carries the execution `implement` role at a hard floor; nothing in it is drawn, and a publish
515
+ is irreversible, so the chain is limited to declared coding runtimes. knowledge.repair rewrites a canonical
516
+ rule of this runtime and is think work the hands serve on the implement order. Every automatic chain contains only
517
+ worker-start candidates and advances only after a verified no-effect failure. Agents have explicit turn, wall-time
518
+ and tool-call ceilings; a ceiling stop is a failed attempt and never proof of completion.
519
+ Never infer price or quality superiority from a subscription label; benchmark bounded
520
+ representative operations before proposing another routing change. A native worker is released
521
+ after its exact worker_done result is accepted; the workflow child remains until integration is
522
+ complete. The chain does not decide who runs an operation - `modules/models/runtimes.yaml`
523
+ does, by role preference - so every operator's `environments` must declare every runtime that carries
524
+ that operation's role and owns a profile for it, and the chain lists exactly those targets so
525
+ `candidateFor` can answer with a launch shape for whichever runtime the allocator picked. A pool
526
+ whose roles do not cover an operation's role (Devin carries no `decide`, so they cannot take an
527
+ `architecture.decide`) stays out of that operator and is excluded from allocation by the roles gate
528
+ (scripts/agent/models.mjs poolRejectionReasons). The one widening: an order that names a role -
529
+ `implement` - lets a pool that serves the order take its kinds whatever the kind's own role, which is how
530
+ the mechanical ops reach the hands.
531
+ assetFallback: When image generation is unavailable, reuse verified assets first; Claude may leave
532
+ decorative image slots blank with a concrete deferred brief. Never mark missing artwork generated
533
+ or satisfy a functional criterion with a blank slot.
534
+ examples:
535
+ codexFrontend:
536
+ runtime: codex
537
+ profile: gpt-6.1-sol
538
+ model: gpt-6.1-sol
539
+ imageGenerationAvailable: true
540
+ claudeFrontend:
541
+ runtime: claude
542
+ profile: opus
543
+ model: claude-opus-5-5
544
+ imageGenerationAvailable: false
545
+ orcaInterfaceImplementation:
546
+ skill: starci
547
+ op: interface.implement
548
+ availableRuntimes:
549
+ - codex
550
+ - claude
551
+ examplesNote: Examples of frontend context.execution only. Set availability from observed host
552
+ tools, never copy true as proof. Declared exact models still require effective runtime attestation.
553
+ Orca resolves ordered skill/operator candidates from observed readiness instead.