fimo 0.14.0 → 0.15.0-staging.2

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 (199) hide show
  1. package/README.md +1 -0
  2. package/assets/astro/components/Boolean.astro +14 -0
  3. package/assets/astro/components/Date.astro +23 -0
  4. package/assets/astro/components/Image.astro +79 -0
  5. package/assets/astro/components/Json.astro +14 -0
  6. package/assets/astro/components/RichText.astro +17 -0
  7. package/assets/astro/components/StaticImage.astro +66 -0
  8. package/assets/astro/components/Text.astro +23 -0
  9. package/assets/astro/components/Video.astro +47 -0
  10. package/assets/astro/components/index.d.ts +8 -0
  11. package/assets/astro/components/index.js +8 -0
  12. package/assets/content-templates/shared/server.eta +56 -0
  13. package/assets/content-templates/sveltekit/content.eta +86 -0
  14. package/assets/skills/fimo/SKILL.md +13 -4
  15. package/assets/skills/fimo-cli/SKILL.md +28 -28
  16. package/assets/skills/fimo-cli/references/account.md +0 -2
  17. package/assets/skills/fimo-cli/references/agent-setup.md +7 -9
  18. package/assets/skills/fimo-cli/references/agents.md +0 -2
  19. package/assets/skills/fimo-cli/references/analytics.md +0 -2
  20. package/assets/skills/fimo-cli/references/assets.md +2 -4
  21. package/assets/skills/fimo-cli/references/branches.md +14 -15
  22. package/assets/skills/fimo-cli/references/content.md +9 -11
  23. package/assets/skills/fimo-cli/references/credits.md +0 -2
  24. package/assets/skills/fimo-cli/references/deploy.md +6 -7
  25. package/assets/skills/fimo-cli/references/describe.md +1 -3
  26. package/assets/skills/fimo-cli/references/domains.md +0 -2
  27. package/assets/skills/fimo-cli/references/forms.md +5 -7
  28. package/assets/skills/fimo-cli/references/history.md +0 -2
  29. package/assets/skills/fimo-cli/references/init.md +34 -26
  30. package/assets/skills/fimo-cli/references/integrations/firecrawl.md +0 -2
  31. package/assets/skills/fimo-cli/references/integrations.md +0 -2
  32. package/assets/skills/fimo-cli/references/invite.md +0 -2
  33. package/assets/skills/fimo-cli/references/labels.md +5 -7
  34. package/assets/skills/fimo-cli/references/locales.md +2 -4
  35. package/assets/skills/fimo-cli/references/mcp.md +2 -4
  36. package/assets/skills/fimo-cli/references/media.md +0 -2
  37. package/assets/skills/fimo-cli/references/preview.md +0 -2
  38. package/assets/skills/fimo-cli/references/project-vars-and-secrets.md +1 -3
  39. package/assets/skills/fimo-cli/references/projects.md +1 -3
  40. package/assets/skills/fimo-cli/references/schedules.md +0 -2
  41. package/assets/skills/fimo-cli/references/support.md +0 -2
  42. package/assets/skills/fimo-cli/references/webhooks.md +0 -2
  43. package/assets/skills/fimo-code/SKILL.md +11 -3
  44. package/assets/skills/fimo-code/references/assets.md +2 -2
  45. package/assets/skills/fimo-code/references/content/clients.md +5 -1
  46. package/assets/skills/fimo-code/references/content.md +3 -1
  47. package/assets/skills/fimo-code/references/frameworks/astro.md +127 -0
  48. package/assets/skills/fimo-code/references/frameworks/compatibility.md +19 -0
  49. package/assets/skills/fimo-code/references/frameworks/hosting.md +15 -3
  50. package/assets/skills/fimo-code/references/frameworks/react-router.md +37 -209
  51. package/assets/skills/fimo-code/references/frameworks/sveltekit.md +110 -0
  52. package/assets/skills/fimo-code/references/frameworks/vite-react.md +35 -166
  53. package/assets/skills/fimo-code/references/labels.md +16 -6
  54. package/assets/skills/fimo-code/references/locales.md +3 -1
  55. package/assets/skills/fimo-code/references/ui.md +19 -15
  56. package/assets/skills/fimo-migration/SKILL.md +99 -146
  57. package/assets/skills/fimo-migration/references/frameworks/nextjs.md +26 -0
  58. package/assets/skills/fimo-migration/references/inventory/coordinator.md +40 -0
  59. package/assets/skills/fimo-migration/references/inventory/locales/next-intl.md +39 -0
  60. package/assets/skills/fimo-migration/references/inventory/locales.md +41 -0
  61. package/assets/skills/fimo-migration/references/workflow.md +3 -2
  62. package/assets/skills/fimo-migration/scripts/inventory/locales/next-intl.mjs +459 -0
  63. package/assets/skills/fimo-studio/SKILL.md +1 -1
  64. package/assets/skills/fimo-studio/references/project-creation.md +10 -18
  65. package/assets/starters/fimo-site/template/.fimo/agents/content-guide/capabilities.yaml +0 -1
  66. package/assets/starters/fimo-site/template/.fimo/agents/site-review/capabilities.yaml +0 -1
  67. package/assets/sveltekit/components/Boolean.svelte +19 -0
  68. package/assets/sveltekit/components/Date.svelte +33 -0
  69. package/assets/sveltekit/components/FimoProvider.svelte +35 -0
  70. package/assets/sveltekit/components/Image.svelte +80 -0
  71. package/assets/sveltekit/components/Json.svelte +18 -0
  72. package/assets/sveltekit/components/Label.svelte +16 -0
  73. package/assets/sveltekit/components/Number.svelte +21 -0
  74. package/assets/sveltekit/components/RichText.svelte +19 -0
  75. package/assets/sveltekit/components/Text.svelte +30 -0
  76. package/assets/sveltekit/components/Video.svelte +37 -0
  77. package/assets/sveltekit/components/index.d.ts +10 -0
  78. package/assets/sveltekit/components/index.js +10 -0
  79. package/dist/build/astro/config.d.ts +4 -0
  80. package/dist/build/astro/config.js +64 -0
  81. package/dist/build/next/config.js +16 -0
  82. package/dist/build/sveltekit/config.d.ts +6 -0
  83. package/dist/build/sveltekit/config.js +8 -0
  84. package/dist/build/sveltekit/data-id.d.ts +3 -0
  85. package/dist/build/sveltekit/data-id.js +171 -0
  86. package/dist/build/sveltekit/vite.d.ts +13 -0
  87. package/dist/build/sveltekit/vite.js +15 -0
  88. package/dist/build/vite/index.js +2 -0
  89. package/dist/build/vite/plugins/data-id.d.ts +9 -0
  90. package/dist/build/vite/plugins/data-id.js +6 -1
  91. package/dist/build/vite/plugins/runtime-env.d.ts +21 -0
  92. package/dist/build/vite/plugins/runtime-env.js +68 -0
  93. package/dist/cli/bundle.json +1 -1
  94. package/dist/cli/index.js +108 -101
  95. package/dist/runtime/app/FimoProviders.d.ts +1 -1
  96. package/dist/runtime/app/FimoProviders.js +11 -5
  97. package/dist/runtime/astro/internal.d.ts +6 -0
  98. package/dist/runtime/astro/internal.js +16 -0
  99. package/dist/runtime/astro/preview.d.ts +14 -0
  100. package/dist/runtime/astro/preview.js +103 -0
  101. package/dist/runtime/astro/render-rich-text.d.ts +2 -0
  102. package/dist/runtime/astro/render-rich-text.js +1 -0
  103. package/dist/runtime/astro/server-runtime.d.ts +3 -0
  104. package/dist/runtime/astro/server-runtime.js +20 -0
  105. package/dist/runtime/astro/server.d.ts +15 -0
  106. package/dist/runtime/astro/server.js +14 -0
  107. package/dist/runtime/content/client/collection-core.d.ts +2 -17
  108. package/dist/runtime/content/client/collection-core.js +15 -8
  109. package/dist/runtime/content/client/core-types.d.ts +96 -0
  110. package/dist/runtime/content/client/core-types.js +1 -0
  111. package/dist/runtime/content/client/internal.d.ts +4 -4
  112. package/dist/runtime/content/client/internal.js +4 -3
  113. package/dist/runtime/content/client/runtime.d.ts +1 -1
  114. package/dist/runtime/content/client/server-content-client.d.ts +3 -3
  115. package/dist/runtime/content/client/server-content-client.js +2 -29
  116. package/dist/runtime/content/client/singleton-core.d.ts +2 -9
  117. package/dist/runtime/content/client/singleton-core.js +9 -4
  118. package/dist/runtime/content/client/types.d.ts +5 -115
  119. package/dist/runtime/content/index.d.ts +3 -3
  120. package/dist/runtime/labels/fetch.js +5 -3
  121. package/dist/runtime/next/client.d.ts +2 -1
  122. package/dist/runtime/next/facade.d.ts +1 -1
  123. package/dist/runtime/next/provider.js +1 -1
  124. package/dist/runtime/next/server-runtime.js +1 -1
  125. package/dist/runtime/next/server.d.ts +5 -4
  126. package/dist/runtime/paths/get-fimo-paths.js +8 -3
  127. package/dist/runtime/preview/bridge.d.ts +8 -0
  128. package/dist/runtime/preview/bridge.js +20 -0
  129. package/dist/runtime/preview/location.d.ts +23 -0
  130. package/dist/runtime/preview/location.js +93 -0
  131. package/dist/runtime/preview/routes.d.ts +10 -0
  132. package/dist/runtime/preview/routes.js +29 -0
  133. package/dist/runtime/primitives/index.d.ts +4 -1
  134. package/dist/runtime/primitives/index.js +1 -0
  135. package/dist/runtime/primitives/lib/image-optimization.d.ts +27 -2
  136. package/dist/runtime/primitives/lib/image-optimization.js +40 -0
  137. package/dist/runtime/primitives/lib/index.d.ts +1 -1
  138. package/dist/runtime/primitives/lib/primitives.d.ts +0 -54
  139. package/dist/runtime/primitives/lib/primitives.js +6 -0
  140. package/dist/runtime/primitives/lib/render-rich-text.d.ts +3 -0
  141. package/dist/runtime/primitives/lib/render-rich-text.js +112 -0
  142. package/dist/runtime/react/primitives/contracts.d.ts +40 -2
  143. package/dist/runtime/react/primitives/renderers/ImageRenderer.js +15 -34
  144. package/dist/runtime/react/primitives/renderers/RichTextRenderer.d.ts +2 -1
  145. package/dist/runtime/react/primitives/renderers/StaticImage.js +13 -30
  146. package/dist/runtime/routing/AppRoutesProvider.js +20 -8
  147. package/dist/runtime/shared/env-identity.d.ts +43 -0
  148. package/dist/runtime/shared/env-identity.js +88 -0
  149. package/dist/runtime/shared/local-runtime-env.d.ts +65 -0
  150. package/dist/runtime/shared/local-runtime-env.js +169 -0
  151. package/dist/runtime/{react-router → shared}/preview-location.d.ts +7 -13
  152. package/dist/runtime/{react-router → shared}/preview-location.js +26 -27
  153. package/dist/runtime/sveltekit/content.d.ts +25 -0
  154. package/dist/runtime/sveltekit/content.js +33 -0
  155. package/dist/runtime/sveltekit/context-contract.d.ts +5 -0
  156. package/dist/runtime/sveltekit/context-contract.js +2 -0
  157. package/dist/runtime/sveltekit/context.d.ts +8 -0
  158. package/dist/runtime/sveltekit/context.js +25 -0
  159. package/dist/runtime/sveltekit/index.d.ts +7 -0
  160. package/dist/runtime/sveltekit/index.js +4 -0
  161. package/dist/runtime/sveltekit/internal.d.ts +6 -0
  162. package/dist/runtime/sveltekit/internal.js +12 -0
  163. package/dist/runtime/sveltekit/labels.d.ts +16 -0
  164. package/dist/runtime/sveltekit/labels.js +13 -0
  165. package/dist/runtime/sveltekit/preview.d.ts +19 -0
  166. package/dist/runtime/sveltekit/preview.js +77 -0
  167. package/dist/runtime/sveltekit/runtime.d.ts +8 -0
  168. package/dist/runtime/sveltekit/runtime.js +17 -0
  169. package/dist/runtime/templates.d.ts +1 -1
  170. package/dist/runtime/templates.js +1 -1
  171. package/dist/runtime/vite/Label.d.ts +13 -0
  172. package/dist/runtime/vite/Label.js +16 -0
  173. package/dist/scripts/extract-translations.js +103 -43
  174. package/dist/scripts/sync-forms.js +1 -1
  175. package/dist/scripts/sync-schemas.js +83 -16
  176. package/package.json +57 -2
  177. package/release.json +2 -2
  178. package/templates/nextjs/AGENTS.md +10 -5
  179. package/templates/nextjs/_gitignore +1 -0
  180. package/templates/react-router/AGENTS.md +4 -3
  181. package/templates/react-router/package.json +1 -1
  182. package/templates/sveltekit/.fimo/config.json +15 -0
  183. package/templates/sveltekit/AGENTS.md +36 -0
  184. package/templates/sveltekit/CLAUDE.md +5 -0
  185. package/templates/sveltekit/_gitignore +16 -0
  186. package/templates/sveltekit/package.json +28 -0
  187. package/templates/sveltekit/pnpm-workspace.yaml +4 -0
  188. package/templates/sveltekit/src/app.html +11 -0
  189. package/templates/sveltekit/src/routes/+layout.server.ts +8 -0
  190. package/templates/sveltekit/src/routes/+layout.svelte +12 -0
  191. package/templates/sveltekit/src/routes/+page.svelte +48 -0
  192. package/templates/sveltekit/svelte.config.js +5 -0
  193. package/templates/sveltekit/tsconfig.json +14 -0
  194. package/templates/sveltekit/vite.config.ts +5 -0
  195. /package/assets/content-templates/{form-template.eta → forms/react.eta} +0 -0
  196. /package/assets/content-templates/{next-client-template.eta → next/client.eta} +0 -0
  197. /package/assets/content-templates/{next-server-template.eta → next/server.eta} +0 -0
  198. /package/assets/content-templates/{hooks-template.eta → react/client.eta} +0 -0
  199. /package/assets/content-templates/{types-template.eta → shared/types.eta} +0 -0
