create-flowdular 0.4.1 → 0.5.1

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 (66) hide show
  1. package/README.md +9 -6
  2. package/agent-template/.agents/skills/auth-security-review/SKILL.md +1 -1
  3. package/agent-template/.agents/skills/bug-hunt/SKILL.md +1 -1
  4. package/agent-template/.agents/skills/module-new/SKILL.md +20 -19
  5. package/agent-template/.agents/skills/module-update/SKILL.md +4 -2
  6. package/agent-template/.agents/skills/spec-interview/SKILL.md +21 -20
  7. package/agent-template/.agents/skills/ux-design/SKILL.md +24 -2
  8. package/agent-template/.ai/README.md +5 -3
  9. package/agent-template/.ai/agents/README.md +1 -1
  10. package/agent-template/.ai/agents/sandbox/agentic-engineer.md +1 -0
  11. package/agent-template/.ai/agents/sandbox/backend-engineer.md +1 -0
  12. package/agent-template/.ai/agents/sandbox/frontend-engineer.md +1 -0
  13. package/agent-template/.ai/blueprints/add-migration/README.md +1 -1
  14. package/agent-template/.ai/examples/bad/client-imports-server/README.md +1 -1
  15. package/agent-template/.ai/examples/bad/missing-acl/README.md +1 -1
  16. package/agent-template/.ai/examples/bad/tenant-from-body/README.md +1 -1
  17. package/agent-template/.ai/guides/application-development.md +7 -5
  18. package/agent-template/.ai/platform-capabilities.md +10 -4
  19. package/agent-template/.ai/policies/capabilities.yaml +1 -0
  20. package/agent-template/.ai/policies/task-budgets.yaml +1 -1
  21. package/agent-template/.ai/rules/flowdular.md +3 -2
  22. package/agent-template/.ai/skills/auth-security-review/SKILL.md +1 -1
  23. package/agent-template/.ai/skills/bug-hunt/SKILL.md +1 -1
  24. package/agent-template/.ai/skills/module-new/SKILL.md +20 -19
  25. package/agent-template/.ai/skills/module-update/SKILL.md +4 -2
  26. package/agent-template/.ai/skills/spec-interview/SKILL.md +21 -20
  27. package/agent-template/.ai/skills/ux-design/SKILL.md +24 -2
  28. package/agent-template/.ai/subagents/module-executor.md +25 -0
  29. package/agent-template/.ai/subagents/reviewer.md +23 -0
  30. package/agent-template/.ai/subagents/spec-author.md +23 -0
  31. package/agent-template/.claude/agents/module-executor.md +22 -0
  32. package/agent-template/.claude/agents/reviewer.md +24 -0
  33. package/agent-template/.claude/agents/spec-author.md +20 -0
  34. package/agent-template/.claude/skills/auth-security-review/SKILL.md +1 -1
  35. package/agent-template/.claude/skills/bug-hunt/SKILL.md +1 -1
  36. package/agent-template/.claude/skills/module-new/SKILL.md +20 -19
  37. package/agent-template/.claude/skills/module-update/SKILL.md +4 -2
  38. package/agent-template/.claude/skills/spec-interview/SKILL.md +21 -20
  39. package/agent-template/.claude/skills/ux-design/SKILL.md +24 -2
  40. package/agent-template/.codex/agents/module-executor.toml +17 -0
  41. package/agent-template/.codex/agents/reviewer.toml +14 -0
  42. package/agent-template/.codex/agents/spec-author.toml +15 -0
  43. package/agent-template/AGENTS.md +3 -2
  44. package/agent-template/CLAUDE.md +3 -2
  45. package/agent-template/docs/cli.md +3 -0
  46. package/agent-template/docs/configuration.md +44 -0
  47. package/agent-template/docs/design-system.md +10 -3
  48. package/agent-template/docs/module-web-surfaces.md +31 -3
  49. package/agent-template/docs/modules.md +6 -0
  50. package/agent-template/docs/sandbox.md +117 -6
  51. package/agent-template/rulesync.jsonc +1 -1
  52. package/dist/bin.js +9 -0
  53. package/package.json +2 -2
  54. package/template/default/.env.example +7 -0
  55. package/template/default/.prettierignore +2 -0
  56. package/template/default/README.md +6 -4
  57. package/template/default/modules/example/module.json +1 -1
  58. package/template/default/modules/example/package.json +1 -1
  59. package/template/default/modules/example/spec/module.yaml +1 -1
  60. package/template/default/package.json +3 -2
  61. package/template/default/platform/index.html +7 -19
  62. package/template/default/platform/octane.config.ts +26 -2
  63. package/template/default/platform/package.json +1 -1
  64. package/template/default/platform/public/favicon.svg +1 -1
  65. package/template/default/platform/src/App.tsrx +25 -1
  66. package/template/default/platform/src/generated/modules.server.ts +2 -0
