create-flowdular 0.2.3 → 0.2.5

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 (271) hide show
  1. package/README.md +11 -0
  2. package/agent-template/.agents/skills/agent-tool-design/SKILL.md +203 -0
  3. package/agent-template/.agents/skills/auth-security-review/SKILL.md +90 -0
  4. package/agent-template/.agents/skills/auto-review/SKILL.md +103 -0
  5. package/agent-template/.agents/skills/bug-hunt/SKILL.md +104 -0
  6. package/agent-template/.agents/skills/business-agent-design/SKILL.md +182 -0
  7. package/agent-template/.agents/skills/cli-extension/SKILL.md +108 -0
  8. package/agent-template/.agents/skills/core-extend/SKILL.md +99 -0
  9. package/agent-template/.agents/skills/database-adapter/SKILL.md +198 -0
  10. package/agent-template/.agents/skills/database-adapter/references/first-run-and-matrix.md +105 -0
  11. package/agent-template/.agents/skills/migration-authoring/SKILL.md +161 -0
  12. package/agent-template/.agents/skills/module-new/SKILL.md +171 -0
  13. package/agent-template/.agents/skills/module-update/SKILL.md +91 -0
  14. package/agent-template/.agents/skills/perf-audit/SKILL.md +98 -0
  15. package/agent-template/.agents/skills/release-eject-pr/SKILL.md +107 -0
  16. package/agent-template/.agents/skills/spec-approval/SKILL.md +106 -0
  17. package/agent-template/.agents/skills/test-hardening/SKILL.md +79 -0
  18. package/agent-template/.agents/skills/translations-i18n/SKILL.md +78 -0
  19. package/agent-template/.agents/skills/ux-design/SKILL.md +92 -0
  20. package/agent-template/.agents/skills/variables/SKILL.md +156 -0
  21. package/agent-template/.agents/skills/workflow-development/SKILL.md +192 -0
  22. package/agent-template/.ai/README.md +62 -0
  23. package/agent-template/.ai/agents/README.md +27 -0
  24. package/agent-template/.ai/agents/module-executor.md +36 -0
  25. package/agent-template/.ai/agents/reviewer.md +23 -0
  26. package/agent-template/.ai/agents/sandbox/agentic-engineer.md +31 -0
  27. package/agent-template/.ai/agents/sandbox/backend-engineer.md +36 -0
  28. package/agent-template/.ai/agents/sandbox/business-manager.md +23 -0
  29. package/agent-template/.ai/agents/sandbox/frontend-engineer.md +27 -0
  30. package/agent-template/.ai/agents/sandbox/ux-designer.md +23 -0
  31. package/agent-template/.ai/agents/spec-author.md +29 -0
  32. package/agent-template/.ai/blueprints/add-migration/README.md +5 -0
  33. package/agent-template/.ai/blueprints/add-migration/allowed-paths.yaml +23 -0
  34. package/agent-template/.ai/blueprints/add-migration/blueprint.json +14 -0
  35. package/agent-template/.ai/blueprints/add-migration/examples/invalid/input-destructive.json +6 -0
  36. package/agent-template/.ai/blueprints/add-migration/examples/invalid/plan-unnumbered-file.json +9 -0
  37. package/agent-template/.ai/blueprints/add-migration/examples/valid/input.json +6 -0
  38. package/agent-template/.ai/blueprints/add-migration/examples/valid/plan.json +9 -0
  39. package/agent-template/.ai/blueprints/add-migration/gates.yaml +30 -0
  40. package/agent-template/.ai/blueprints/add-migration/input.schema.json +23 -0
  41. package/agent-template/.ai/blueprints/add-migration/plan.schema.json +54 -0
  42. package/agent-template/.ai/blueprints/add-migration/required-files.yaml +18 -0
  43. package/agent-template/.ai/blueprints/add-migration/spec-requirements.yaml +13 -0
  44. package/agent-template/.ai/blueprints/add-migration/steps.yaml +62 -0
  45. package/agent-template/.ai/blueprints/author-spec/README.md +5 -0
  46. package/agent-template/.ai/blueprints/author-spec/allowed-paths.yaml +7 -0
  47. package/agent-template/.ai/blueprints/author-spec/blueprint.json +14 -0
  48. package/agent-template/.ai/blueprints/author-spec/examples/invalid/input-missing-outcome.json +5 -0
  49. package/agent-template/.ai/blueprints/author-spec/examples/valid/input.json +6 -0
  50. package/agent-template/.ai/blueprints/author-spec/gates.yaml +13 -0
  51. package/agent-template/.ai/blueprints/author-spec/input.schema.json +20 -0
  52. package/agent-template/.ai/blueprints/author-spec/plan.schema.json +14 -0
  53. package/agent-template/.ai/blueprints/author-spec/required-files.yaml +6 -0
  54. package/agent-template/.ai/blueprints/author-spec/spec-requirements.yaml +35 -0
  55. package/agent-template/.ai/blueprints/author-spec/steps.yaml +28 -0
  56. package/agent-template/.ai/blueprints/author-spec/templates/module.yaml +45 -0
  57. package/agent-template/.ai/blueprints/bug-fix/README.md +5 -0
  58. package/agent-template/.ai/blueprints/bug-fix/allowed-paths.yaml +29 -0
  59. package/agent-template/.ai/blueprints/bug-fix/blueprint.json +14 -0
  60. package/agent-template/.ai/blueprints/bug-fix/examples/invalid/input-no-symptom.json +4 -0
  61. package/agent-template/.ai/blueprints/bug-fix/examples/invalid/plan-no-test.json +8 -0
  62. package/agent-template/.ai/blueprints/bug-fix/examples/valid/input.json +6 -0
  63. package/agent-template/.ai/blueprints/bug-fix/examples/valid/plan.json +8 -0
  64. package/agent-template/.ai/blueprints/bug-fix/gates.yaml +30 -0
  65. package/agent-template/.ai/blueprints/bug-fix/input.schema.json +25 -0
  66. package/agent-template/.ai/blueprints/bug-fix/plan.schema.json +53 -0
  67. package/agent-template/.ai/blueprints/bug-fix/required-files.yaml +7 -0
  68. package/agent-template/.ai/blueprints/bug-fix/spec-requirements.yaml +7 -0
  69. package/agent-template/.ai/blueprints/bug-fix/steps.yaml +51 -0
  70. package/agent-template/.ai/blueprints/core-extend/README.md +5 -0
  71. package/agent-template/.ai/blueprints/core-extend/allowed-paths.yaml +49 -0
  72. package/agent-template/.ai/blueprints/core-extend/blueprint.json +14 -0
  73. package/agent-template/.ai/blueprints/core-extend/examples/invalid/input-unknown-package.json +5 -0
  74. package/agent-template/.ai/blueprints/core-extend/examples/invalid/plan-missing-gates.json +7 -0
  75. package/agent-template/.ai/blueprints/core-extend/examples/valid/input.json +6 -0
  76. package/agent-template/.ai/blueprints/core-extend/examples/valid/plan.json +10 -0
  77. package/agent-template/.ai/blueprints/core-extend/gates.yaml +16 -0
  78. package/agent-template/.ai/blueprints/core-extend/input.schema.json +54 -0
  79. package/agent-template/.ai/blueprints/core-extend/plan.schema.json +39 -0
  80. package/agent-template/.ai/blueprints/core-extend/required-files.yaml +36 -0
  81. package/agent-template/.ai/blueprints/core-extend/spec-requirements.yaml +17 -0
  82. package/agent-template/.ai/blueprints/core-extend/steps.yaml +54 -0
  83. package/agent-template/.ai/blueprints/edit-module/README.md +9 -0
  84. package/agent-template/.ai/blueprints/edit-module/allowed-paths.yaml +27 -0
  85. package/agent-template/.ai/blueprints/edit-module/blueprint.json +20 -0
  86. package/agent-template/.ai/blueprints/edit-module/examples/invalid/input-unknown-change.json +5 -0
  87. package/agent-template/.ai/blueprints/edit-module/examples/invalid/plan-touches-platform.json +15 -0
  88. package/agent-template/.ai/blueprints/edit-module/examples/valid/input.json +5 -0
  89. package/agent-template/.ai/blueprints/edit-module/examples/valid/plan.json +25 -0
  90. package/agent-template/.ai/blueprints/edit-module/gates.yaml +30 -0
  91. package/agent-template/.ai/blueprints/edit-module/input.schema.json +31 -0
  92. package/agent-template/.ai/blueprints/edit-module/plan.schema.json +65 -0
  93. package/agent-template/.ai/blueprints/edit-module/required-files.yaml +80 -0
  94. package/agent-template/.ai/blueprints/edit-module/spec-requirements.yaml +15 -0
  95. package/agent-template/.ai/blueprints/edit-module/steps.yaml +115 -0
  96. package/agent-template/.ai/blueprints/new-module/README.md +7 -0
  97. package/agent-template/.ai/blueprints/new-module/allowed-paths.yaml +27 -0
  98. package/agent-template/.ai/blueprints/new-module/blueprint.json +20 -0
  99. package/agent-template/.ai/blueprints/new-module/examples/invalid/input-spec-outside-modules.json +4 -0
  100. package/agent-template/.ai/blueprints/new-module/examples/invalid/plan-unknown-gate.json +8 -0
  101. package/agent-template/.ai/blueprints/new-module/examples/valid/input.json +5 -0
  102. package/agent-template/.ai/blueprints/new-module/examples/valid/plan.json +22 -0
  103. package/agent-template/.ai/blueprints/new-module/gates.yaml +30 -0
  104. package/agent-template/.ai/blueprints/new-module/input.schema.json +21 -0
  105. package/agent-template/.ai/blueprints/new-module/plan.schema.json +58 -0
  106. package/agent-template/.ai/blueprints/new-module/required-files.yaml +73 -0
  107. package/agent-template/.ai/blueprints/new-module/spec-requirements.yaml +30 -0
  108. package/agent-template/.ai/blueprints/new-module/steps.yaml +138 -0
  109. package/agent-template/.ai/blueprints/release/README.md +5 -0
  110. package/agent-template/.ai/blueprints/release/allowed-paths.yaml +19 -0
  111. package/agent-template/.ai/blueprints/release/blueprint.json +14 -0
  112. package/agent-template/.ai/blueprints/release/examples/invalid/input-bad-version.json +4 -0
  113. package/agent-template/.ai/blueprints/release/examples/invalid/plan-bad-branch.json +7 -0
  114. package/agent-template/.ai/blueprints/release/examples/valid/input.json +5 -0
  115. package/agent-template/.ai/blueprints/release/examples/valid/plan.json +20 -0
  116. package/agent-template/.ai/blueprints/release/gates.yaml +20 -0
  117. package/agent-template/.ai/blueprints/release/input.schema.json +24 -0
  118. package/agent-template/.ai/blueprints/release/plan.schema.json +46 -0
  119. package/agent-template/.ai/blueprints/release/required-files.yaml +19 -0
  120. package/agent-template/.ai/blueprints/release/spec-requirements.yaml +8 -0
  121. package/agent-template/.ai/blueprints/release/steps.yaml +47 -0
  122. package/agent-template/.ai/blueprints/security-review/README.md +5 -0
  123. package/agent-template/.ai/blueprints/security-review/allowed-paths.yaml +6 -0
  124. package/agent-template/.ai/blueprints/security-review/blueprint.json +14 -0
  125. package/agent-template/.ai/blueprints/security-review/examples/invalid/input-unknown-kind.json +4 -0
  126. package/agent-template/.ai/blueprints/security-review/examples/invalid/plan-finding-without-scenario.json +14 -0
  127. package/agent-template/.ai/blueprints/security-review/examples/valid/input.json +4 -0
  128. package/agent-template/.ai/blueprints/security-review/examples/valid/plan.json +19 -0
  129. package/agent-template/.ai/blueprints/security-review/gates.yaml +22 -0
  130. package/agent-template/.ai/blueprints/security-review/input.schema.json +20 -0
  131. package/agent-template/.ai/blueprints/security-review/plan.schema.json +65 -0
  132. package/agent-template/.ai/blueprints/security-review/required-files.yaml +6 -0
  133. package/agent-template/.ai/blueprints/security-review/spec-requirements.yaml +9 -0
  134. package/agent-template/.ai/blueprints/security-review/steps.yaml +38 -0
  135. package/agent-template/.ai/examples/README.md +8 -0
  136. package/agent-template/.ai/examples/bad/client-imports-server/README.md +20 -0
  137. package/agent-template/.ai/examples/bad/client-imports-server/api.ts +12 -0
  138. package/agent-template/.ai/examples/bad/missing-acl/README.md +23 -0
  139. package/agent-template/.ai/examples/bad/missing-acl/endpoints.ts +12 -0
  140. package/agent-template/.ai/examples/bad/tenant-from-body/README.md +19 -0
  141. package/agent-template/.ai/examples/bad/tenant-from-body/endpoints.ts +33 -0
  142. package/agent-template/.ai/examples/client-contribution/CustomerListView.tsrx +34 -0
  143. package/agent-template/.ai/examples/client-contribution/README.md +11 -0
  144. package/agent-template/.ai/examples/client-contribution/contribution.tsrx +48 -0
  145. package/agent-template/.ai/examples/client-contribution/index.ts +20 -0
  146. package/agent-template/.ai/examples/client-contribution/permissions.ts +8 -0
  147. package/agent-template/.ai/examples/customer-cli-extension/README.md +14 -0
  148. package/agent-template/.ai/examples/customer-cli-extension/commands.json +17 -0
  149. package/agent-template/.ai/examples/customer-cli-extension/index.ts +36 -0
  150. package/agent-template/.ai/examples/module-create/task-packet.json +11 -0
  151. package/agent-template/.ai/guides/application-development.md +97 -0
  152. package/agent-template/.ai/policies/capabilities.yaml +164 -0
  153. package/agent-template/.ai/policies/model-routing.yaml +72 -0
  154. package/agent-template/.ai/policies/path-ownership.yaml +65 -0
  155. package/agent-template/.ai/policies/task-budgets.yaml +37 -0
  156. package/agent-template/.ai/references/catalog/LICENSE +21 -0
  157. package/agent-template/.ai/references/catalog/migrations/0001_catalog_core.down.sql +2 -0
  158. package/agent-template/.ai/references/catalog/migrations/0001_catalog_core.up.sql +21 -0
  159. package/agent-template/.ai/references/catalog/migrations/0002_catalog_history.down.sql +3 -0
  160. package/agent-template/.ai/references/catalog/migrations/0002_catalog_history.up.sql +20 -0
  161. package/agent-template/.ai/references/catalog/migrations/0003_catalog_history_service_actors.down.sql +3 -0
  162. package/agent-template/.ai/references/catalog/migrations/0003_catalog_history_service_actors.up.sql +36 -0
  163. package/agent-template/.ai/references/catalog/migrations/0004_catalog_idempotency_ledger.down.sql +3 -0
  164. package/agent-template/.ai/references/catalog/migrations/0004_catalog_idempotency_ledger.up.sql +19 -0
  165. package/agent-template/.ai/references/catalog/migrations/README.md +3 -0
  166. package/agent-template/.ai/references/catalog/module.json +27 -0
  167. package/agent-template/.ai/references/catalog/package.json +49 -0
  168. package/agent-template/.ai/references/catalog/spec/module.yaml +86 -0
  169. package/agent-template/.ai/references/catalog/src/acl/permissions.ts +6 -0
  170. package/agent-template/.ai/references/catalog/src/agent/tools.ts +164 -0
  171. package/agent-template/.ai/references/catalog/src/api/endpoints.ts +243 -0
  172. package/agent-template/.ai/references/catalog/src/client/CatalogHistoryDrawer.tsrx +123 -0
  173. package/agent-template/.ai/references/catalog/src/client/CatalogItemForm.tsrx +190 -0
  174. package/agent-template/.ai/references/catalog/src/client/CatalogView.tsrx +473 -0
  175. package/agent-template/.ai/references/catalog/src/client/api.ts +111 -0
  176. package/agent-template/.ai/references/catalog/src/client/contribution.tsrx +61 -0
  177. package/agent-template/.ai/references/catalog/src/client/index.ts +18 -0
  178. package/agent-template/.ai/references/catalog/src/client/navigation-copy.ts +9 -0
  179. package/agent-template/.ai/references/catalog/src/client/state.ts +24 -0
  180. package/agent-template/.ai/references/catalog/src/domain/types.ts +32 -0
  181. package/agent-template/.ai/references/catalog/src/domain/variables.ts +111 -0
  182. package/agent-template/.ai/references/catalog/src/index.ts +31 -0
  183. package/agent-template/.ai/references/catalog/src/platform.ts +35 -0
  184. package/agent-template/.ai/references/catalog/src/server/index.ts +4 -0
  185. package/agent-template/.ai/references/catalog/src/server/runtime.ts +86 -0
  186. package/agent-template/.ai/references/catalog/src/services/catalog-service.ts +306 -0
  187. package/agent-template/.ai/references/catalog/src/services/database-repository.ts +440 -0
  188. package/agent-template/.ai/references/catalog/src/services/index.ts +4 -0
  189. package/agent-template/.ai/references/catalog/src/services/migration.ts +171 -0
  190. package/agent-template/.ai/references/catalog/src/services/repository.ts +36 -0
  191. package/agent-template/.ai/references/catalog/src/services/target-idempotency.ts +59 -0
  192. package/agent-template/.ai/references/catalog/tests/agent-tools.test.ts +277 -0
  193. package/agent-template/.ai/references/catalog/tests/endpoints.test.ts +320 -0
  194. package/agent-template/.ai/references/catalog/tests/idempotency.test.ts +297 -0
  195. package/agent-template/.ai/references/catalog/tests/migrations.test.ts +149 -0
  196. package/agent-template/.ai/references/catalog/tests/module.test.ts +271 -0
  197. package/agent-template/.ai/references/catalog/tests/support/database.ts +76 -0
  198. package/agent-template/.ai/references/catalog/translations/en.json +101 -0
  199. package/agent-template/.ai/references/catalog/translations/pl.json +101 -0
  200. package/agent-template/.ai/references/catalog/tsconfig.json +15 -0
  201. package/agent-template/.ai/references/catalog/vitest.config.ts +16 -0
  202. package/agent-template/.ai/references/catalog.provenance.json +55 -0
  203. package/agent-template/.ai/rules/flowdular.md +86 -0
  204. package/agent-template/.ai/skills/README.md +36 -0
  205. package/agent-template/.ai/skills/agent-tool-design/SKILL.md +209 -0
  206. package/agent-template/.ai/skills/auth-security-review/SKILL.md +96 -0
  207. package/agent-template/.ai/skills/auto-review/SKILL.md +112 -0
  208. package/agent-template/.ai/skills/bug-hunt/SKILL.md +110 -0
  209. package/agent-template/.ai/skills/business-agent-design/SKILL.md +188 -0
  210. package/agent-template/.ai/skills/cli-extension/SKILL.md +114 -0
  211. package/agent-template/.ai/skills/core-extend/SKILL.md +104 -0
  212. package/agent-template/.ai/skills/database-adapter/SKILL.md +204 -0
  213. package/agent-template/.ai/skills/database-adapter/references/first-run-and-matrix.md +105 -0
  214. package/agent-template/.ai/skills/migration-authoring/SKILL.md +167 -0
  215. package/agent-template/.ai/skills/module-new/SKILL.md +180 -0
  216. package/agent-template/.ai/skills/module-update/SKILL.md +100 -0
  217. package/agent-template/.ai/skills/perf-audit/SKILL.md +105 -0
  218. package/agent-template/.ai/skills/release-eject-pr/SKILL.md +113 -0
  219. package/agent-template/.ai/skills/spec-approval/SKILL.md +112 -0
  220. package/agent-template/.ai/skills/test-hardening/SKILL.md +86 -0
  221. package/agent-template/.ai/skills/translations-i18n/SKILL.md +85 -0
  222. package/agent-template/.ai/skills/ux-design/SKILL.md +97 -0
  223. package/agent-template/.ai/skills/variables/SKILL.md +164 -0
  224. package/agent-template/.ai/skills/workflow-development/SKILL.md +199 -0
  225. package/agent-template/.claude/skills/agent-tool-design/SKILL.md +203 -0
  226. package/agent-template/.claude/skills/auth-security-review/SKILL.md +90 -0
  227. package/agent-template/.claude/skills/auto-review/SKILL.md +103 -0
  228. package/agent-template/.claude/skills/bug-hunt/SKILL.md +104 -0
  229. package/agent-template/.claude/skills/business-agent-design/SKILL.md +182 -0
  230. package/agent-template/.claude/skills/cli-extension/SKILL.md +108 -0
  231. package/agent-template/.claude/skills/core-extend/SKILL.md +99 -0
  232. package/agent-template/.claude/skills/database-adapter/SKILL.md +198 -0
  233. package/agent-template/.claude/skills/database-adapter/references/first-run-and-matrix.md +105 -0
  234. package/agent-template/.claude/skills/migration-authoring/SKILL.md +161 -0
  235. package/agent-template/.claude/skills/module-new/SKILL.md +171 -0
  236. package/agent-template/.claude/skills/module-update/SKILL.md +91 -0
  237. package/agent-template/.claude/skills/perf-audit/SKILL.md +98 -0
  238. package/agent-template/.claude/skills/release-eject-pr/SKILL.md +107 -0
  239. package/agent-template/.claude/skills/spec-approval/SKILL.md +106 -0
  240. package/agent-template/.claude/skills/test-hardening/SKILL.md +79 -0
  241. package/agent-template/.claude/skills/translations-i18n/SKILL.md +78 -0
  242. package/agent-template/.claude/skills/ux-design/SKILL.md +92 -0
  243. package/agent-template/.claude/skills/variables/SKILL.md +156 -0
  244. package/agent-template/.claude/skills/workflow-development/SKILL.md +192 -0
  245. package/agent-template/AGENTS.md +77 -0
  246. package/agent-template/CLAUDE.md +77 -0
  247. package/agent-template/docs/adr/0001-development-reload.md +16 -0
  248. package/agent-template/docs/adr/0002-durable-agent-execution.md +21 -0
  249. package/agent-template/docs/adr/0003-module-settings.md +22 -0
  250. package/agent-template/docs/adr/0004-enterprise-access-and-audit.md +36 -0
  251. package/agent-template/docs/adr/0005-sandbox-runtime-and-coding-agents.md +81 -0
  252. package/agent-template/docs/adr/0006-agentic-workflows.md +1702 -0
  253. package/agent-template/docs/adr/0007-module-owned-agents.md +429 -0
  254. package/agent-template/docs/adr/0008-database-adapter-contract.md +90 -0
  255. package/agent-template/docs/agent-contract.md +45 -0
  256. package/agent-template/docs/configuration.md +122 -0
  257. package/agent-template/docs/database-adapters.md +346 -0
  258. package/agent-template/docs/design-system.md +217 -0
  259. package/agent-template/docs/modules.md +146 -0
  260. package/agent-template/platform/scripts/build.mjs +38 -0
  261. package/agent-template/rulesync.jsonc +11 -0
  262. package/dist/bin.js +3 -1
  263. package/package.json +3 -2
  264. package/template/default/.prettierignore +9 -0
  265. package/template/default/README.md +12 -0
  266. package/template/default/flowdular.json +3 -3
  267. package/template/default/modules/example/package.json +1 -1
  268. package/template/default/package.json +6 -2
  269. package/template/default/platform/octane.config.ts +17 -6
  270. package/template/default/platform/package.json +3 -2
  271. package/template/default/platform/scripts/dev.mjs +39 -6