package/README.md CHANGED
@@ -29,6 +29,7 @@ Run the CLI with `npx` — no global install, always the latest:
29
29
  npx fimo@latest login
30
30
  npx fimo@latest init my-site # default React Router scaffold
31
31
  # or: npx fimo@latest init my-next-site --framework nextjs
32
+ # or: npx fimo@latest init my-svelte-site --framework sveltekit
32
33
  cd my-site
33
34
  ```
34
35
 
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { getFimoSource } from 'fimo/astro';
3
+
4
+ interface Props {
5
+ value: { valueOf(): boolean } | null | undefined;
6
+ as?: keyof astroHTML.JSX.IntrinsicElements;
7
+ [key: string]: unknown;
8
+ }
9
+
10
+ const { value, as: Component = 'span', ...props } = Astro.props;
11
+ const source = getFimoSource(value);
12
+ ---
13
+
14
+ {value != null && <Component {...props} data-fimo-source={source}>{String(value.valueOf())}</Component>}
@@ -0,0 +1,23 @@
1
+ ---
2
+ import { getFimoSource } from 'fimo/astro';
3
+
4
+ interface Props {
5
+ value: globalThis.Date | String | string | number | null | undefined;
6
+ locale?: string;
7
+ options?: Intl.DateTimeFormatOptions;
8
+ [key: string]: unknown;
9
+ }
10
+
11
+ const { value, locale, options, ...props } = Astro.props;
12
+ const rawValue = value instanceof String ? value.toString() : value;
13
+ const date = rawValue == null ? null : new globalThis.Date(rawValue as string | number | globalThis.Date);
14
+ const validDate = date && !Number.isNaN(date.getTime()) ? date : null;
15
+ const dateTime = validDate?.toISOString().split('T')[0];
16
+ const content = validDate?.toLocaleDateString(
17
+ locale,
18
+ options ?? { year: 'numeric', month: 'short', day: 'numeric' }
19
+ );
20
+ const source = getFimoSource(value);
21
+ ---
22
+
23
+ {validDate && <time {...props} datetime={dateTime} data-fimo-source={source}>{content}</time>}
@@ -0,0 +1,79 @@
1
+ ---
2
+ import type { FimoMedia } from 'fimo/astro';
3
+ import { getFimoSource } from 'fimo/astro';
4
+
5
+ import {
6
+ mergeAstroImageStyle,
7
+ resolveImagePresentation,
8
+ type ImageFit,
9
+ } from 'fimo/astro/internal';
10
+
11
+ interface Props {
12
+ value: FimoMedia | null | undefined;
13
+ alt?: string;
14
+ quality?: number;
15
+ fit?: ImageFit;
16
+ unoptimized?: boolean;
17
+ overrideSrc?: string;
18
+ width?: string | number;
19
+ height?: string | number;
20
+ sizes?: string;
21
+ srcset?: string;
22
+ srcSet?: string;
23
+ hostSuffixes?: readonly string[];
24
+ style?: string | Record<string, unknown>;
25
+ [key: string]: unknown;
26
+ }
27
+
28
+ const {
29
+ value,
30
+ alt,
31
+ quality,
32
+ fit,
33
+ unoptimized,
34
+ overrideSrc,
35
+ width,
36
+ height,
37
+ sizes,
38
+ srcset,
39
+ srcSet,
40
+ hostSuffixes,
41
+ style,
42
+ ...props
43
+ } = Astro.props;
44
+ const image = value
45
+ ? resolveImagePresentation({
46
+ src: value.url,
47
+ alt: alt ?? value.alt,
48
+ mediaWidth: value.width,
49
+ mediaHeight: value.height,
50
+ quality,
51
+ fit,
52
+ unoptimized,
53
+ overrideSrc,
54
+ width,
55
+ height,
56
+ sizes,
57
+ srcSet: srcset ?? srcSet,
58
+ hostSuffixes,
59
+ })
60
+ : null;
61
+ const imageStyle = image ? mergeAstroImageStyle(style, image.objectFit) : style;
62
+ const source = getFimoSource(value);
63
+ ---
64
+
65
+ {
66
+ image && (
67
+ <img
68
+ {...props}
69
+ src={image.src}
70
+ alt={image.alt}
71
+ width={image.width}
72
+ height={image.height}
73
+ sizes={image.sizes}
74
+ srcset={image.srcSet}
75
+ style={imageStyle}
76
+ data-fimo-source={source}
77
+ />
78
+ )
79
+ }
@@ -0,0 +1,14 @@
1
+ ---
2
+ import { getFimoSource } from 'fimo/astro';
3
+
4
+ interface Props {
5
+ value: unknown;
6
+ as?: keyof astroHTML.JSX.IntrinsicElements;
7
+ [key: string]: unknown;
8
+ }
9
+
10
+ const { value, as: Component = 'span', ...props } = Astro.props;
11
+ const source = getFimoSource(value);
12
+ ---
13
+
14
+ {value != null && <Component {...props} data-fimo-source={source}>{JSON.stringify(value)}</Component>}
@@ -0,0 +1,17 @@
1
+ ---
2
+ import type { FimoRichText } from 'fimo/astro';
3
+ import { getFimoSource } from 'fimo/astro';
4
+
5
+ import { renderRichTextHtml } from 'fimo/astro/internal';
6
+
7
+ interface Props {
8
+ value: FimoRichText | null | undefined;
9
+ [key: string]: unknown;
10
+ }
11
+
12
+ const { value, ...props } = Astro.props;
13
+ const source = getFimoSource(value);
14
+ const html = renderRichTextHtml(value?.content);
15
+ ---
16
+
17
+ {value && <div {...props} data-fimo-source={source} data-fimo-richtext="" set:html={html} />}
@@ -0,0 +1,66 @@
1
+ ---
2
+ import {
3
+ mergeAstroImageStyle,
4
+ resolveImagePresentation,
5
+ type ImageFit,
6
+ } from 'fimo/astro/internal';
7
+
8
+ interface Props {
9
+ src: string;
10
+ alt: string;
11
+ quality?: number;
12
+ fit?: ImageFit;
13
+ unoptimized?: boolean;
14
+ overrideSrc?: string;
15
+ width?: string | number;
16
+ height?: string | number;
17
+ sizes?: string;
18
+ srcset?: string;
19
+ srcSet?: string;
20
+ hostSuffixes?: readonly string[];
21
+ style?: string | Record<string, unknown>;
22
+ [key: string]: unknown;
23
+ }
24
+
25
+ const {
26
+ src,
27
+ alt,
28
+ quality,
29
+ fit,
30
+ unoptimized,
31
+ overrideSrc,
32
+ width,
33
+ height,
34
+ sizes,
35
+ srcset,
36
+ srcSet,
37
+ hostSuffixes,
38
+ style,
39
+ ...props
40
+ } = Astro.props;
41
+ const image = resolveImagePresentation({
42
+ src,
43
+ alt,
44
+ quality,
45
+ fit,
46
+ unoptimized,
47
+ overrideSrc,
48
+ width,
49
+ height,
50
+ sizes,
51
+ srcSet: srcset ?? srcSet,
52
+ hostSuffixes,
53
+ });
54
+ const imageStyle = mergeAstroImageStyle(style, image.objectFit);
55
+ ---
56
+
57
+ <img
58
+ {...props}
59
+ src={image.src}
60
+ alt={image.alt}
61
+ width={image.width}
62
+ height={image.height}
63
+ sizes={image.sizes}
64
+ srcset={image.srcSet}
65
+ style={imageStyle}
66
+ />
@@ -0,0 +1,23 @@
1
+ ---
2
+ import { getFimoParts, getFimoSource } from 'fimo/astro';
3
+
4
+ interface Props {
5
+ value: unknown;
6
+ as?: keyof astroHTML.JSX.IntrinsicElements;
7
+ [key: string]: unknown;
8
+ }
9
+
10
+ const { value, as: Component = 'span', ...props } = Astro.props;
11
+ const parts = getFimoParts(value);
12
+ const source = getFimoSource(value);
13
+ ---
14
+
15
+ <Component {...props} data-fimo-source={source}>
16
+ {
17
+ parts && parts.length > 1
18
+ ? parts.map((part) =>
19
+ part.source ? <span data-fimo-source={part.source}>{part.text}</span> : part.text
20
+ )
21
+ : String(value ?? '')
22
+ }
23
+ </Component>
@@ -0,0 +1,47 @@
1
+ ---
2
+ import type { FimoMedia } from 'fimo/astro';
3
+ import { getFimoSource } from 'fimo/astro';
4
+
5
+ interface Props {
6
+ value: FimoMedia | null | undefined;
7
+ overrideSrc?: string;
8
+ autoplay?: boolean;
9
+ autoPlay?: boolean;
10
+ loop?: boolean;
11
+ muted?: boolean;
12
+ playsinline?: boolean;
13
+ playsInline?: boolean;
14
+ [key: string]: unknown;
15
+ }
16
+
17
+ const {
18
+ value,
19
+ overrideSrc,
20
+ autoplay,
21
+ autoPlay,
22
+ loop = true,
23
+ muted = true,
24
+ playsinline,
25
+ playsInline,
26
+ ...props
27
+ } = Astro.props;
28
+ const source = getFimoSource(value);
29
+ const shouldAutoplay = autoplay ?? autoPlay ?? true;
30
+ const shouldPlayInline = playsinline ?? playsInline ?? true;
31
+ ---
32
+
33
+ {
34
+ value && (
35
+ <video
36
+ {...props}
37
+ src={overrideSrc ?? value.url}
38
+ width={value.width}
39
+ height={value.height}
40
+ autoplay={shouldAutoplay}
41
+ loop={loop}
42
+ muted={muted}
43
+ playsinline={shouldPlayInline}
44
+ data-fimo-source={source}
45
+ />
46
+ )
47
+ }
@@ -0,0 +1,8 @@
1
+ export { default as Boolean } from './Boolean.astro';
2
+ export { default as Date } from './Date.astro';
3
+ export { default as Image } from './Image.astro';
4
+ export { default as Json } from './Json.astro';
5
+ export { default as RichText } from './RichText.astro';
6
+ export { default as StaticImage } from './StaticImage.astro';
7
+ export { default as Text } from './Text.astro';
8
+ export { default as Video } from './Video.astro';
@@ -0,0 +1,8 @@
1
+ export { default as Boolean } from './Boolean.astro';
2
+ export { default as Date } from './Date.astro';
3
+ export { default as Image } from './Image.astro';
4
+ export { default as Json } from './Json.astro';
5
+ export { default as RichText } from './RichText.astro';
6
+ export { default as StaticImage } from './StaticImage.astro';
7
+ export { default as Text } from './Text.astro';
8
+ export { default as Video } from './Video.astro';
@@ -0,0 +1,56 @@
1
+ // AUTO-GENERATED by `fimo` from src/schemas/<%= model.uid %>.json - DO NOT EDIT.
2
+ // Runtime implementation lives in the project-local <%= runtimeImport %> package export.
3
+ <% if (model.isSingleton) { -%>
4
+ import { createSingletonClient } from "<%= runtimeImport %>";
5
+ import type { ContentSchema, SingletonContentClient } from "<%= runtimeImport %>";
6
+ <% } else { -%>
7
+ import { createContentClient } from "<%= runtimeImport %>";
8
+ import type { CollectionContentClient, ContentSchema } from "<%= runtimeImport %>";
9
+ <% } -%>
10
+
11
+ import schema from "./<%= model.uid %>.json";
12
+ <%
13
+ if (model.referenceImports && model.referenceImports.length > 0) {
14
+ model.referenceImports.forEach((referenceImport) => {
15
+ -%>
16
+ import * as <%= referenceImport.pascal %> from "./<%= referenceImport.pascal %>";
17
+ <%
18
+ });
19
+ }
20
+ if (model.isSingleton) {
21
+ -%>
22
+ import type { <%= model.pascal %>, <%= model.pascal %>Input } from "./<%= model.pascal %>.types";
23
+ <% } else { -%>
24
+ import type { <%= model.pascal %>, <%= model.pascal %>Fields, <%= model.pascal %>Input, <%= model.pascal %>Populate, <%= model.pascal %>Query } from "./<%= model.pascal %>.types";
25
+ <% } -%>
26
+
27
+ export type { <%= model.pascal %>, <%= model.pascal %>Fields, <%= model.pascal %>FimoMeta, <%= model.pascal %>Input, <%= model.pascal %>Populate, <%= model.pascal %>Query, <%= model.pascal %>References, <%= model.pascal %>Result, <%= model.pascal %>Sort, <%= model.pascal %>Where } from "./<%= model.pascal %>.types";
28
+ <% if (!model.isSingleton) { -%>
29
+ export type { CollectionPage, CollectionPageInfo } from "<%= runtimeImport %>";
30
+ <% } -%>
31
+
32
+ <% if (model.isSingleton) { -%>
33
+ const client: SingletonContentClient<<%= model.pascal %>, <%= model.pascal %>Input> = createSingletonClient<
34
+ <%= model.pascal %>,
35
+ <%= model.pascal %>Input
36
+ >({
37
+ schema: schema as unknown as ContentSchema,
38
+ <% } else { -%>
39
+ const client: CollectionContentClient<<%= model.pascal %>, <%= model.pascal %>Input> = createContentClient<
40
+ <%= model.pascal %>,
41
+ <%= model.pascal %>Input
42
+ >({
43
+ schema: schema as unknown as ContentSchema,
44
+ <% } -%>
45
+ <% if (model.referenceImports && model.referenceImports.length > 0) { -%>
46
+ references: { <%= model.referenceImports.map((referenceImport) => referenceImport.pascal).join(", ") %> },
47
+ <% } -%>
48
+ });
49
+
50
+ <% if (model.isSingleton) { -%>
51
+ export const { get, update, wrapWithSource, meta } = client;
52
+ <% } else { -%>
53
+ export const { wrapWithSource, meta, getById, getBySlug, getByField, list, get, create, update, remove } = client;
54
+ <% } -%>
55
+
56
+ export default client;
@@ -0,0 +1,86 @@
1
+ // AUTO-GENERATED by `fimo` from src/schemas/<%= model.uid %>.json - DO NOT EDIT.
2
+ // This isomorphic module is safe in SvelteKit server and universal load functions.
3
+ import { env } from "$env/dynamic/public";
4
+ <% if (model.isSingleton) { -%>
5
+ import { createSingletonClient, serializeContent } from "<%= runtimeImport %>";
6
+ import type { ContentSchema, SerializedContent, SingletonContentClient } from "<%= runtimeImport %>";
7
+ <% } else { -%>
8
+ import { createContentClient, serializeContent } from "<%= runtimeImport %>";
9
+ import type { CollectionContentClient, ContentSchema, SerializedContent } from "<%= runtimeImport %>";
10
+ <% } -%>
11
+
12
+ import schema from "./<%= model.uid %>.json";
13
+ import fimoConfig from "../../.fimo/config.json";
14
+ <%
15
+ if (model.referenceImports && model.referenceImports.length > 0) {
16
+ model.referenceImports.forEach((referenceImport) => {
17
+ -%>
18
+ import * as <%= referenceImport.pascal %> from "./<%= referenceImport.pascal %>";
19
+ <%
20
+ });
21
+ }
22
+ if (model.isSingleton) {
23
+ -%>
24
+ import type { <%= model.pascal %>, <%= model.pascal %>Input } from "./<%= model.pascal %>.types";
25
+ <% } else { -%>
26
+ import type { <%= model.pascal %>, <%= model.pascal %>Fields, <%= model.pascal %>Input, <%= model.pascal %>Populate, <%= model.pascal %>Query } from "./<%= model.pascal %>.types";
27
+ <% } -%>
28
+
29
+ export type { <%= model.pascal %>, <%= model.pascal %>Fields, <%= model.pascal %>FimoMeta, <%= model.pascal %>Input, <%= model.pascal %>Populate, <%= model.pascal %>Query, <%= model.pascal %>References, <%= model.pascal %>Result, <%= model.pascal %>Sort, <%= model.pascal %>Where } from "./<%= model.pascal %>.types";
30
+ <% if (!model.isSingleton) { -%>
31
+ export type { CollectionPage, CollectionPageInfo } from "<%= runtimeImport %>";
32
+ <% } -%>
33
+
34
+ <% if (model.isSingleton) { -%>
35
+ const client: SingletonContentClient<<%= model.pascal %>, <%= model.pascal %>Input> = createSingletonClient<
36
+ <%= model.pascal %>,
37
+ <%= model.pascal %>Input
38
+ >({
39
+ schema: schema as unknown as ContentSchema,
40
+ apiUrl: env.PUBLIC_FIMO_API_URL,
41
+ defaultLocale: (fimoConfig as { i18n?: { defaultLocale?: string } }).i18n?.defaultLocale,
42
+ <% } else { -%>
43
+ const client: CollectionContentClient<<%= model.pascal %>, <%= model.pascal %>Input> = createContentClient<
44
+ <%= model.pascal %>,
45
+ <%= model.pascal %>Input
46
+ >({
47
+ schema: schema as unknown as ContentSchema,
48
+ apiUrl: env.PUBLIC_FIMO_API_URL,
49
+ defaultLocale: (fimoConfig as { i18n?: { defaultLocale?: string } }).i18n?.defaultLocale,
50
+ <% } -%>
51
+ <% if (model.referenceImports && model.referenceImports.length > 0) { -%>
52
+ references: { <%= model.referenceImports.map((referenceImport) => referenceImport.pascal).join(", ") %> },
53
+ <% } -%>
54
+ });
55
+
56
+ type <%= model.pascal %>Source = Pick<<%= model.pascal %>, "id" | "__fimo">;
57
+ declare const SERIALIZED_CONTENT: unique symbol;
58
+
59
+ /** Plain data for passing <%= model.pascal %> content through a SvelteKit load boundary. */
60
+ export type Serialized<%= model.pascal %><
61
+ TValue extends <%= model.pascal %>Source | readonly <%= model.pascal %>Source[] = <%= model.pascal %>,
62
+ > = SerializedContent<TValue> & { readonly [SERIALIZED_CONTENT]: TValue };
63
+
64
+ export function serialize<TValue extends <%= model.pascal %>Source | readonly <%= model.pascal %>Source[]>(
65
+ value: TValue
66
+ ): Serialized<%= model.pascal %><TValue> {
67
+ return serializeContent(value) as Serialized<%= model.pascal %><TValue>;
68
+ }
69
+
70
+ <% if (model.isSingleton) { -%>
71
+ export const { get, update, wrapWithSource, meta } = client;
72
+ <% } else { -%>
73
+ export const { wrapWithSource, meta, getById, getBySlug, getByField, list, get, create, update, remove } = client;
74
+ <% } -%>
75
+
76
+ /** Restore Fimo source tracking after content crosses a SvelteKit load boundary. */
77
+ export function hydrate<TValue extends <%= model.pascal %>Source | readonly <%= model.pascal %>Source[]>(
78
+ value: Serialized<%= model.pascal %><TValue>
79
+ ): TValue {
80
+ if (Array.isArray(value)) {
81
+ return value.map((entry) => wrapWithSource(entry)) as unknown as TValue;
82
+ }
83
+ return wrapWithSource(value as unknown as Record<string, unknown>) as unknown as TValue;
84
+ }
85
+
86
+ export default client;
@@ -12,25 +12,34 @@ description: >-
12
12
  Fimo ships its skills through its CLI. `fimo-code` resolves from the project's installed `fimo` package;
13
13
  workflow skills resolve from the CLI you run. This file is only a pointer — fetch the real skill when needed.
14
14
 
15
+ If the initiating prompt supplies an exact Fimo CLI invocation prefix, preserve it for every Fimo command in
16
+ that flow. Replace `<fimo-cli>` below with that prefix; otherwise use `npx fimo@latest`. The detailed selector
17
+ rule and shorthand for the fetched workflow docs live in `fimo-cli`.
18
+
15
19
  When you are about to do Fimo work:
16
20
 
17
- 1. List what's available: `npx fimo@latest skills list`
18
- 2. Load the relevant skill: `npx fimo@latest skills get <name>` (add `--ref <doc>` for a reference doc)
21
+ 1. List what's available: `<fimo-cli> skills list`
22
+ 2. Load the relevant skill: `<fimo-cli> skills get <name>` (add `--ref <doc>` for a reference doc)
23
+
24
+ Streamed output opens with the fimo version that produced it. An older project runtime is normal, so never "fix" it. Quote that line when reporting bad guidance.
19
25
 
20
26
  Reference paths mentioned in streamed skill output, such as `references/media.md`, are identifiers,
21
27
  not files in the project. Load them through the CLI, for example
22
- `npx fimo@latest skills get fimo-cli --ref media`. Do not use a filesystem read tool for them.
28
+ `<fimo-cli> skills get fimo-cli --ref media`. Do not use a filesystem read tool for them.
23
29
 
24
30
  Pick by task:
25
31
 
26
32
  - Writing code — schemas/forms, generated clients, labels, framework adapters, rendering primitives → `fimo-code`
27
- - CLI commands and workflows — push, deploy, sync, labels, domains, analytics → `fimo-cli`
33
+ - Project creation, local setup, cloning, and CLI workflows — init, push, deploy, sync, labels, domains, analytics → `fimo-cli`
28
34
  - Fimo agents — create, configure, validate, deploy, run, or inspect them → `fimo-cli` (`references/agents.md`)
29
35
  - AI agent setup — connect Claude Code, Codex, Cursor, or another agent → `fimo-cli` (`references/agent-setup.md`)
30
36
  - Project MCP setup — configure `fimo mcp` for a local agent → `fimo-cli` (`references/mcp.md`)
31
37
  - The Fimo Studio dashboard / web app UI → `fimo-studio`
32
38
  - Migrating an existing site into Fimo → `fimo-migration`
33
39
 
40
+ For project setup, load `fimo-cli` first. Its `references/init.md` decision tree distinguishes a new or empty
41
+ project, an existing Fimo project, and an external migration; load `fimo-migration` for the last path.
42
+
34
43
  If a confirmed Fimo platform failure or missing capability materially blocks the task, finish or safely preserve the main work first, then use the built-in `supportReport` tool. Load the `fimo-cli` support instructions for the reporting criteria.
35
44
 
36
45
  If the project has an `AGENTS.md` (or `CLAUDE.md`), read it too — it carries project-specific context.
@@ -11,17 +11,17 @@ description: >-
11
11
 
12
12
  The `fimo` CLI is the workflow surface for Fimo. Fimo connects content, media, forms, analytics, editing, and hosting to web applications. The CLI handles project creation, content / forms / media / labels / locale workflows, deploys, collaboration, account management, Fimo agents, AI credit inspection, and AI agent setup.
13
13
 
14
- This skill describes **what the CLI does and the workflows it drives**. For the package surface used IN code (component props, generated hooks, JSON shapes, code-side rules), load the `fimo-code` skill on demand with `npx fimo@latest skills get fimo-code`.
14
+ This skill describes **what the CLI does and the workflows it drives**. For the package surface used IN code (component props, generated hooks, JSON shapes, code-side rules), load the `fimo-code` skill on demand with `fimo skills get fimo-code`, using the invocation prefix below.
15
15
 
16
16
  Use `fimo <command> --help` for full flag details on any command.
17
17
 
18
18
  > **Webhooks are beta.** Verify a destination with `fimo webhooks test <id> --wait` and inspect its delivery history before depending on it in production.
19
19
 
20
- ## Running the CLI: always `npx fimo@latest`
20
+ ## Running the CLI
21
21
 
22
- Run every command as **`npx fimo@latest <command>`**. It always fetches the latest CLI — no install, nothing to keep up to date, and it can't fall behind and get blocked. Do **not** install `fimo` globally.
22
+ Use **`npx fimo@latest`** by default. If the initiating prompt supplies another Fimo CLI selector, such as `npx fimo@staging` or `npx fimo@0.14.0`, preserve that selector for every Fimo command in the same flow. Do **not** install `fimo` globally.
23
23
 
24
- The examples in this skill and its references write `fimo <command>` for brevity — mentally prefix them with `npx fimo@latest`.
24
+ The examples in this skill and its references use `fimo <command>` as shorthand. Execute them with the selected invocation above.
25
25
 
26
26
  ## Output for agents: `--json` is the stable contract
27
27
 
@@ -49,23 +49,22 @@ A project can have multiple **envs** — each is a git branch _plus_ its own DB,
49
49
  ## Quick Start
50
50
 
51
51
  ```bash
