fimo 2.7.1 → 2.8.0-staging.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.
- package/README.md +3 -3
- package/assets/agent-templates/_default/GOAL.md +2 -2
- package/assets/agent-templates/_default/capabilities.yaml +1 -0
- package/assets/agent-templates/broken-link-sweeper/capabilities.yaml +0 -1
- package/assets/agent-templates/content-translator/GOAL.md +1 -2
- package/assets/agent-templates/content-translator/capabilities.yaml +1 -2
- package/assets/agent-templates/post-deploy-check/capabilities.yaml +0 -1
- package/assets/agent-templates/seo-audit/capabilities.yaml +0 -1
- package/assets/skills/fimo/SKILL.md +11 -4
- package/assets/skills/fimo-cli/SKILL.md +16 -10
- package/assets/skills/fimo-cli/references/agents.md +35 -38
- package/assets/skills/fimo-cli/references/analytics.md +9 -1
- package/assets/skills/fimo-cli/references/branches.md +1 -1
- package/assets/skills/fimo-cli/references/credits.md +2 -2
- package/assets/skills/fimo-cli/references/deploy.md +1 -1
- package/assets/skills/fimo-cli/references/describe.md +2 -2
- package/assets/skills/fimo-cli/references/init.md +7 -7
- package/assets/skills/fimo-cli/references/integrations.md +2 -2
- package/assets/skills/fimo-cli/references/invite.md +1 -1
- package/assets/skills/fimo-cli/references/knowledge.md +48 -0
- package/assets/skills/fimo-cli/references/locales.md +1 -1
- package/assets/skills/fimo-cli/references/mcp.md +1 -1
- package/assets/skills/fimo-cli/references/project-vars-and-secrets.md +1 -1
- package/assets/skills/fimo-cli/references/projects.md +3 -3
- package/assets/skills/fimo-cli/references/schedules.md +1 -1
- package/assets/skills/fimo-cli/references/support.md +1 -1
- package/assets/skills/fimo-cli/references/update.md +9 -0
- package/assets/skills/fimo-code/SKILL.md +11 -0
- package/assets/skills/fimo-code/references/analytics.md +70 -0
- package/assets/skills/fimo-code/references/design.md +6 -6
- package/assets/skills/fimo-code/references/frameworks/vite-react.md +1 -1
- package/assets/skills/fimo-migration/SKILL.md +7 -0
- package/assets/skills/fimo-studio/SKILL.md +55 -38
- package/assets/skills/fimo-studio/references/agents.md +4 -4
- package/assets/skills/fimo-studio/references/ai-chat.md +24 -4
- package/assets/skills/fimo-studio/references/analytics.md +28 -0
- package/assets/skills/fimo-studio/references/billing-and-credits.md +13 -3
- package/assets/skills/fimo-studio/references/cms.md +2 -2
- package/assets/skills/fimo-studio/references/command-palette.md +5 -6
- package/assets/skills/fimo-studio/references/connections.md +10 -11
- package/assets/skills/fimo-studio/references/custom-domains.md +3 -3
- package/assets/skills/fimo-studio/references/drawing-and-wireframing.md +2 -4
- package/assets/skills/fimo-studio/references/knowledge.md +9 -0
- package/assets/skills/fimo-studio/references/media-library.md +5 -2
- package/assets/skills/fimo-studio/references/preview-and-responsive.md +6 -12
- package/assets/skills/fimo-studio/references/project-creation.md +24 -8
- package/assets/skills/fimo-studio/references/publish-and-deploy.md +8 -8
- package/assets/skills/fimo-studio/references/schedules.md +6 -7
- package/assets/skills/fimo-studio/references/seo-settings.md +2 -2
- package/assets/skills/fimo-studio/references/sharing-and-collaboration.md +11 -13
- package/assets/skills/fimo-studio/references/version-history.md +4 -4
- package/assets/skills/fimo-studio/references/visual-editing.md +9 -7
- package/assets/skills/fimo-studio/references/webhooks.md +10 -11
- package/dist/cli/bundle.json +1 -1
- package/dist/cli/index.js +106 -121
- package/dist/runtime/templates.d.ts +1 -2
- package/dist/runtime/templates.js +1 -3
- package/package.json +13 -13
- package/release.json +2 -2
- package/templates/astro/.fimo/config.json +0 -14
- package/templates/astro/AGENTS.md +1 -1
- package/templates/astro/package.json +4 -2
- package/templates/astro/src/layouts/Base.astro +2 -48
- package/templates/nextjs/package.json +7 -5
- package/templates/nextjs/src/app/layout.tsx +2 -0
- package/templates/react-router/package.json +5 -4
- package/templates/react-router/src/root.tsx +2 -0
- package/templates/sveltekit/package.json +4 -2
- package/templates/sveltekit/src/routes/+layout.svelte +2 -0
- package/templates/vite/package.json +7 -5
- package/templates/vite/src/LocaleLayout.tsx +2 -0
- package/assets/skills/fimo-cli/references/inbox.md +0 -86
- package/assets/skills/fimo-studio/references/code-editor.md +0 -65
- package/templates/astro/src/components/ProjectOverview.astro +0 -45
- package/templates/astro/src/pages/[locale]/projects/[slug].astro +0 -38
- package/templates/astro/src/pages/[locale]/projects/index.astro +0 -19
- package/templates/astro/src/pages/projects/[slug].astro +0 -31
- package/templates/astro/src/pages/projects/index.astro +0 -13
- package/templates/astro/src/schemas/Project.json +0 -9
- package/templates/astro/src/schemas/Project.ts +0 -29
- package/templates/astro/src/schemas/Project.types.ts +0 -70
- package/templates/astro/src/schemas/SiteSettings.json +0 -10
- package/templates/astro/src/schemas/SiteSettings.ts +0 -31
- package/templates/astro/src/schemas/SiteSettings.types.ts +0 -69
- package/templates/react-router/src/pages/Privacy.tsx +0 -79
- package/templates/react-router/src/pages/Terms.tsx +0 -48
- package/templates/react-router/src/pages/legal/LegalPage.tsx +0 -42
- package/templates/welcome/manifest.json +0 -655
- package/templates/welcome/media/analytics-overview.avif +0 -0
- package/templates/welcome/media/autonomous-loop.avif +0 -0
- package/templates/welcome/media/editable-preview.avif +0 -0
- package/templates/welcome/media/media-library.avif +0 -0
- package/templates/welcome/media/slack-teams.avif +0 -0
- package/templates/welcome/template/.fimo/agents/welcome-guide/GOAL.md +0 -12
- package/templates/welcome/template/.fimo/agents/welcome-guide/capabilities.yaml +0 -3
- package/templates/welcome/template/.fimo/agents/welcome-guide/config.yaml +0 -8
- package/templates/welcome/template/.fimo/config.json +0 -52
- package/templates/welcome/template/src/font.css +0 -60
- package/templates/welcome/template/src/pages/ArticleDetail.tsx +0 -104
- package/templates/welcome/template/src/pages/Index.tsx +0 -36
- package/templates/welcome/template/src/pages/SiteContent.tsx +0 -674
- package/templates/welcome/template/src/pages/fallback-content.ts +0 -152
- package/templates/welcome/template/src/routes.ts +0 -9
- package/templates/welcome/template/src/schemas/Article.json +0 -34
- package/templates/welcome/template/src/schemas/Article.ts +0 -54
- package/templates/welcome/template/src/schemas/Article.types.ts +0 -93
- package/templates/welcome/template/src/schemas/Author.json +0 -17
- package/templates/welcome/template/src/schemas/Author.ts +0 -51
- package/templates/welcome/template/src/schemas/Author.types.ts +0 -54
- package/templates/welcome/template/src/schemas/Category.json +0 -17
- package/templates/welcome/template/src/schemas/Category.ts +0 -51
- package/templates/welcome/template/src/schemas/Category.types.ts +0 -54
- package/templates/welcome/template/src/schemas/HomePage.json +0 -110
- package/templates/welcome/template/src/schemas/HomePage.ts +0 -22
- package/templates/welcome/template/src/schemas/HomePage.types.ts +0 -116
|
@@ -12,7 +12,6 @@ export declare const DEFAULT_TEMPLATE: TemplateFramework;
|
|
|
12
12
|
* out of `dist`) to reach the package root, then into `templates/<framework>`.
|
|
13
13
|
*/
|
|
14
14
|
export declare function getTemplatePath(framework?: TemplateFramework): string;
|
|
15
|
-
export declare function getWelcomeTemplatePath(): string;
|
|
16
15
|
export interface ReleaseMeta {
|
|
17
16
|
source: 'npm' | 'url' | 'dev' | null;
|
|
18
17
|
/** Immutable artifact URL, baked into `source: 'url'` development tarballs. */
|
|
@@ -76,7 +75,7 @@ export declare function rewriteFimoValidateCommand(pkg: PkgWithScripts, pin?: st
|
|
|
76
75
|
* only the ones it uses; every pin is derived from the `fimo` pin so the
|
|
77
76
|
* platform keeps a single version selector (FIMO-1635).
|
|
78
77
|
*/
|
|
79
|
-
export declare const FIMO_PACKAGES: readonly ['fimo', 'fimo-sveltekit', 'fimo-astro', 'fimo-vite', 'fimo-react', 'fimo-react-router', 'fimo-next'];
|
|
78
|
+
export declare const FIMO_PACKAGES: readonly ['fimo-analytics', 'fimo', 'fimo-sveltekit', 'fimo-astro', 'fimo-vite', 'fimo-react', 'fimo-react-router', 'fimo-next'];
|
|
80
79
|
export type FimoPackage = (typeof FIMO_PACKAGES)[number];
|
|
81
80
|
/**
|
|
82
81
|
* Pin for a companion package given the `fimo` pin. Semver and dist-tags carry
|
|
@@ -32,9 +32,6 @@ export const DEFAULT_TEMPLATE = 'nextjs';
|
|
|
32
32
|
export function getTemplatePath(framework = DEFAULT_TEMPLATE) {
|
|
33
33
|
return path.resolve(PACKAGE_ROOT, 'templates', framework);
|
|
34
34
|
}
|
|
35
|
-
export function getWelcomeTemplatePath() {
|
|
36
|
-
return path.resolve(PACKAGE_ROOT, 'templates', 'welcome');
|
|
37
|
-
}
|
|
38
35
|
export function readReleaseMeta() {
|
|
39
36
|
try {
|
|
40
37
|
const raw = fs.readFileSync(RELEASE_FILE, 'utf8');
|
|
@@ -191,6 +188,7 @@ export function rewriteFimoValidateCommand(pkg, pin = resolveFimoPin()) {
|
|
|
191
188
|
* platform keeps a single version selector (FIMO-1635).
|
|
192
189
|
*/
|
|
193
190
|
export const FIMO_PACKAGES = [
|
|
191
|
+
'fimo-analytics',
|
|
194
192
|
'fimo',
|
|
195
193
|
'fimo-sveltekit',
|
|
196
194
|
'fimo-astro',
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fimo",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "Fimo CLI - create, deploy, and manage Fimo
|
|
3
|
+
"version": "2.8.0-staging.10",
|
|
4
|
+
"description": "Fimo CLI - create, deploy, and manage Fimo sites",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"astro-component"
|
|
7
7
|
],
|
|
@@ -194,26 +194,26 @@
|
|
|
194
194
|
"devDependencies": {
|
|
195
195
|
"@clack/core": "^1.2.0",
|
|
196
196
|
"@clack/prompts": "^1.2.0",
|
|
197
|
-
"@fimo/agents-bundle": "2.
|
|
198
|
-
"@fimo/api-contracts": "2.
|
|
199
|
-
"@fimo/cli-kit": "2.
|
|
200
|
-
"@fimo/framework-detect": "2.
|
|
201
|
-
"@fimo/routes": "2.
|
|
202
|
-
"@fimo/sdk": "2.
|
|
203
|
-
"@fimo/tsconfig": "2.
|
|
197
|
+
"@fimo/agents-bundle": "2.8.0-staging.10",
|
|
198
|
+
"@fimo/api-contracts": "2.8.0-staging.10",
|
|
199
|
+
"@fimo/cli-kit": "2.8.0-staging.10",
|
|
200
|
+
"@fimo/framework-detect": "2.8.0-staging.10",
|
|
201
|
+
"@fimo/routes": "2.8.0-staging.10",
|
|
202
|
+
"@fimo/sdk": "2.8.0-staging.10",
|
|
203
|
+
"@fimo/tsconfig": "2.8.0-staging.10",
|
|
204
204
|
"@types/node": "22.18.6",
|
|
205
205
|
"agent-install": "^0.0.5",
|
|
206
206
|
"astro": "^7.1.6",
|
|
207
|
-
"better-auth": "1.7.
|
|
207
|
+
"better-auth": "1.7.7",
|
|
208
208
|
"cheerio": "^1.0.0",
|
|
209
209
|
"commander": "^13.1.0",
|
|
210
210
|
"esbuild": "^0.25.10",
|
|
211
211
|
"open": "^10.1.2",
|
|
212
212
|
"tsx": "4.22.4",
|
|
213
213
|
"typescript": "7.0.2",
|
|
214
|
-
"vite": "8.
|
|
215
|
-
"vitest": "5.0.
|
|
216
|
-
"wrangler": "4.
|
|
214
|
+
"vite": "8.3.3",
|
|
215
|
+
"vitest": "5.0.3",
|
|
216
|
+
"wrangler": "4.145.0",
|
|
217
217
|
"yaml": "2.8.2"
|
|
218
218
|
},
|
|
219
219
|
"engines": {
|
package/release.json
CHANGED
|
@@ -9,20 +9,6 @@
|
|
|
9
9
|
"label": "Home",
|
|
10
10
|
"path": "/:locale",
|
|
11
11
|
"params": { "locale": { "type": "locale", "optional": true } }
|
|
12
|
-
},
|
|
13
|
-
"projects": {
|
|
14
|
-
"label": "Projects",
|
|
15
|
-
"path": "/:locale/projects",
|
|
16
|
-
"params": { "locale": { "type": "locale", "optional": true } }
|
|
17
|
-
},
|
|
18
|
-
"project": {
|
|
19
|
-
"label": "Project",
|
|
20
|
-
"path": "/:locale/projects/:slug",
|
|
21
|
-
"seo": { "title": "{{project.title}}", "description": "{{project.summary}}" },
|
|
22
|
-
"params": {
|
|
23
|
-
"locale": { "type": "locale", "optional": true },
|
|
24
|
-
"slug": { "schema": "Project", "queryField": "slug", "displayField": "title" }
|
|
25
|
-
}
|
|
26
12
|
}
|
|
27
13
|
},
|
|
28
14
|
"version": "4"
|
|
@@ -39,4 +39,4 @@ a code-only task, or use `npx fimo@latest` for project-local code generation and
|
|
|
39
39
|
- Keep secrets in the Fimo dashboard, not committed environment files.
|
|
40
40
|
- Pass flags to interactive Fimo commands when scripting them.
|
|
41
41
|
|
|
42
|
-
The scaffolded
|
|
42
|
+
The scaffolded homepage is disposable. Replace it on the first real generation.
|
|
@@ -9,8 +9,10 @@
|
|
|
9
9
|
"check": "astro sync && astro check"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"fimo": "2.
|
|
13
|
-
"fimo-
|
|
12
|
+
"fimo": "2.8.0-staging.10",
|
|
13
|
+
"fimo-analytics": "2.8.0-staging.10",
|
|
14
|
+
"fimo-astro": "2.8.0-staging.10",
|
|
15
|
+
"zod": "^4.4.3"
|
|
14
16
|
},
|
|
15
17
|
"devDependencies": {
|
|
16
18
|
"@astrojs/check": "^0.9.10",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
---
|
|
2
|
+
import Analytics from 'fimo-analytics/astro';
|
|
2
3
|
import { resolveSeoForPath, toSeoHead, type FimoSEO } from 'fimo/seo';
|
|
3
4
|
|
|
4
5
|
import fimoConfig from '../../.fimo/config.json';
|
|
@@ -35,6 +36,7 @@ const head = toSeoHead({
|
|
|
35
36
|
</head>
|
|
36
37
|
<body>
|
|
37
38
|
<slot />
|
|
39
|
+
<Analytics />
|
|
38
40
|
</body>
|
|
39
41
|
</html>
|
|
40
42
|
|
|
@@ -49,52 +51,4 @@ const head = toSeoHead({
|
|
|
49
51
|
body {
|
|
50
52
|
margin: 0;
|
|
51
53
|
}
|
|
52
|
-
|
|
53
|
-
main {
|
|
54
|
-
box-sizing: border-box;
|
|
55
|
-
width: min(100% - 3rem, 52rem);
|
|
56
|
-
min-height: 100vh;
|
|
57
|
-
margin: 0 auto;
|
|
58
|
-
padding: 4rem 0;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
nav,
|
|
62
|
-
header,
|
|
63
|
-
section,
|
|
64
|
-
article {
|
|
65
|
-
display: grid;
|
|
66
|
-
gap: 0.75rem;
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
nav {
|
|
70
|
-
grid-auto-flow: column;
|
|
71
|
-
justify-content: start;
|
|
72
|
-
margin-bottom: 4rem;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
section {
|
|
76
|
-
margin-top: 3rem;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
article {
|
|
80
|
-
padding: 1.5rem 0;
|
|
81
|
-
border-top: 1px solid #d6d3cc;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
h1,
|
|
85
|
-
h2,
|
|
86
|
-
p {
|
|
87
|
-
margin: 0;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
h1 {
|
|
91
|
-
max-width: 16ch;
|
|
92
|
-
font-size: clamp(2.75rem, 9vw, 5rem);
|
|
93
|
-
line-height: 0.95;
|
|
94
|
-
letter-spacing: -0.05em;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
a {
|
|
98
|
-
color: inherit;
|
|
99
|
-
}
|
|
100
54
|
</style>
|
|
@@ -12,12 +12,14 @@
|
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@tanstack/react-query": "^5.80.6",
|
|
15
|
-
"fimo": "2.
|
|
16
|
-
"fimo-
|
|
17
|
-
"fimo-
|
|
18
|
-
"
|
|
15
|
+
"fimo": "2.8.0-staging.10",
|
|
16
|
+
"fimo-analytics": "2.8.0-staging.10",
|
|
17
|
+
"fimo-next": "2.8.0-staging.10",
|
|
18
|
+
"fimo-react": "2.8.0-staging.10",
|
|
19
|
+
"next": "^16.3.8",
|
|
19
20
|
"react": "^19.2.7",
|
|
20
|
-
"react-dom": "^19.2.7"
|
|
21
|
+
"react-dom": "^19.2.7",
|
|
22
|
+
"zod": "^4.4.3"
|
|
21
23
|
},
|
|
22
24
|
"devDependencies": {
|
|
23
25
|
"@types/node": "^24.12.0",
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Analytics } from 'fimo-analytics/next';
|
|
1
2
|
import { FimoProvider } from 'fimo-next';
|
|
2
3
|
import { toNextMetadata, toNextViewport } from 'fimo-next/seo';
|
|
3
4
|
import { getFimoSeo } from 'fimo/seo/server';
|
|
@@ -15,6 +16,7 @@ export default function RootLayout({ children }: Readonly<{ children: ReactNode
|
|
|
15
16
|
<html lang={defaultLocale}>
|
|
16
17
|
<body>
|
|
17
18
|
<FimoProvider locale={defaultLocale}>{children}</FimoProvider>
|
|
19
|
+
<Analytics />
|
|
18
20
|
</body>
|
|
19
21
|
</html>
|
|
20
22
|
);
|
|
@@ -21,10 +21,11 @@
|
|
|
21
21
|
"cn": "0.2.4",
|
|
22
22
|
"date-fns": "^4.1.0",
|
|
23
23
|
"embla-carousel-react": "^8.6.0",
|
|
24
|
-
"fimo": "2.
|
|
25
|
-
"fimo-
|
|
26
|
-
"fimo-react
|
|
27
|
-
"fimo-
|
|
24
|
+
"fimo": "2.8.0-staging.10",
|
|
25
|
+
"fimo-analytics": "2.8.0-staging.10",
|
|
26
|
+
"fimo-react": "2.8.0-staging.10",
|
|
27
|
+
"fimo-react-router": "2.8.0-staging.10",
|
|
28
|
+
"fimo-vite": "2.8.0-staging.10",
|
|
28
29
|
"input-otp": "^1.4.2",
|
|
29
30
|
"isbot": "^5",
|
|
30
31
|
"lucide-react": "^0.577.0",
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
|
|
2
|
+
import { Analytics } from 'fimo-analytics/react-router';
|
|
2
3
|
import { FimoProviders, FimoScripts, loadFimoMetaData, buildFimoMeta, fimoHtmlProps } from 'fimo-react-router';
|
|
3
4
|
import React from 'react';
|
|
4
5
|
import type { MetaFunction } from 'react-router';
|
|
@@ -46,6 +47,7 @@ export default function AppRoot() {
|
|
|
46
47
|
return (
|
|
47
48
|
<QueryClientProvider client={queryClient}>
|
|
48
49
|
<Outlet />
|
|
50
|
+
<Analytics />
|
|
49
51
|
</QueryClientProvider>
|
|
50
52
|
);
|
|
51
53
|
}
|
|
@@ -11,8 +11,10 @@
|
|
|
11
11
|
"prepare": "svelte-kit sync"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"fimo": "2.
|
|
15
|
-
"fimo-
|
|
14
|
+
"fimo": "2.8.0-staging.10",
|
|
15
|
+
"fimo-analytics": "2.8.0-staging.10",
|
|
16
|
+
"fimo-sveltekit": "2.8.0-staging.10",
|
|
17
|
+
"zod": "^4.4.3"
|
|
16
18
|
},
|
|
17
19
|
"devDependencies": {
|
|
18
20
|
"@sveltejs/kit": "^2.70.2",
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import { afterNavigate } from '$app/navigation';
|
|
3
3
|
import { page } from '$app/state';
|
|
4
|
+
import Analytics from 'fimo-analytics/sveltekit';
|
|
4
5
|
import { FimoProvider } from 'fimo-sveltekit/components';
|
|
5
6
|
import type { Snippet } from 'svelte';
|
|
6
7
|
|
|
@@ -27,3 +28,4 @@
|
|
|
27
28
|
<FimoProvider labels={data.labels}>
|
|
28
29
|
{@render children()}
|
|
29
30
|
</FimoProvider>
|
|
31
|
+
<Analytics />
|
|
@@ -11,13 +11,15 @@
|
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@tanstack/react-query": "^5.80.6",
|
|
14
|
-
"fimo": "2.
|
|
15
|
-
"fimo-
|
|
16
|
-
"fimo-react
|
|
17
|
-
"fimo-
|
|
14
|
+
"fimo": "2.8.0-staging.10",
|
|
15
|
+
"fimo-analytics": "2.8.0-staging.10",
|
|
16
|
+
"fimo-react": "2.8.0-staging.10",
|
|
17
|
+
"fimo-react-router": "2.8.0-staging.10",
|
|
18
|
+
"fimo-vite": "2.8.0-staging.10",
|
|
18
19
|
"react": "^19.2.7",
|
|
19
20
|
"react-dom": "^19.2.7",
|
|
20
|
-
"react-router": "^8.3.0"
|
|
21
|
+
"react-router": "^8.3.0",
|
|
22
|
+
"zod": "^4.4.3"
|
|
21
23
|
},
|
|
22
24
|
"devDependencies": {
|
|
23
25
|
"@types/react": "^19.2.14",
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Analytics } from 'fimo-analytics/react-router';
|
|
1
2
|
import { FimoProviders } from 'fimo-react-router';
|
|
2
3
|
import { Outlet, useParams } from 'react-router';
|
|
3
4
|
|
|
@@ -7,6 +8,7 @@ export function LocaleLayout() {
|
|
|
7
8
|
return (
|
|
8
9
|
<FimoProviders locale={locale}>
|
|
9
10
|
<Outlet />
|
|
11
|
+
<Analytics />
|
|
10
12
|
</FimoProviders>
|
|
11
13
|
);
|
|
12
14
|
}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
# Inbox
|
|
2
|
-
|
|
3
|
-
The Inbox is what a project's agents tell the people on it: a run finished, a
|
|
4
|
-
run left work for review, a merge conflicted, or a run stopped and is waiting
|
|
5
|
-
for a decision. Only the last one can be acted on from the CLI.
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
fimo inbox list # unread first, then read
|
|
9
|
-
fimo inbox list --topic agent_question --unread
|
|
10
|
-
fimo inbox get <notification-id> # the notification, plus the stored form when it is a question
|
|
11
|
-
fimo inbox answer <notification-id> --body '<compact answer json>'
|
|
12
|
-
```
|
|
13
|
-
|
|
14
|
-
A notification id is the only id you ever hold. The question, its thread, the
|
|
15
|
-
run it continues, and the Branch that run kept alive are resolved for you.
|
|
16
|
-
|
|
17
|
-
Use `--project <id>` when there is no local `.fimo/project.json`. `--limit`,
|
|
18
|
-
`--cursor`, and `--all-pages` page the list. `--archived` reads archived items;
|
|
19
|
-
`--unread` stays in the unread stream instead of continuing into read items.
|
|
20
|
-
|
|
21
|
-
## Answering is the person's decision, not yours
|
|
22
|
-
|
|
23
|
-
**Never answer a question on someone's behalf.** A question exists because a run
|
|
24
|
-
needed a human decision it could not make correctly. Answer only what the person
|
|
25
|
-
in front of you explicitly chose.
|
|
26
|
-
|
|
27
|
-
1. `fimo inbox list --topic agent_question --unread --json` to find waiting
|
|
28
|
-
questions, then `fimo inbox get <notification-id> --json` for the one to
|
|
29
|
-
answer. `data.question.form` is the stored form, verbatim.
|
|
30
|
-
2. **Reproduce that form in the interface you are in** — the native form or
|
|
31
|
-
choice UI your harness offers, or a plain enumerated prompt when it offers
|
|
32
|
-
none. Keep the title, the description, the step order, the wording of every
|
|
33
|
-
question, every option label, the recommended option where one is marked,
|
|
34
|
-
image labels and URLs, and each capability's reason. The person is deciding
|
|
35
|
-
on what the agent actually asked, not on your summary of it.
|
|
36
|
-
3. Collect only explicit answers. Do not default a step, infer one from earlier
|
|
37
|
-
conversation, or fill a step the person skipped. If the person already gave a
|
|
38
|
-
complete explicit answer, do not ask again — use what they said.
|
|
39
|
-
4. **Never infer capability approval.** Selecting nothing on a capabilities step
|
|
40
|
-
is a deliberate deny-all, and omitting the step entirely is refused by the
|
|
41
|
-
CLI rather than read as a denial.
|
|
42
|
-
5. Pass their notes through verbatim. The note is the one part of the answer
|
|
43
|
-
only they could write.
|
|
44
|
-
6. Call `fimo inbox answer` once.
|
|
45
|
-
|
|
46
|
-
## The compact answer
|
|
47
|
-
|
|
48
|
-
Keyed by the step ids `inbox get` returned, in any order, one entry per step:
|
|
49
|
-
|
|
50
|
-
```json
|
|
51
|
-
{
|
|
52
|
-
"answers": [
|
|
53
|
-
{ "stepId": "direction", "selected": ["Editorial studio"], "note": "Keep it calm." },
|
|
54
|
-
{ "stepId": "access", "selected": [] },
|
|
55
|
-
{ "stepId": "notes", "note": "Ship on Friday." }
|
|
56
|
-
]
|
|
57
|
-
}
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
- `selected` holds option **labels**, exactly as the form shows them.
|
|
61
|
-
- `note` is free text. A step that offers options may be answered with a note
|
|
62
|
-
alone, with a selection alone, or with both.
|
|
63
|
-
- A written step (`"type": "text"`) is answered with `note` only.
|
|
64
|
-
- A capabilities step needs `selected`, empty or not. `[]` approves none.
|
|
65
|
-
- Every step needs its own entry. Nothing is answered by omission.
|
|
66
|
-
|
|
67
|
-
`--file <path>` and `--stdin` read the same JSON from a file or a pipe.
|
|
68
|
-
|
|
69
|
-
## What the CLI refuses
|
|
70
|
-
|
|
71
|
-
| Code | Why |
|
|
72
|
-
| ----------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
73
|
-
| `INBOX_ANSWER_INVALID` | Unknown or missing step, unoffered option, too many selections on a single-select, a written step answered by picking, or a capabilities step with no explicit decision |
|
|
74
|
-
| `INBOX_NOT_A_QUESTION` | The notification is a run outcome, a review, or a conflict — there is nothing to answer |
|
|
75
|
-
| `INBOX_QUESTION_CLOSED` | Already answered, expired, cancelled, or superseded |
|
|
76
|
-
| `INBOX_UNKNOWN_TOPIC` | `--topic` is not one of the four Inbox topics |
|
|
77
|
-
| `INBOX_INVALID_CURSOR` | `--cursor` was not the `nextCursor` from a previous page |
|
|
78
|
-
| `INBOX_NOT_FOUND` | No notification with that id is addressed to you in this project |
|
|
79
|
-
|
|
80
|
-
A question is answered once. Answering it starts exactly one continuation run,
|
|
81
|
-
and re-sending the same answer never starts a second one.
|
|
82
|
-
|
|
83
|
-
## What the CLI does not do
|
|
84
|
-
|
|
85
|
-
Marking read, archiving, restoring, reviewing retained work, and resolving merge
|
|
86
|
-
conflicts happen in the Fimo Inbox UI. `fimo inbox` reads and answers.
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
## Browsing Your Files
|
|
2
|
-
|
|
3
|
-
Click the **Code** tab (the code icon) in the workspace navigation, or press **Option+4** (Mac) / **Alt+4** (Windows/Linux). A file tree appears showing all your project files and folders.
|
|
4
|
-
|
|
5
|
-
Inside the Code workspace, the left sidebar shows the **Files** tree. If you ever switch the sidebar to another view, press **Cmd+Shift+E** (Mac) / **Ctrl+Shift+E** (Windows/Linux) to bring the Files explorer back.
|
|
6
|
-
|
|
7
|
-
- Click a **folder** to expand or collapse it.
|
|
8
|
-
- Click a **file** to open it in a new tab.
|
|
9
|
-
- You can have multiple files open at once. Each one gets its own tab at the top.
|
|
10
|
-
|
|
11
|
-
## File Tree Context Menu
|
|
12
|
-
|
|
13
|
-
Right-click an item in the tree to see these options:
|
|
14
|
-
|
|
15
|
-
- **Copy path** -- copies the full file path to your clipboard.
|
|
16
|
-
- **Copy name** -- copies just the file name.
|
|
17
|
-
- **Search in folder** -- opens a search scoped to that folder. This option appears only when you right-click a folder.
|
|
18
|
-
|
|
19
|
-
## Tab Management
|
|
20
|
-
|
|
21
|
-
Right-click any open tab to see options:
|
|
22
|
-
|
|
23
|
-
- **Close** -- close this tab.
|
|
24
|
-
- **Close all** -- close every open tab.
|
|
25
|
-
- **Close others** -- close all tabs except this one.
|
|
26
|
-
- **Close tabs to the left** -- close every tab before this one.
|
|
27
|
-
- **Close tabs to the right** -- close every tab after this one.
|
|
28
|
-
- **Copy path** -- copy the file's full path to your clipboard.
|
|
29
|
-
- **Copy filename** -- copy just the file name.
|
|
30
|
-
|
|
31
|
-
Click the **X** on a tab to close it directly.
|
|
32
|
-
|
|
33
|
-
## Editing Code
|
|
34
|
-
|
|
35
|
-
The editor gives you syntax highlighting, line numbers, and a minimap on the right side for quick scrolling. Just click into the file and start typing.
|
|
36
|
-
|
|
37
|
-
Your changes auto-save as you work, and the preview updates in real-time so you can see the result immediately.
|
|
38
|
-
|
|
39
|
-
## Searching
|
|
40
|
-
|
|
41
|
-
- Press **Cmd+Shift+F** (Mac) or **Ctrl+Shift+F** (Windows/Linux) to open the content search dialog and find text across your entire project. Select a result to jump straight to that line.
|
|
42
|
-
- Right-click a folder in the file tree and choose **Search in folder** to scope the same search to that folder.
|
|
43
|
-
|
|
44
|
-
## Dependencies Panel
|
|
45
|
-
|
|
46
|
-
In the left sidebar of the Code tab, switch to the **Dependencies** view (click the package icon in the sidebar header, or press **Cmd+Shift+D** on Mac / **Ctrl+Shift+D** on Windows/Linux). It lists all the npm packages your project uses along with their versions. The sidebar shows either the Files tree or Dependencies at a time, so switching to Dependencies hides the file tree until you switch back.
|
|
47
|
-
|
|
48
|
-
To add a new package, ask the AI in chat. For example: "Add the date-fns package to my project."
|
|
49
|
-
|
|
50
|
-
## Collaboration
|
|
51
|
-
|
|
52
|
-
When other people are working on the same project, you see their cursors in the editor. Each person gets a name label and a unique color so you can tell who is editing what. All changes appear in real-time.
|
|
53
|
-
|
|
54
|
-
## Special File Viewers
|
|
55
|
-
|
|
56
|
-
Not everything opens as plain code. The editor has built-in preview renderers for these file types:
|
|
57
|
-
|
|
58
|
-
- **Markdown** (`.md`, `.mdx`) renders as formatted text.
|
|
59
|
-
- **SVG** (`.svg`) displays the graphic.
|
|
60
|
-
- **HTML** (`.html`, `.htm`) renders the page.
|
|
61
|
-
- **Mermaid** (`.mmd`, `.mermaid`) renders the diagram.
|
|
62
|
-
- **CSV / TSV** (`.csv`, `.tsv`) appear as a readable table.
|
|
63
|
-
- **Schema files** in `src/schemas/` (`.json`) render as your Fimo content type.
|
|
64
|
-
|
|
65
|
-
For these types, a toolbar lets you switch between **Code**, **Preview**, and a side-by-side **Split** view. Other files (including images such as PNG and JPG) open as plain text in the code editor; to see an image rendered, open it from the Assets library or embed it in Markdown.
|
|
@@ -1,45 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { getLabels } from 'fimo/astro';
|
|
3
|
-
import { Text } from 'fimo/astro/components';
|
|
4
|
-
|
|
5
|
-
import * as Project from '../schemas/Project';
|
|
6
|
-
import * as SiteSettings from '../schemas/SiteSettings';
|
|
7
|
-
|
|
8
|
-
interface Props {
|
|
9
|
-
locale: string;
|
|
10
|
-
localePrefix?: string;
|
|
11
|
-
rendering: 'static' | 'server';
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const { locale, localePrefix, rendering } = Astro.props;
|
|
15
|
-
const prefix = localePrefix ? `/${localePrefix}` : '';
|
|
16
|
-
const localize = (path: string) => `${prefix}${path}`;
|
|
17
|
-
const [settings, projects, labels] = await Promise.all([
|
|
18
|
-
SiteSettings.get({ locale }),
|
|
19
|
-
Project.list({ locale, limit: 12 }),
|
|
20
|
-
getLabels({ locale }),
|
|
21
|
-
]);
|
|
22
|
-
---
|
|
23
|
-
|
|
24
|
-
<main data-framework="astro" data-rendering={rendering} data-locale={locale} data-fimo-starter="projects">
|
|
25
|
-
<nav aria-label="Primary">
|
|
26
|
-
<a href={localize('/')}>Home</a>
|
|
27
|
-
</nav>
|
|
28
|
-
<header>
|
|
29
|
-
<Text as="h1" value={settings.studioName} />
|
|
30
|
-
<Text as="p" value={settings.intro} />
|
|
31
|
-
<a href={localize('/projects')}><Text as="span" value={labels.t('navigation.projects')} /></a>
|
|
32
|
-
</header>
|
|
33
|
-
<section>
|
|
34
|
-
<Text as="h2" value={labels.t('projects.heading')} />
|
|
35
|
-
{
|
|
36
|
-
projects.items.map((project) => (
|
|
37
|
-
<article data-project-slug={String(project.slug)}>
|
|
38
|
-
<Text as="h3" value={project.title} />
|
|
39
|
-
<Text as="p" value={project.summary} />
|
|
40
|
-
<a href={localize(`/projects/${String(project.slug)}`)}><Text as="span" value={project.title} /></a>
|
|
41
|
-
</article>
|
|
42
|
-
))
|
|
43
|
-
}
|
|
44
|
-
</section>
|
|
45
|
-
</main>
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { getLabels } from 'fimo/astro';
|
|
3
|
-
import { Text } from 'fimo/astro/components';
|
|
4
|
-
import { resolveSeoForPath } from 'fimo/seo';
|
|
5
|
-
|
|
6
|
-
import config from '../../../../.fimo/config.json';
|
|
7
|
-
import Base from '../../../layouts/Base.astro';
|
|
8
|
-
import { prefixedLocales } from '../../../locales';
|
|
9
|
-
import * as Project from '../../../schemas/Project';
|
|
10
|
-
|
|
11
|
-
export const prerender = false;
|
|
12
|
-
|
|
13
|
-
const routeLocale = Astro.params.locale;
|
|
14
|
-
const slug = Astro.params.slug ?? '';
|
|
15
|
-
|
|
16
|
-
if (!routeLocale || !prefixedLocales.has(routeLocale)) {
|
|
17
|
-
return new Response(null, { status: 404, statusText: 'Not found' });
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
const locale = Astro.currentLocale ?? routeLocale;
|
|
21
|
-
|
|
22
|
-
const [project, labels] = await Promise.all([Project.getBySlug(slug, { locale }), getLabels({ locale })]);
|
|
23
|
-
|
|
24
|
-
if (!project) {
|
|
25
|
-
return Astro.redirect('/404');
|
|
26
|
-
}
|
|
27
|
-
const seo = resolveSeoForPath(Astro.url.pathname, config, { project });
|
|
28
|
-
---
|
|
29
|
-
|
|
30
|
-
<Base lang={locale} seo={seo} title={seo?.title ?? String(project.title)}>
|
|
31
|
-
<main data-framework="astro" data-rendering="server" data-project-slug={slug}>
|
|
32
|
-
<a href={`/${locale}/projects`}><Text as="span" value={labels.t('navigation.projects')} /></a>
|
|
33
|
-
<article>
|
|
34
|
-
<Text as="h1" value={project.title} />
|
|
35
|
-
<Text as="p" value={project.summary} />
|
|
36
|
-
</article>
|
|
37
|
-
</main>
|
|
38
|
-
</Base>
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
import ProjectOverview from '../../../components/ProjectOverview.astro';
|
|
3
|
-
import Base from '../../../layouts/Base.astro';
|
|
4
|
-
import { prefixedLocales } from '../../../locales';
|
|
5
|
-
|
|
6
|
-
export const prerender = false;
|
|
7
|
-
|
|
8
|
-
const routeLocale = Astro.params.locale;
|
|
9
|
-
|
|
10
|
-
if (!routeLocale || !prefixedLocales.has(routeLocale)) {
|
|
11
|
-
return new Response(null, { status: 404, statusText: 'Not found' });
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const locale = Astro.currentLocale ?? routeLocale;
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
<Base lang={locale} title="Projects">
|
|
18
|
-
<ProjectOverview {locale} localePrefix={locale} rendering="server" />
|
|
19
|
-
</Base>
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
import { getLabels } from 'fimo/astro';
|
|
3
|
-
import { Text } from 'fimo/astro/components';
|
|
4
|
-
import { resolveSeoForPath } from 'fimo/seo';
|
|
5
|
-
|
|
6
|
-
import config from '../../../.fimo/config.json';
|
|
7
|
-
import Base from '../../layouts/Base.astro';
|
|
8
|
-
import { defaultLocale } from '../../locales';
|
|
9
|
-
import * as Project from '../../schemas/Project';
|
|
10
|
-
|
|
11
|
-
export const prerender = false;
|
|
12
|
-
|
|
13
|
-
const locale = Astro.currentLocale ?? defaultLocale;
|
|
14
|
-
const slug = Astro.params.slug ?? '';
|
|
15
|
-
const [project, labels] = await Promise.all([Project.getBySlug(slug, { locale }), getLabels({ locale })]);
|
|
16
|
-
|
|
17
|
-
if (!project) {
|
|
18
|
-
return Astro.redirect('/404');
|
|
19
|
-
}
|
|
20
|
-
const seo = resolveSeoForPath(Astro.url.pathname, config, { project });
|
|
21
|
-
---
|
|
22
|
-
|
|
23
|
-
<Base lang={locale} seo={seo} title={seo?.title ?? String(project.title)}>
|
|
24
|
-
<main data-framework="astro" data-rendering="server" data-project-slug={slug}>
|
|
25
|
-
<a href="/projects"><Text as="span" value={labels.t('navigation.projects')} /></a>
|
|
26
|
-
<article>
|
|
27
|
-
<Text as="h1" value={project.title} />
|
|
28
|
-
<Text as="p" value={project.summary} />
|
|
29
|
-
</article>
|
|
30
|
-
</main>
|
|
31
|
-
</Base>
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
import ProjectOverview from '../../components/ProjectOverview.astro';
|
|
3
|
-
import Base from '../../layouts/Base.astro';
|
|
4
|
-
import { defaultLocale } from '../../locales';
|
|
5
|
-
|
|
6
|
-
export const prerender = false;
|
|
7
|
-
|
|
8
|
-
const locale = Astro.currentLocale ?? defaultLocale;
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
<Base lang={locale} title="Projects">
|
|
12
|
-
<ProjectOverview {locale} rendering="server" />
|
|
13
|
-
</Base>
|