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.
- package/README.md +9 -6
- package/agent-template/.agents/skills/auth-security-review/SKILL.md +1 -1
- package/agent-template/.agents/skills/bug-hunt/SKILL.md +1 -1
- package/agent-template/.agents/skills/module-new/SKILL.md +20 -19
- package/agent-template/.agents/skills/module-update/SKILL.md +4 -2
- package/agent-template/.agents/skills/spec-interview/SKILL.md +21 -20
- package/agent-template/.agents/skills/ux-design/SKILL.md +24 -2
- package/agent-template/.ai/README.md +5 -3
- package/agent-template/.ai/agents/README.md +1 -1
- package/agent-template/.ai/agents/sandbox/agentic-engineer.md +1 -0
- package/agent-template/.ai/agents/sandbox/backend-engineer.md +1 -0
- package/agent-template/.ai/agents/sandbox/frontend-engineer.md +1 -0
- package/agent-template/.ai/blueprints/add-migration/README.md +1 -1
- package/agent-template/.ai/examples/bad/client-imports-server/README.md +1 -1
- package/agent-template/.ai/examples/bad/missing-acl/README.md +1 -1
- package/agent-template/.ai/examples/bad/tenant-from-body/README.md +1 -1
- package/agent-template/.ai/guides/application-development.md +7 -5
- package/agent-template/.ai/platform-capabilities.md +10 -4
- package/agent-template/.ai/policies/capabilities.yaml +1 -0
- package/agent-template/.ai/policies/task-budgets.yaml +1 -1
- package/agent-template/.ai/rules/flowdular.md +3 -2
- package/agent-template/.ai/skills/auth-security-review/SKILL.md +1 -1
- package/agent-template/.ai/skills/bug-hunt/SKILL.md +1 -1
- package/agent-template/.ai/skills/module-new/SKILL.md +20 -19
- package/agent-template/.ai/skills/module-update/SKILL.md +4 -2
- package/agent-template/.ai/skills/spec-interview/SKILL.md +21 -20
- package/agent-template/.ai/skills/ux-design/SKILL.md +24 -2
- package/agent-template/.ai/subagents/module-executor.md +25 -0
- package/agent-template/.ai/subagents/reviewer.md +23 -0
- package/agent-template/.ai/subagents/spec-author.md +23 -0
- package/agent-template/.claude/agents/module-executor.md +22 -0
- package/agent-template/.claude/agents/reviewer.md +24 -0
- package/agent-template/.claude/agents/spec-author.md +20 -0
- package/agent-template/.claude/skills/auth-security-review/SKILL.md +1 -1
- package/agent-template/.claude/skills/bug-hunt/SKILL.md +1 -1
- package/agent-template/.claude/skills/module-new/SKILL.md +20 -19
- package/agent-template/.claude/skills/module-update/SKILL.md +4 -2
- package/agent-template/.claude/skills/spec-interview/SKILL.md +21 -20
- package/agent-template/.claude/skills/ux-design/SKILL.md +24 -2
- package/agent-template/.codex/agents/module-executor.toml +17 -0
- package/agent-template/.codex/agents/reviewer.toml +14 -0
- package/agent-template/.codex/agents/spec-author.toml +15 -0
- package/agent-template/AGENTS.md +3 -2
- package/agent-template/CLAUDE.md +3 -2
- package/agent-template/docs/cli.md +3 -0
- package/agent-template/docs/configuration.md +44 -0
- package/agent-template/docs/design-system.md +10 -3
- package/agent-template/docs/module-web-surfaces.md +31 -3
- package/agent-template/docs/modules.md +6 -0
- package/agent-template/docs/sandbox.md +117 -6
- package/agent-template/rulesync.jsonc +1 -1
- package/dist/bin.js +9 -0
- package/package.json +2 -2
- package/template/default/.env.example +7 -0
- package/template/default/.prettierignore +2 -0
- package/template/default/README.md +6 -4
- package/template/default/modules/example/module.json +1 -1
- package/template/default/modules/example/package.json +1 -1
- package/template/default/modules/example/spec/module.yaml +1 -1
- package/template/default/package.json +3 -2
- package/template/default/platform/index.html +7 -19
- package/template/default/platform/octane.config.ts +26 -2
- package/template/default/platform/package.json +1 -1
- package/template/default/platform/public/favicon.svg +1 -1
- package/template/default/platform/src/App.tsrx +25 -1
- 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
|
-
<
|
|
84
|
-
<rect x="
|
|
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
|
-
<
|
|
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
|
|
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
|
-
|
|
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: [
|
|
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;
|
|
@@ -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="#
|
|
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'),
|