52
- npx fimo@latest login # authenticate via browser
53
- npx fimo@latest skills install # install the global Fimo skill for your AI tools
54
- npx fimo@latest init my-site --org <id> # one-stop setup: sign in, create/link a project, install deps + skills. Use the org **id** from `fimo orgs list`, NOT the slug.
55
- npx fimo@latest init my-next-site --framework nextjs --org <id> # opt-in Next.js App Router scaffold
56
- npx fimo@latest init my-site --starter fimo-site@1 --org <id> --yes --no-skills # opt-in content-led starter for a new project
57
- npx fimo@latest init --project-id <id> my-site # link an EXISTING project instead of creating one
58
- npx fimo@latest clone # interactively choose an existing project to clone locally
59
- cd my-site # then load skills on demand: npx fimo@latest skills get fimo-code
52
+ fimo login # authenticate via browser
53
+ fimo skills install # install the global Fimo skill for your AI tools
54
+ fimo init my-site --org <id> # one-stop setup: sign in, create/link a project, install deps + skills. Use the org **id** from `fimo orgs list`, NOT the slug.
55
+ fimo init my-site --starter fimo-site@1 --org <id> --yes --no-skills # opt-in content-led starter for a new project
56
+ fimo init --project-id <id> my-site # set up a project by ID: scaffold a newly created project or clone existing code
57
+ fimo clone # interactively choose an existing project to clone locally
58
+ cd my-site # then load skills on demand: fimo skills get fimo-code
60
59
  pnpm dev # run the app locally (use the project's PM: pnpm/npm run/yarn/bun) — your iteration loop