@@ -0,0 +1,76 @@
1
+ import type { DatabaseHandle, DatabaseProvider } from '@flowdular/sdk/database';
2
+ import { createTestDatabaseProvider } from '@flowdular/sdk/database-testing';
3
+ import {
4
+ DatabaseCatalogRepository,
5
+ migrateCatalogDatabase,
6
+ } from '../../src/services/database-repository.ts';
7
+
8
+ const TENANT_TABLES = [
9
+ 'catalog_items',
10
+ 'catalog_items_history',
11
+ 'catalog_items_history_v2',
12
+ 'catalog_idempotency_ledger',
13
+ ];
14
+
15
+ export interface CatalogTestDatabase {
16
+ readonly provider: DatabaseProvider;
17
+ readonly runtime: DatabaseHandle;
18
+ readonly repository: DatabaseCatalogRepository;
19
+ dispose(): Promise<void>;
20
+ }
21
+
22
+ /* Booting an embedded PostgreSQL costs about two seconds, so a test file shares
23
+ one migrated cluster and every fixture starts from truncated tables instead.
24
+ Call closeCatalogTestDatabases() from the file's afterAll. */
25
+ let shared: Promise<DatabaseProvider> | undefined;
26
+
27
+ /** The file's migrated provider, with every catalog table emptied. */
28
+ export async function catalogTestProvider(): Promise<DatabaseProvider> {
29
+ shared ??= (async () => {
30
+ const provider = createTestDatabaseProvider();
31
+ const lease = await provider.acquire({
32
+ namespace: 'catalog.core',
33
+ purpose: 'migration',
34
+ });
35
+ try {
36
+ await migrateCatalogDatabase(lease.database);
37
+ } finally {
38
+ await lease.release();
39
+ }
40
+ return provider;
41
+ })();
42
+ const provider = await shared;
43
+ const migration = await provider.acquire({
44
+ namespace: 'catalog.core',
45
+ purpose: 'migration',
46
+ });
47
+ try {
48
+ await migration.database.execute({
49
+ text: `TRUNCATE ${TENANT_TABLES.join(', ')} RESTART IDENTITY CASCADE`,
50
+ });
51
+ } finally {
52
+ await migration.release();
53
+ }
54
+ return provider;
55
+ }
56
+
57
+ /** An empty catalog database with a tenant-scoped runtime handle. */
58
+ export async function createCatalogTestDatabase(): Promise<CatalogTestDatabase> {
59
+ const provider = await catalogTestProvider();
60
+ const lease = await provider.acquire({
61
+ namespace: 'catalog.core',
62
+ purpose: 'test',
63
+ });
64
+ return {
65
+ provider,
66
+ runtime: lease.database,
67
+ repository: new DatabaseCatalogRepository(lease.database),
68
+ dispose: () => lease.release(),
69
+ };
70
+ }
71
+
72
+ export async function closeCatalogTestDatabases(): Promise<void> {
73
+ const provider = shared;
74
+ shared = undefined;
75
+ if (provider) await (await provider).dispose();
76
+ }
@@ -0,0 +1,101 @@
1
+ {
2
+ "module.name": "Product Catalog Core",
3
+ "nav.description": "Products and services",
4
+ "nav.label": "Catalog",
5
+ "drawer.subtitle": "Product or service",
6
+ "drawer.title": "New catalog item",
7
+ "drawer.editTitle": "Edit catalog item",
8
+ "action.edit": "Edit",
9
+ "action.history": "History",
10
+ "delete.title": "Delete catalog item",
11
+ "delete.description": "Delete {name} permanently? This cannot be undone.",
12
+ "delete.drawerDescription": "This permanently removes the archived catalog item.",
13
+ "delete.confirm": "Delete item",
14
+ "error.create": "Could not create the catalog item.",
15
+ "error.update": "Could not update the catalog item.",
16
+ "error.lifecycle": "Could not change the catalog item lifecycle.",
17
+ "error.delete": "Could not delete the catalog item.",
18
+ "error.history": "Could not load catalog item history.",
19
+ "error.load": "Could not load catalog items.",
20
+ "error.request": "The catalog operation failed.",
21
+ "form.cancel": "Cancel",
22
+ "form.currency": "Currency",
23
+ "form.kind": "Kind",
24
+ "form.name": "Name",
25
+ "form.note": "The SKU is tenant-scoped and cannot change later.",
26
+ "form.editNote": "SKU is tenant-scoped and cannot change after creation.",
27
+ "form.price": "Price, minor units",
28
+ "form.priceHelp": "1000 is 10.00 in the currency below.",
29
+ "form.sku": "SKU",
30
+ "form.submit": "Create item",
31
+ "form.submitting": "Creating…",
32
+ "form.save": "Save changes",
33
+ "form.saving": "Saving…",
34
+ "form.unit": "Unit",
35
+ "kind.product": "Product",
36
+ "kind.service": "Service",
37
+ "status.active": "Active",
38
+ "status.archived": "Archived",
39
+ "filters.label": "Filters",
40
+ "filters.includeArchived": "Include archived items",
41
+ "lifecycle.title": "Lifecycle",
42
+ "lifecycle.description": "Archive an item before deleting it permanently.",
43
+ "lifecycle.history": "View history",
44
+ "lifecycle.archive": "Archive item",
45
+ "lifecycle.restore": "Restore item",
46
+ "lifecycle.delete": "Delete item",
47
+ "page.action.new": "New item",
48
+ "page.action.refresh": "Refresh",
49
+ "page.description": "Products and services with stable tenant-scoped SKUs.",
50
+ "page.eyebrow": "Commercial master data",
51
+ "page.title": "Catalog",
52
+ "price.fallback": "{amount} {currency} minor",
53
+ "table.caption": "Catalog items",
54
+ "table.column.item": "Item",
55
+ "table.column.kind": "Kind",
56
+ "table.column.price": "Price",
57
+ "table.column.status": "Status",
58
+ "table.column.actions": "Actions",
59
+ "table.count.one": "1 item",
60
+ "table.count.other": "items: {count}",
61
+ "table.empty.hint": "Create the first product or service.",
62
+ "table.empty.title": "No catalog items yet",
63
+ "table.emptyFiltered.hint": "No item in this workspace matches the current filter.",
64
+ "table.emptyFiltered.title": "No matching items",
65
+ "table.loading": "Loading catalog items…",
66
+ "table.search.label": "Filter catalog items",
67
+ "table.search.placeholder": "Filter by name or SKU",
68
+ "table.title": "Products & services",
69
+ "history.title": "Item history",
70
+ "history.tableTitle": "Revisions",
71
+ "history.count": "{count} revisions",
72
+ "history.caption": "Catalog item revision history",
73
+ "history.loading": "Loading item history…",
74
+ "history.emptyTitle": "No revisions yet",
75
+ "history.emptyHint": "Changes to this item appear here.",
76
+ "history.emptyValue": "Empty",
77
+ "history.column.version": "Version",
78
+ "history.column.action": "Action",
79
+ "history.column.actor": "Actor",
80
+ "history.column.changes": "Changes",
81
+ "history.column.date": "Date",
82
+ "history.action.created": "Created",
83
+ "history.action.updated": "Updated",
84
+ "history.action.archived": "Archived",
85
+ "history.action.restored": "Restored",
86
+ "history.action.deleted": "Deleted",
87
+ "history.actor.user": "User",
88
+ "history.actor.agent": "Agent",
89
+ "history.actor.service": "Service",
90
+ "history.actor.serviceConfiguredBy": "Service, configured by {name}",
91
+ "history.field.sku": "SKU",
92
+ "history.field.name": "Name",
93
+ "history.field.kind": "Kind",
94
+ "history.field.unit": "Unit",
95
+ "history.field.basePriceMinor": "Price",
96
+ "history.field.currency": "Currency",
97
+ "history.field.status": "Status",
98
+ "widget.label": "Catalog items",
99
+ "widget.link": "Open catalog",
100
+ "widget.note": "Active catalog entries with tenant-scoped SKUs."
101
+ }
@@ -0,0 +1,101 @@
1
+ {
2
+ "module.name": "Katalog produktów i usług",
3
+ "nav.description": "Produkty i usługi",
4
+ "nav.label": "Katalog",
5
+ "drawer.subtitle": "Produkt lub usługa",
6
+ "drawer.title": "Nowa pozycja katalogu",
7
+ "drawer.editTitle": "Edytuj pozycję katalogu",
8
+ "action.edit": "Edytuj",
9
+ "action.history": "Historia",
10
+ "delete.title": "Usuń pozycję katalogu",
11
+ "delete.description": "Usunąć trwale pozycję {name}? Tej operacji nie można cofnąć.",
12
+ "delete.drawerDescription": "Ta operacja trwale usuwa zarchiwizowaną pozycję katalogu.",
13
+ "delete.confirm": "Usuń pozycję",
14
+ "error.create": "Nie udało się utworzyć pozycji katalogu.",
15
+ "error.update": "Nie udało się zaktualizować pozycji katalogu.",
16
+ "error.lifecycle": "Nie udało się zmienić cyklu życia pozycji katalogu.",
17
+ "error.delete": "Nie udało się usunąć pozycji katalogu.",
18
+ "error.history": "Nie udało się wczytać historii pozycji katalogu.",
19
+ "error.load": "Nie udało się wczytać pozycji katalogu.",
20
+ "error.request": "Operacja na katalogu nie powiodła się.",
21
+ "form.cancel": "Anuluj",
22
+ "form.currency": "Waluta",
23
+ "form.kind": "Rodzaj",
24
+ "form.name": "Nazwa",
25
+ "form.note": "SKU obowiązuje w tej przestrzeni roboczej i później nie da się go zmienić.",
26
+ "form.editNote": "SKU obowiązuje w tej przestrzeni roboczej i nie można go zmienić po utworzeniu.",
27
+ "form.price": "Cena w groszach",
28
+ "form.priceHelp": "1000 to 10,00 w wybranej niżej walucie.",
29
+ "form.sku": "SKU",
30
+ "form.submit": "Utwórz pozycję",
31
+ "form.submitting": "Tworzenie…",
32
+ "form.save": "Zapisz zmiany",
33
+ "form.saving": "Zapisywanie…",
34
+ "form.unit": "Jednostka",
35
+ "kind.product": "Produkt",
36
+ "kind.service": "Usługa",
37
+ "status.active": "Aktywna",
38
+ "status.archived": "Zarchiwizowana",
39
+ "filters.label": "Filtry",
40
+ "filters.includeArchived": "Pokaż zarchiwizowane pozycje",
41
+ "lifecycle.title": "Cykl życia",
42
+ "lifecycle.description": "Zarchiwizuj pozycję przed jej trwałym usunięciem.",
43
+ "lifecycle.history": "Zobacz historię",
44
+ "lifecycle.archive": "Archiwizuj pozycję",
45
+ "lifecycle.restore": "Przywróć pozycję",
46
+ "lifecycle.delete": "Usuń pozycję",
47
+ "page.action.new": "Nowa pozycja",
48
+ "page.action.refresh": "Odśwież",
49
+ "page.description": "Produkty i usługi ze stałym SKU w obrębie przestrzeni roboczej.",
50
+ "page.eyebrow": "Dane podstawowe sprzedaży",
51
+ "page.title": "Katalog",
52
+ "price.fallback": "{amount} {currency} w groszach",
53
+ "table.caption": "Pozycje katalogu",
54
+ "table.column.item": "Pozycja",
55
+ "table.column.kind": "Rodzaj",
56
+ "table.column.price": "Cena",
57
+ "table.column.status": "Status",
58
+ "table.column.actions": "Akcje",
59
+ "table.count.one": "1 pozycja",
60
+ "table.count.other": "pozycje: {count}",
61
+ "table.empty.hint": "Dodaj pierwszy produkt lub usługę.",
62
+ "table.empty.title": "Nie ma jeszcze pozycji katalogu",
63
+ "table.emptyFiltered.hint": "Żadna pozycja w tej przestrzeni roboczej nie pasuje do filtra.",
64
+ "table.emptyFiltered.title": "Brak pasujących pozycji",
65
+ "table.loading": "Wczytywanie pozycji katalogu…",
66
+ "table.search.label": "Filtruj pozycje katalogu",
67
+ "table.search.placeholder": "Filtruj po nazwie lub SKU",
68
+ "table.title": "Produkty i usługi",
69
+ "history.title": "Historia pozycji",
70
+ "history.tableTitle": "Wersje",
71
+ "history.count": "Liczba wersji: {count}",
72
+ "history.caption": "Historia zmian pozycji katalogu",
73
+ "history.loading": "Wczytywanie historii pozycji…",
74
+ "history.emptyTitle": "Brak wersji",
75
+ "history.emptyHint": "Zmiany tej pozycji pojawią się tutaj.",
76
+ "history.emptyValue": "Puste",
77
+ "history.column.version": "Wersja",
78
+ "history.column.action": "Akcja",
79
+ "history.column.actor": "Aktor",
80
+ "history.column.changes": "Zmiany",
81
+ "history.column.date": "Data",
82
+ "history.action.created": "Utworzono",
83
+ "history.action.updated": "Zmieniono",
84
+ "history.action.archived": "Zarchiwizowano",
85
+ "history.action.restored": "Przywrócono",
86
+ "history.action.deleted": "Usunięto",
87
+ "history.actor.user": "Użytkownik",
88
+ "history.actor.agent": "Agent",
89
+ "history.actor.service": "Usługa",
90
+ "history.actor.serviceConfiguredBy": "Usługa skonfigurowana przez: {name}",
91
+ "history.field.sku": "SKU",
92
+ "history.field.name": "Nazwa",
93
+ "history.field.kind": "Rodzaj",
94
+ "history.field.unit": "Jednostka",
95
+ "history.field.basePriceMinor": "Cena",
96
+ "history.field.currency": "Waluta",
97
+ "history.field.status": "Status",
98
+ "widget.label": "Pozycje katalogu",
99
+ "widget.link": "Otwórz katalog",
100
+ "widget.note": "Aktywne pozycje katalogu z SKU w obrębie przestrzeni roboczej."
101
+ }
@@ -0,0 +1,15 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "target": "ESNext",
5
+ "module": "ESNext",
6
+ "moduleResolution": "Bundler",
7
+ "allowImportingTsExtensions": true,
8
+ "isolatedModules": true,
9
+ "jsx": "react-jsx",
10
+ "jsxImportSource": "octane",
11
+ "types": ["node"],
12
+ "plugins": [{ "name": "@tsrx/typescript-plugin" }]
13
+ },
14
+ "include": ["src/**/*", "tests/**/*.ts"]
15
+ }
@@ -0,0 +1,16 @@
1
+ import { defineConfig } from 'vitest/config';
2
+
3
+ /* Booting the embedded PostgreSQL a suite runs against takes seconds under
4
+ parallel load, well past the 5s vitest default.
5
+
6
+ Deliberately self-contained. A sandbox session copies this module into its
7
+ own workspace and runs these gates there, so importing a shared preset from
8
+ another workspace package would leave vitest unable to load its config in
9
+ that copy. The duplication is the price of that isolation; keep it. */
10
+ export default defineConfig({
11
+ test: {
12
+ maxWorkers: 2,
13
+ testTimeout: 30_000,
14
+ hookTimeout: 30_000,
15
+ },
16
+ });
@@ -0,0 +1,55 @@
1
+ {
2
+ "id": "catalog.core",
3
+ "version": "0.6.1",
4
+ "repository": "Flowdular/official-modules",
5
+ "sourceCommit": "8ed1e780ba7405d0bdf5082882b92d130b72d081",
6
+ "artifactSha256": "9010086822aa5f4d13176e465022fd2118c5dd0cb157200b31c2940fec1f3513",
7
+ "files": {
8
+ "LICENSE": "155d722071bad9d0d832482e06fd5a47f7034389cb63aabcb39f4282aa3499fc",
9
+ "migrations/0001_catalog_core.down.sql": "0962a1edf0bde959cd4facccf77bd5b634d6cc25f125a0c79a61770c8871093f",
10
+ "migrations/0001_catalog_core.up.sql": "602ed9c1852b729cf278cf8536f79e3f7432f23a5a60c50d8826f5c1b9442d18",
11
+ "migrations/0002_catalog_history.down.sql": "7f163e11ca9033101e3bb1de61481b1a8043c204e65aa2bb508a13b065e98c78",
12
+ "migrations/0002_catalog_history.up.sql": "3aa30993b1676cf357c2ef87f19a7d4b64b77041c0e4bc743fced04521471c28",
13
+ "migrations/0003_catalog_history_service_actors.down.sql": "f20ecc8d7d753af3d2b6fdbff9d637fd938884cfbd88b08a30958e6aa000132b",
14
+ "migrations/0003_catalog_history_service_actors.up.sql": "7caae787ca2fc1e331ccbfda4df5982beec76136e8dc486aab5532ccd338a722",
15
+ "migrations/0004_catalog_idempotency_ledger.down.sql": "8ba72d8edc4d25ecf6d041888cf321690c25afdaf3723812ddd7d391d75370aa",
16
+ "migrations/0004_catalog_idempotency_ledger.up.sql": "41e86ba2051159c6cc9672bfae17c1d02051da975f1c43c566a2b66592673cb0",
17
+ "migrations/README.md": "2a15fd001713c2552a3c82b186246aa5fec136f43143cc2d9aa15bd491a09d41",
18
+ "module.json": "66afd7635404b565e8b86f7c5bc485c85c9d568144858bfcff8a4a9429f76081",
19
+ "package.json": "08b76b72f6fd7a8e3b08113c135899f6010b5fbbea8ca6be0b68b599afe75dad",
20
+ "spec/module.yaml": "2df3b7c2cbd20f5f5950b469b092f85ef140875bf789a69da04fb6dc68ae0ff8",
21
+ "src/acl/permissions.ts": "3375521a5a229736ffac5a948140ec347dc7a7e4fba80e778c0baaf9e0622590",
22
+ "src/agent/tools.ts": "3204d20886d2b864482adc1ed3303c653aebd207e16c4fce0c67a4979ea8db07",
23
+ "src/api/endpoints.ts": "34f1036e759353550be2acf67c6fa254afc790942d09489db2e76a082df5c3a3",
24
+ "src/client/CatalogHistoryDrawer.tsrx": "6cdba5249be81e70da703cb34c1a2210943ce5e5fb596ee77cf7952e2acf3ee3",
25
+ "src/client/CatalogItemForm.tsrx": "7dafa4149975d9e7d5784c8a5391b5b64c2405991aaead713d94b61c41168c2c",
26
+ "src/client/CatalogView.tsrx": "7c507931f33afea8414b002e3ad815740c8db75016c53d8a81effc6427bd958d",
27
+ "src/client/api.ts": "5f404f6b25777bc8fe2eab5a35424593abc8e879fb83fa2ae4d637fc23fdce4b",
28
+ "src/client/contribution.tsrx": "e95f755882005ee090c99a119ce2dda2ec70420daed4ce06021193905858c62f",
29
+ "src/client/index.ts": "03eb0664cdafccb66cb25f2e1b07e6959c2dfa9bdbfffc3e7edf9b535ba4949a",
30
+ "src/client/navigation-copy.ts": "9a8757e64f4001a93e2bc2861c686a19f791f9d67a396d9e658023b1ec4cea8f",
31
+ "src/client/state.ts": "bc054bc269026b6abf60d99a2fc5dd94eb8a488fc1ce4c81a1ae1065d9db576b",
32
+ "src/domain/types.ts": "4b26be80954d792b09a3a34d29d845b9f6119640be505daba325fec820e06ef6",
33
+ "src/domain/variables.ts": "131130e57838235b1f3fcb799da44baeae16522bb346d522827e022305c110b5",
34
+ "src/index.ts": "5b27943018db9a18651d62add7d6f8397d7c492a204381fae74547b99b91990d",
35
+ "src/platform.ts": "3bdc15a5749cceeca4e86388fad13aebcbc151bb4226852d46ed7845248c4efe",
36
+ "src/server/index.ts": "90eae107d863418124e5d10c4d1fe8a119bd14da605b36de708c18d8500c4b5e",
37
+ "src/server/runtime.ts": "5f4389a6adf8265f6737c489baf686f63cc3550662103d28b2da9800dd9f5b63",
38
+ "src/services/catalog-service.ts": "e5ffa703f6a87e4e2e762f5beb87952be40b3b5847d10b373033a9b01fa4a378",
39
+ "src/services/database-repository.ts": "b513a9459fb3fc1362e9dcd98c10a104b02dbb748ae23c59c6768c2f0e7a1466",
40
+ "src/services/index.ts": "a08aefe5101814538666f861536287fc382e6c655d62ba9b9ef4bbfbc6ede4af",
41
+ "src/services/migration.ts": "89c8e333482c80bc819deba0cf4f4e37e94137933af0f6503f4f9ebcb4f5f371",
42
+ "src/services/repository.ts": "df0f1364cb05031972993c873faf6bcb7fbe4c92d05a04ae980497d9a732dd7f",
43
+ "src/services/target-idempotency.ts": "7111b56a30b691eaaaa64f5691895ac94b6e0735b0079794835bbbeba5102cb0",
44
+ "tests/agent-tools.test.ts": "3cdda30b5454d58c6e8791a98e3daf6fe58b9852cd5c437b3614c3f6123baa91",
45
+ "tests/endpoints.test.ts": "24d05c7dd52820f90c777a1b814529f5188a9a5a9daeaacda07314f17b7483cc",
46
+ "tests/idempotency.test.ts": "f2e0896635bcd95271b66181daa2c084411913cdf864ae8b4814f2beeb8c2943",
47
+ "tests/migrations.test.ts": "47d3d741eddde8677be287730d2f96af556b4b7bf0d8378f9a12a7309af17d78",
48
+ "tests/module.test.ts": "01bedfa1540470cc87c808c75120f6ede7c3b8e3d81e340d2076af0a66f1c7ab",
49
+ "tests/support/database.ts": "f108cf6390da7669f8935301fac125a7e5653f06ba75327f4bdc28fdd409ba73",
50
+ "translations/en.json": "406a40b77e3778e83cd4d30e7b3aee8f89c75baf7bc52f1befc6d16f3b877ab3",
51
+ "translations/pl.json": "db6325b4980d978e1a3098758b5259a68e32469baa09d194b9d6746462776d27",
52
+ "tsconfig.json": "140bb4775df421146563d13d2f78ff74cb3c2decab6737db32938339248a92ba",
53
+ "vitest.config.ts": "d13725b13c3712ec91c1646e9226fb172eec2599f72f4e6608bece9912e2bd81"
54
+ }
55
+ }
@@ -0,0 +1,86 @@
1
+ ---
2
+ root: true
3
+ targets:
4
+ - '*'
5
+ globs:
6
+ - '**/*'
7
+ description: Flowdular agent contract
8
+ ---
9
+
10
+ <!-- Source: .ai/rules/flowdular.md. Run pnpm rules:generate; never edit generated copies. -->
11
+
12
+ # Flowdular
13
+
14
+ An agentic foundation that businesses extend with their own modules.
15
+
16
+ ## One task, one skill
17
+
18
+ Choose the most specific task in `.ai/skills/README.md` and read only that
19
+ `.ai/skills/<name>/SKILL.md`. Announce the choice briefly. For a multi-part
20
+ request, finish one bounded phase before switching skills. Do not recursively
21
+ load other skills mentioned by a skill. Read referenced code or documentation
22
+ only when the current task needs it. Explicit user instructions take priority.
23
+
24
+ Sandbox: use the single skill named under Session, at
25
+ `reference/skills/<name>/SKILL.md`. Follow the role's write paths and handoff list.
26
+ Do not load the whole skill catalog into the task context.
27
+
28
+ ## Always-active invariants
29
+
30
+ 1. Stay within the requested scope. Preserve other agents' edits. Read the owning
31
+ code before changing it. Do not invent missing business decisions.
32
+ 2. Spec-first: a new module requires an approved `spec/module.yaml`. Sandbox
33
+ implementation requires operator approval of the exact current spec hash;
34
+ any spec change invalidates it. Never infer or grant approval yourself.
35
+ Only explicit user approval naming a spec permits the host `spec-approval` action.
36
+ 3. Deny by default. Use `defineEndpoint`, an explicit permission and identity
37
+ resolver. Mutations enforce CSRF and bounded input validation.
38
+ 4. Tenant identity comes from the authenticated principal, never request input.
39
+ Use bound SQL, tenant predicates and `transaction(..., { tenantId, access })`.
40
+ Tenant tables enforce RLS with `USING` and `WITH CHECK`. Runtime roles have
41
+ neither superuser nor `BYPASSRLS`; migration leases are for DDL only.
42
+ 5. Never expose credentials in output, logs or audit. Cross-module access uses
43
+ declared public capabilities or registered tools, never another module's DB.
44
+ Agent instructions cannot expand permissions or tool grants.
45
+ 6. Persist background work before acknowledging it. Preserve idempotency,
46
+ leases, recovery and audit evidence. Drain async work before releasing resources.
47
+ 7. Applied migrations are immutable. Add numbered PostgreSQL SQL and mirror it
48
+ byte for byte in `databaseMigrations`. Never bypass checksum or adoption checks.
49
+ 8. Generated composition is CLI-owned: `platform/octane.config.ts`,
50
+ `platform/src/App.tsrx`, `platform/src/generated/**`, platform package
51
+ dependencies and `flowdular.json` enabled modules. Use `module enable/sync --apply`.
52
+ Declare imports and dependencies; keep module, package and spec versions aligned.
53
+ 9. Use shared `@flowdular/sdk/ui` components and tokens. Keep all locales in sync.
54
+ UI states: loading, empty, error, populated, denied. Inspect rendered UI after changes.
55
+ 10. Prove fixes with regression tests. Never skip assertions, weaken isolation or
56
+ hide errors to make gates green. Run scoped checks, then `pnpm verify` before a PR.
57
+ Finish implementation, then run the `auto-review` skill as a separate phase
58
+ before completion or delivery. Report actual results and remaining failures.
59
+ 11. Destructive actions require the runner's flags and explicit scope.
60
+ `setup quick` and `auth greenfield` are local resets: preview, stop the app,
61
+ never target a custom or deployed DB. Sandbox agents cannot install, use
62
+ network/git, or touch a DB outside their module tests.
63
+ 12. Keep handoffs short and factual. No AI attribution footers or em/en dashes.
64
+ Sandbox final line: `HANDOFF: <allowed-role> - <why>` or
65
+ `HANDOFF: none - <why>`, never your own role.
66
+
67
+ Detailed recipes: `docs/agent-contract.md` (lookup only).
68
+ Reference module: `.ai/references/catalog`; visual contract: `docs/design-system.md`.
69
+
70
+ ## Application workspace
71
+
72
+ For application work, use the path and task map in
73
+ .ai/guides/application-development.md.
74
+
75
+ This is a generated application consuming the published Flowdular SDK. Extend
76
+ this application's modules; never edit installed dependencies. Upstream paths
77
+ such as packages/server and core modules/auth refer to the read-only SDK under
78
+ platform/node_modules/@flowdular/sdk after installation. Sandbox implementation
79
+ sources belong to the separate @flowdular/sandbox package. A core change must be
80
+ made in the Flowdular repository and released before this application uses it.
81
+
82
+ The skills and examples use @flowdular/sdk subpath imports. For pnpm --filter,
83
+ read the actual module package name from its package.json. Use pnpm verify and
84
+ pnpm build for this application. Root .ai files are editable project guidance;
85
+ run pnpm rules:generate after changing rules or skills, then pnpm rules:check.
86
+ AGENTS.md, CLAUDE.md, .agents/skills and .claude/skills are generated copies.
@@ -0,0 +1,36 @@
1
+ # Skills
2
+
3
+ Flowdular is an agentic foundation framework: the platform is the foundation, and these skills are how a coding agent (a sandbox specialist or your own tool) builds on it correctly. Each `SKILL.md` is a procedure plus pitfalls, verified against the code it cites, with front matter `name` (equals the directory), `description`, `roles` (who reads it) and `when` (one line).
4
+
5
+ | Skill | One line |
6
+ | ----------------------- | --------------------------------------------------------------------------------------------------------------------- |
7
+ | `module-new` | Create a module from an approved spec: scaffold, what the scaffold lacks, server and client file sets, enable, grant. |
8
+ | `module-update` | Change an existing module with a fixed touch list per change class and the version bump rules. |
9
+ | `spec-approval` | Record explicit user approval of an exact current module spec without letting an agent approve its own work. |
10
+ | `auto-review` | Review finished changes against requirements, contracts and regression evidence before delivery. |
11
+ | `core-extend` | Change a platform package without breaking modules, generated files, or the copies sandbox sessions read. |
12
+ | `bug-hunt` | Reproduce with the gate runner, map the symptom to its layer, fix there with a failing test, hunt siblings. |
13
+ | `perf-audit` | Hot paths of server, client, bundle and agent runtime; measure before changing anything. |
14
+ | `ux-design` | The record-screen recipe, five states, component and class inventory, icon keys, copy rules. |
15
+ | `auth-security-review` | Endpoint threat surface, scope model, API tokens, secrets, greps, destructive CLI rules, required tests. |
16
+ | `test-hardening` | Where tests run, the route recipe, the embedded PostgreSQL provider, required cases, break-the-implementation check. |
17
+ | `migration-authoring` | Numbered SQL, byte-identical constants, the checksum ledger, safe adoption, and immutable applied migrations. |
18
+ | `database-adapter` | Build a repository on the async provider contract: PostgreSQL SQL, provider leases, forced RLS, isolation tests. |
19
+ | `translations-i18n` | Live module bundles, fully qualified keys, locale-aware formatting, parity checks, and raw-key diagnosis. |
20
+ | `cli-extension` | Module CLI commands through `commands.json` and `defineCliExtension`, with the runner's approval rules. |
21
+ | `agent-tool-design` | Register module tools through the live composition registry with tenant, permission, input, output, and audit bounds. |
22
+ | `business-agent-design` | Ship a module-owned business agent with an exact tool ceiling, tenant binding, revisions, and access tests. |
23
+ | `variables` | Variable-aware fields and templates: the `{{ }}` contract, the scope mask, server-side resolution, adding a source. |
24
+ | `workflow-development` | Build, publish, invoke, simulate, and test typed durable workflows and their module integration capability. |
25
+ | `release-eject-pr` | Sandbox eject sequence, repository gates, branch and PR conventions, post-merge scope grant. |
26
+
27
+ Choose one skill per task phase: the most specific matching entry above. For ordinary module work use `module-new` or `module-update`. Finish the phase before switching; do not recursively load other SKILL.md files mentioned in a skill. Consult relevant code and supporting references only as needed. `spec-approval` is host-only and requires an explicit user approval instruction.
28
+
29
+ Where they are read:
30
+
31
+ - Sandbox: copies are available in `reference/skills/`, but each turn receives exactly one Task skill selected by role, blueprint and request. An explicit `$skill-name` takes precedence only if installed and eligible for that role. Missing matches never load the whole catalog.
32
+ - Claude Code: RuleSync generates `.claude/skills` from this directory.
33
+ - Codex: RuleSync generates `.agents/skills` from this directory.
34
+ - Other tools: use the canonical skill here or add another RuleSync target in `rulesync.jsonc`.
35
+
36
+ Adding a skill: create `.ai/skills/<kebab-name>/SKILL.md` with the four front matter keys, keep the instructions focused, cite the owning code, add a row above and update the sandbox routing when applicable. Run `pnpm rules:generate` after formatting. `pnpm rules:check` verifies every generated copy.