@@ -3,8 +3,6 @@
3
3
  <head>
4
4
  <meta charset="UTF-8" />
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
- <meta name="theme-color" content="#141B2E" />
7
- <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
8
6
  <style id="flowdular-critical-splash">
9
7
  html,
10
8
  body,
@@ -34,6 +32,9 @@
34
32
  letter-spacing: 0.14em;
35
33
  text-transform: uppercase;
36
34
  }
35
+ .flowdular-splash__brand::after {
36
+ content: var(--flowdular-brand, 'Flowdular');
37
+ }
37
38
  .flowdular-splash__stage {
38
39
  min-width: 190px;
39
40
  font-size: 10px;
@@ -80,27 +81,14 @@
80
81
  aria-hidden="true"
81
82
  >
82
83
  <g fill="#ffffff">
83
- <circle cx="7.9" cy="3.4" r="1.7" />
84
- <rect x="6.2" y="3.4" width="3.4" height="1.6" />
85
- <rect x="6.2" y="10.8" width="3.4" height="9.8" />
86
- <circle cx="7.9" cy="20.6" r="1.7" />
87
- <circle cx="16.1" cy="3.4" r="1.7" />
88
- <rect x="14.4" y="3.4" width="3.4" height="9.8" />
89
- <rect x="14.4" y="19" width="3.4" height="1.6" />
90
- <circle cx="16.1" cy="20.6" r="1.7" />
84
+ <rect x="2" y="3" width="20" height="5" rx="2.5" />
85
+ <rect x="8" y="10" width="14" height="5" rx="2.5" />
91
86
  </g>
92
87
  <g fill="#e08a45">
93
- <circle cx="3.4" cy="7.9" r="1.7" />
94
- <rect x="3.4" y="6.2" width="9.8" height="3.4" />
95
- <rect x="19" y="6.2" width="1.6" height="3.4" />
96
- <circle cx="20.6" cy="7.9" r="1.7" />
97
- <circle cx="3.4" cy="16.1" r="1.7" />
98
- <rect x="3.4" y="14.4" width="1.6" height="3.4" />
99
- <rect x="10.8" y="14.4" width="9.8" height="3.4" />
100
- <circle cx="20.6" cy="16.1" r="1.7" />
88
+ <rect x="14" y="17" width="8" height="5" rx="2.5" />
101
89
  </g>
102
90
  </svg>
103
- <span>Flowdular</span>
91
+ <span class="flowdular-splash__brand"></span>
104
92
  <small id="flowdular-splash-stage" class="flowdular-splash__stage"
105
93
  >Starting workspace</small
106
94
  >
@@ -1,8 +1,10 @@
1
1
  import {
2
2
  assertRouteConflicts,
3
+ createCorsMiddleware,
3
4
  createModuleMetrics,
4
5
  createModuleWebRoutes,
5
6
  createApplicationRoutes,
7
+ createOpenApiRoutes,
6
8
  serverTracer,
7
9
  validateApplicationPath,
8
10
  createMailPort,
@@ -17,6 +19,7 @@ import { defineConfig, RenderRoute } from '@octanejs/vite-plugin';
17
19
  import {
18
20
  authRuntimeOptionsFromEnvironment,
19
21
  createAuthRoutes,
22
+ endpointIdentityFromContext,
20
23
  isTokenPrincipal,
21
24
  mfaEnrolmentSatisfied,
22
25
  principalFromContext,
@@ -123,7 +126,10 @@ const moduleCompositions = composeModuleServer({
123
126
  dataClasses,
124
127
  databases,
125
128
  storage,
126
- mail,
129
+ /* The relay auth.core resolves per message from its stored settings, falling
130
+ back to the environment port above, so every module of the installation
131
+ sends through the same one. */
132
+ mail: authRuntime.mail,
127
133
  /* Rebound to the composing module by the generated composition; this binding
128
134
  is what a series the platform itself records would carry. */
129
135
  metrics: createModuleMetrics('platform'),
@@ -172,7 +178,15 @@ if (building) {
172
178
  }
173
179
 
174
180
  export default defineConfig({
175
- middlewares: [authRuntime.middleware],
181
+ middlewares: [
182
+ /* Ahead of the authentication: a cross-origin preflight carries no
183
+ credential and has to be answered before anything asks for one. The
184
+ origins come from the API tokens this workspace issued. */
185
+ createCorsMiddleware({
186
+ allowOrigin: (origin) => authRuntime.apiOriginAllowed(origin),
187
+ }),
188
+ authRuntime.middleware,
189
+ ],
176
190
  router: {
177
191
  routes: checkedRoutes([
178
192
  ...createApplicationRoutes({
@@ -183,6 +197,12 @@ export default defineConfig({
183
197
  healthEndpoint.serverRoute,
184
198
  createReadinessEndpoint(databases).serverRoute,
185
199
  ...createMetricsRoutes({ environment: process.env }),
200
+ /* Describes every operation the presented credential may call, built
201
+ from the endpoints this application composed. */
202
+ ...createOpenApiRoutes({
203
+ resolveIdentity: endpointIdentityFromContext,
204
+ publicBaseUrl: authRuntime.publicBaseUrl,
205
+ }),
186
206
  ...createStorageRoutes({
187
207
  storage,
188
208
  keyring: storageKeyring,
@@ -194,6 +214,10 @@ export default defineConfig({
194
214
  modules: moduleCompositions,
195
215
  mounts: moduleWebMounts,
196
216
  applicationPath: configuredApplicationPath,
217
+ /* A build composes with NODE_ENV forced to development, so the flag
218
+ asks for both: only a development server serves a page whose
219
+ stylesheets arrive after its markup. */
220
+ development: !building && process.env.NODE_ENV !== 'production',
197
221
  resolveIdentity: async (context) => {
198
222
  const principal = principalFromContext(context);
199
223
  if (!principal) return null;
@@ -15,7 +15,7 @@
15
15
  "@octanejs/vite-plugin": "0.1.51",
16
16
  "octane": "0.1.51",
17
17
  "pg": "8.23.0",
18
- "@flowdular/sdk": "0.4.1"
18
+ "@flowdular/sdk": "0.5.1"
19
19
  },
20
20
  "devDependencies": {
21
21
  "@octanejs/app-core": "0.0.47",
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><rect width="24" height="24" rx="5.4" fill="#2557D6"/><g transform="translate(12 12) scale(0.64) translate(-12 -12)"><circle cx="7.9" cy="3.4" r="1.7" fill="#fff"/><rect x="6.2" y="3.4" width="3.4" height="1.6" fill="#fff"/><rect x="6.2" y="10.8" width="3.4" height="9.8" fill="#fff"/><circle cx="7.9" cy="20.6" r="1.7" fill="#fff"/><circle cx="16.1" cy="3.4" r="1.7" fill="#fff"/><rect x="14.4" y="3.4" width="3.4" height="9.8" fill="#fff"/><rect x="14.4" y="19" width="3.4" height="1.6" fill="#fff"/><circle cx="16.1" cy="20.6" r="1.7" fill="#fff"/><circle cx="3.4" cy="7.9" r="1.7" fill="#fff"/><rect x="3.4" y="6.2" width="9.8" height="3.4" fill="#fff"/><rect x="19" y="6.2" width="1.6" height="3.4" fill="#fff"/><circle cx="20.6" cy="7.9" r="1.7" fill="#fff"/><circle cx="3.4" cy="16.1" r="1.7" fill="#fff"/><rect x="3.4" y="14.4" width="1.6" height="3.4" fill="#fff"/><rect x="10.8" y="14.4" width="9.8" height="3.4" fill="#fff"/><circle cx="20.6" cy="16.1" r="1.7" fill="#fff"/></g></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><rect width="24" height="24" rx="5.4" fill="#141b2e"/><g transform="translate(12 12) scale(0.72) translate(-12 -12)"><rect x="2" y="3" width="20" height="5" rx="2.5" fill="#ffffff"/><rect x="8" y="10" width="14" height="5" rx="2.5" fill="#ffffff"/><rect x="14" y="17" width="8" height="5" rx="2.5" fill="#e08a45"/></g></svg>
@@ -2,6 +2,10 @@ import { configureApplicationFromPage } from '@flowdular/sdk/client/routing';
2
2
  import {
3
3
  ApplicationShell,
4
4
  activeLocale,
5
+ applicationBranding,
6
+ brandingTitleSuffix,
7
+ configureBrandingFromPage,
8
+ DEFAULT_APPLICATION_BRANDING,
5
9
  shellLocationFromUrl,
6
10
  t,
7
11
  } from '@flowdular/sdk/client';
@@ -10,7 +14,7 @@ import {
10
14
  authScreenFromUrl,
11
15
  } from '@flowdular/sdk/modules/auth/client';
12
16
  import type { AuthPrincipal } from '@flowdular/sdk/modules/auth';
13
- import { Head } from '@octanejs/seo';
17
+ import { Head, Link, Meta, Seo } from '@octanejs/seo';
14
18
  import type { RenderRouteProps } from '@octanejs/vite-plugin';
15
19
  import {
16
20
  createModuleClientContributions,
@@ -64,9 +68,29 @@ function AuthenticatedApp(props: AuthenticatedAppProps) @{
64
68
 
65
69
  export function App(props?: RenderRouteProps) @{
66
70
  configureApplicationFromPage(props, applicationBasePath);
71
+ configureBrandingFromPage(props);
72
+ const branding = applicationBranding();
67
73
  const initialUrl =
68
74
  props?.url ?? (typeof window === 'undefined' ? '/' : window.location.href);
69
75
  <Head>
76
+ <Seo
77
+ title={t('shell.workspace.title')}
78
+ titleTemplate={'%s · ' + brandingTitleSuffix(branding)}
79
+ description={branding.description || t('shell.seo.description')}
80
+ robots={{ index: false, follow: false, noarchive: true }}
81
+ openGraph={{ type: 'website', siteName: branding.appName }}
82
+ />
83
+ <Link rel="icon" href={branding.faviconUrl} />
84
+ <Meta name="theme-color" content={branding.themeColor} />
85
+ {/* A new application ships no preview image of its own, so the link
86
+ preview is declared only once an operator points the setting at one. */}
87
+ @if (branding.ogImageUrl !== DEFAULT_APPLICATION_BRANDING.ogImageUrl) {
88
+ <>
89
+ <Meta property="og:image" content={branding.ogImageUrl} />
90
+ <Meta name="twitter:card" content="summary_large_image" />
91
+ <Meta name="twitter:image" content={branding.ogImageUrl} />
92
+ </>
93
+ }
70
94
  <AuthenticationCore
71
95
  initialScreen={authScreenFromUrl(initialUrl)}
72
96
  renderAuthenticated={(principal, controls) =>
@@ -121,6 +121,7 @@ export function composeModuleServer(
121
121
  'agents.run-queue',
122
122
  'agents.run-execution.v2',
123
123
  'agents.actions.v1',
124
+ 'agents.decisions.v1',
124
125
  ],
125
126
  requires: [
126
127
  { id: 'notifications.publish.v1', optional: true },
@@ -170,6 +171,7 @@ export function composeModuleServer(
170
171
  { id: 'agents.actions.v1' },
171
172
  { id: 'notifications.publish.v1', optional: true },
172
173
  { id: 'approvals.requests.v1', optional: true },
174
+ { id: 'agents.decisions.v1', optional: true },
173
175
  ],
174
176
  }),
175
177
  metrics: createModuleMetrics('workflows.core'),