61
- npx fimo@latest credits # inspect the owning org's AI credit balance (read-only)
62
- npx fimo@latest history list # inspect this environment's restore points
63
- npx fimo@latest validate # run all checks + codegen; fails on missing DB labels
64
- npx fimo@latest deploy # ON-DEMAND: hosted preview / shareable link (runs validate internally)
65
- npx fimo@latest deploy --publish # ON-DEMAND: publish live (only when the developer says "ship it")
60
+ fimo credits # inspect the owning org's AI credit balance (read-only)
61
+ fimo history list # inspect this environment's restore points
62
+ fimo validate # run all checks + codegen; fails on missing DB labels
63
+ fimo deploy # ON-DEMAND: hosted preview / shareable link (runs validate internally)
64
+ fimo deploy --publish # ON-DEMAND: publish live (only when the developer says "ship it")
66
65
  ```
67
66
 
68
- The working loop is local: run the app with the project's package-manager `dev` script (`pnpm dev` / `npm run dev` / `yarn dev` / `bun dev` — match the lockfile), ask the developer what they want, edit, and iterate against the live localhost server. `fimo deploy` is **not** a required final step — reach for it only when the developer wants a hosted preview, a shareable link, or to go live, and only on their signal (see `references/deploy.md`).
67
+ The working loop is local: run the app with the project's package-manager `dev` script (`pnpm dev` / `npm run dev` / `yarn dev` / `bun dev` — match the lockfile), ask the developer what they want, edit, and iterate against the live localhost server. Outside the first-time onboarding rule below, `fimo deploy` is **not** a required final step — reach for it only when the developer wants a hosted preview, a shareable link, or to go live, and only on their signal (see `references/deploy.md`).
69
68
 
70
69
  `fimo validate` is the single entrypoint for "prove this project is ready" — it covers schema/form codegen, route metadata checks, lint, and missing label checks for `i18n.defaultLocale` from `.fimo/config.json` (fallback: `en`). Use `fimo labels set` / `set-many` to create or update label values in the DB. The underlying phases are also available individually under the hidden `fimo scripts` namespace for advanced/debug use.
71
70
 
@@ -74,13 +73,13 @@ The working loop is local: run the app with the project's package-manager `dev`
74
73
  Load the matching reference when the user's request fires its trigger. Recipes that involve writing code also need the `fimo-code` skill's package references — they're called out where relevant.
75
74
 
76
75
  - "Create a new Fimo project / scaffold a site / start a new website / add the opt-in content starter / link an existing project locally" → `references/init.md`
77
- - "Add a content type / blog / products / pages / CMS" → `references/content.md` (workflow) **+ run `npx fimo@latest skills get fimo-code --ref content/schema` and load the detected framework reference**
78
- - "Add a contact / signup / feedback / newsletter form" → `references/forms.md` (workflow) **+ run `npx fimo@latest skills get fimo-code --ref forms` for the JSON spec and generated client**
76
+ - "Add a content type / blog / products / pages / CMS" → `references/content.md` (workflow) **+ run `fimo skills get fimo-code --ref content/schema` and load the detected framework reference**
77
+ - "Add a contact / signup / feedback / newsletter form" → `references/forms.md` (workflow) **+ run `fimo skills get fimo-code --ref forms` for the JSON spec and generated client**
79
78
  - "View form submissions / who filled out the contact form / inspect what users sent / how many signups" → `references/forms.md` § Reading submissions
80
- - "Upload an image / hero / cover / existing media file" → `references/assets.md` (workflow: upload, browse, open, delete) **+ run `npx fimo@latest skills get fimo-code --ref assets` for the `FimoMedia` shape and rendering**
81
- - "Generate AI image / video / draft preview / image edit / cover from a prompt" → `references/media.md` (task commands, quality, recipes, and verification) **+ run `npx fimo@latest skills get fimo-code --ref assets` for the `FimoMedia` shape if you'll plug the result into UI**
82
- - "Add labels / update static copy / fix missing `t()` values" → `references/labels.md` (workflow) **+ run `npx fimo@latest skills get fimo-code --ref labels` and load the detected framework reference**
83
- - "Enable locales / configure default locale / integrate an existing locale system" → `references/locales.md` **+ run `npx fimo@latest skills get fimo-code --ref locales` and load the detected framework locale reference**
79
+ - "Upload an image / hero / cover / existing media file" → `references/assets.md` (workflow: upload, browse, open, delete) **+ run `fimo skills get fimo-code --ref assets` for the `FimoMedia` shape and rendering**
80
+ - "Generate AI image / video / draft preview / image edit / cover from a prompt" → `references/media.md` (task commands, quality, recipes, and verification) **+ run `fimo skills get fimo-code --ref assets` for the `FimoMedia` shape if you'll plug the result into UI**
81
+ - "Add labels / update static copy / fix missing `t()` values" → `references/labels.md` (workflow) **+ run `fimo skills get fimo-code --ref labels` and load the detected framework reference**
82
+ - "Enable locales / configure default locale / integrate an existing locale system" → `references/locales.md` **+ run `fimo skills get fimo-code --ref locales` and load the detected framework locale reference**
84
83
  - "What's in this project / show the project structure / describe the project / what schemas does it have / how many routes / project tree / show me what's here" → `references/describe.md`
85
84
  - "Deploy / publish / go live / push my changes" → `references/deploy.md`
86
85
  - "Get the preview URL / open the preview / what's the URL for this env / refresh the preview link / I just want to see the site / the preview URL stopped working" → `references/preview.md`
@@ -113,10 +112,11 @@ Load the matching reference when the user's request fires its trigger. Recipes t
113
112
  These fire at specific moments in the project lifecycle. **Surface them proactively** rather than waiting for the user to ask:
114
113
 
115
114
  - **Right after `fimo init`** → `cd` into the new directory, read the project's `AGENTS.md` (or `CLAUDE.md` for Claude Code), run `fimo describe --json`, then load `fimo-code` and only the task/framework references it routes to. The rules file came into existence mid-session and may not be auto-loaded by the harness. See `references/init.md` § Load the project context.
115
+ - **When `fimo init` created or scaffolded a new project (create-new path, including a Studio-supplied `--project-id`)** → after init and context loading succeed, run the single first-preview deploy and return the preview and dashboard links — see `references/init.md` § Create the first hosted preview. That deploy is also the sandbox warm-up; never run a separate warm-up deploy. Skip it only if the user explicitly said not to deploy. Linking a project with existing code and migrations keep their own approval rules.
116
116
  - **Right after `fimo init`** → suggest `fimo rename "<Display Name>"` to set a human-readable name (the default post-init name is an auto-generated slug). Infer the name from what the user is building (e.g. "Acme Coffee" for a café, "Jane Doe Portfolio" for a personal site). See `references/init.md`.
117
- - **Right after `fimo init`** → start the app locally with the project's package-manager `dev` script (`pnpm dev` / `npm run dev` / `yarn dev` / `bun dev`) in the background, then ask the developer what they want to build. This localhost server with live reload is your iteration loop — edit, show, repeat. No deploy is needed to see local changes.
118
- - **When a user-visible unit of work looks done** → **offer** to deploy (`fimo deploy` for a hosted preview / shareable link, `fimo deploy --publish` to go live) and run it only after the developer confirms — or immediately if they ask. Never deploy on your own. See `references/deploy.md`.
119
- - **Optional, if you already know a deploy is coming** → warm the sandbox early with `fimo deploy -m "chore: init" &` in the background so the one-time ~15-30s provision + dep install happens while you work and the real deploy lands warm (~4-10s). This is a perf optimization, not a requirement. See `references/deploy.md` § Warm the sandbox early in a session.
117
+ - **Right after `fimo init`** → start the app locally with the project's package-manager `dev` script (`pnpm dev` / `npm run dev` / `yarn dev` / `bun dev`) in the background. This localhost server with live reload is your iteration loop — edit, show, repeat. No deploy is needed to see local changes. If the initiating request did not say what to build, ask the developer — after the first preview on the create-new path, never as a blocker before initializing.
118
+ - **When a user-visible unit of work looks done outside first-time onboarding** → **offer** to deploy (`fimo deploy` for a hosted preview / shareable link, `fimo deploy --publish` to go live) and run it only after the developer confirms — or immediately if they ask. Never deploy ordinary edits on your own. See `references/deploy.md`.
119
+ - **Optional, outside new-project onboarding (its first preview already warms the sandbox), if you already know a deploy is coming** → warm the sandbox early with `fimo deploy -m "chore: init" &` in the background so the one-time ~15-30s provision + dep install happens while you work and the real deploy lands warm (~4-10s). This is a perf optimization, not a requirement. See `references/deploy.md` § Warm the sandbox early in a session.
120
120
  - **Iterative code-only deploys** → once you are deploying, `fimo deploy --no-restart` skips the sandbox dev-server restart on HMR-safe edits. See `references/deploy.md` § Skipping the dev-server restart for when it's safe.
121
121
  - **You need the current preview URL but haven't changed code** (opening it, screenshotting it, handing it to another tool, the previous URL expired) → `fimo preview url`, never a no-op `fimo deploy`. See `references/preview.md`.
122
122
  - **When the user wants to try something risky / explore a redesign without touching the live site** → suggest a feature env: `fimo checkout -b <name>` gives an isolated branch + DB + preview. Deploy previews there, then `fimo merge` it back and `fimo publish`. See `references/branches.md`.
@@ -128,7 +128,7 @@ These fire at specific moments in the project lifecycle. **Surface them proactiv
128
128
 
129
129
  - **Editing `.fimo/project.json`** — read-only; it's the link between local and remote project. Treat as a generated file.
130
130
  - **Treating `fimo deploy` as the working loop or a required final step** — the loop is local (`pnpm dev` etc.). Deploy commits + pushes + round-trips the sandbox; it's for hosted previews / going live, on-demand. Iterate locally and deploy at logical breakpoints. See `references/deploy.md`.
131
- - **Deploying without the developer asking or confirming** — offer, then wait for their yes. Don't auto-deploy after finishing an edit.
131
+ - **Deploying without the developer asking or confirming** — new-project onboarding authorizes exactly one automatic first preview deploy (unless the user said not to deploy); every other deploy is offer-then-confirm. Don't auto-deploy after finishing an ordinary edit.
132
132
  - **Running `fimo deploy` just to get a fresh preview URL** — that's a commit + push + sandbox sync for what should be a sub-second read. Use `fimo preview url` instead. See `references/preview.md`.
133
133
  - **Using `fimo deploy --publish` casually** — `--publish` makes the site live to the public. Plain `fimo deploy` (preview) is the default. Use `--publish` only when the user says "ship it" / "go live" / "publish".
134
134
  - **Bare `fimo init` in a non-interactive shell** — will hang. Always pass `[dir]`, `--no-install` (or `--install`), `--no-skills` (or `--skills`), and `--org`/`--agents` as needed explicitly when scripted.
@@ -1,7 +1,5 @@
1
1
  # Account, authentication, and organizations
2
2
 
3
- > **Run via `npx fimo@latest <command>`** — always the latest CLI, no install needed.
4
-
5
3
  The `fimo` CLI authenticates against the Fimo platform via a browser-based flow. Credentials are stored **per backend** at `~/.config/fimo/credentials/<host>-<hash>.json` (so a localhost dev backend and production don't clobber each other) and used by every CLI command that talks to the Fimo API.
6
4
 
7
5
  ## Sign in