fimo 0.14.0-staging.2 → 0.14.0-staging.4
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 -2
- package/assets/skills/fimo-cli/SKILL.md +1 -0
- package/assets/skills/fimo-cli/references/init.md +18 -2
- package/assets/skills/fimo-cli/references/projects.md +1 -1
- package/assets/skills/fimo-code/references/frameworks/next/locales.md +1 -1
- package/assets/skills/fimo-code/references/frameworks/react-router.md +1 -1
- package/assets/skills/fimo-code/references/locales.md +1 -1
- package/dist/cli/bundle.json +1 -1
- package/dist/cli/index.js +6 -6
- package/dist/runtime/app/FimoScripts.js +1 -1
- package/dist/runtime/templates.d.ts +1 -1
- package/dist/runtime/templates.js +1 -1
- package/package.json +1 -1
- package/templates/nextjs/.fimo/config.json +15 -0
- package/templates/nextjs/AGENTS.md +47 -0
- package/templates/nextjs/CLAUDE.md +5 -0
- package/templates/nextjs/_gitignore +16 -0
- package/templates/nextjs/next.config.ts +6 -0
- package/templates/nextjs/package.json +30 -0
- package/templates/nextjs/pnpm-workspace.yaml +4 -0
- package/templates/nextjs/src/app/globals.css +48 -0
- package/templates/nextjs/src/app/layout.tsx +17 -0
- package/templates/nextjs/src/app/page.tsx +9 -0
- package/templates/nextjs/tsconfig.json +23 -0
- package/templates/react-router/package.json +1 -1
package/README.md
CHANGED
|
@@ -27,7 +27,8 @@ Run the CLI with `npx` — no global install, always the latest:
|
|
|
27
27
|
|
|
28
28
|
```bash
|
|
29
29
|
npx fimo@latest login
|
|
30
|
-
npx fimo@latest init my-site
|
|
30
|
+
npx fimo@latest init my-site # default React Router scaffold
|
|
31
|
+
# or: npx fimo@latest init my-next-site --framework nextjs
|
|
31
32
|
cd my-site
|
|
32
33
|
```
|
|
33
34
|
|
|
@@ -43,7 +44,7 @@ npx fimo@latest skills install --mode=copy
|
|
|
43
44
|
|
|
44
45
|
## Local development
|
|
45
46
|
|
|
46
|
-
A Fimo project is a standard
|
|
47
|
+
A Fimo project is a standard framework application. Run its normal package scripts:
|
|
47
48
|
|
|
48
49
|
```bash
|
|
49
50
|
npm install
|
|
@@ -52,6 +52,7 @@ A project can have multiple **envs** — each is a git branch _plus_ its own DB,
|
|
|
52
52
|
npx fimo@latest login # authenticate via browser
|
|
53
53
|
npx fimo@latest skills install # install the global Fimo skill for your AI tools
|
|
54
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
|
|
55
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
|
|
56
57
|
npx fimo@latest init --project-id <id> my-site # link an EXISTING project instead of creating one
|
|
57
58
|
npx fimo@latest clone # interactively choose an existing project to clone locally
|
|
@@ -13,7 +13,7 @@ fimo init [dir] [options]
|
|
|
13
13
|
`fimo init` runs the full onboarding in one shot:
|
|
14
14
|
|
|
15
15
|
1. **Signs in automatically** — if there's no session it opens the browser loopback login. In `--json` / non-TTY with no session it fails with `NOT_AUTHENTICATED` (run `fimo login` first).
|
|
16
|
-
2. **Resolves the project** — with `--project-id <id>` it links an EXISTING project (clones it); without it, it creates a NEW project. An interactive TTY shows a "Create new / Link existing" picker; non-interactive shells default to create-new. An optional `--starter fimo-site@1` adds a
|
|
16
|
+
2. **Resolves the project** — with `--project-id <id>` it links an EXISTING project (clones it); without it, it creates a NEW project. An interactive TTY shows a "Create new / Link existing" picker; non-interactive shells default to create-new. New projects use React Router by default; `--framework nextjs` selects the minimal Next.js App Router scaffold. An optional `--starter fimo-site@1` adds a React-Router content starter only to a newly created project.
|
|
17
17
|
3. **Installs dependencies** — prompts for the package manager, or honor `--package-manager <pm>` / `--no-install`.
|
|
18
18
|
4. **Optionally sets up Fimo skills** — confirm prompt, or `--skills` / `--no-skills`.
|
|
19
19
|
|
|
@@ -23,6 +23,7 @@ fimo init [dir] [options]
|
|
|
23
23
|
| `--project-id <id>` | no | Link an EXISTING project instead of creating one (clones it). |
|
|
24
24
|
| `--org <id>` | no | Target organization **id** when creating (use the `ID` column from `fimo orgs list`, NOT the slug). Picker shown interactively if omitted and TTY. |
|
|
25
25
|
| `--env <name>` | no | Env to check out when linking an existing project (defaults to `main`). |
|
|
26
|
+
| `--framework <framework>` | no | New-project scaffold: `react-router` (default) or `nextjs` (App Router). Existing repositories are preserved. |
|
|
26
27
|
| `--starter <id>` | no | Opt-in project starter for create-new (currently `fimo-site@1`). It seeds CMS content, labels, a contact form, and manual-only agents. Rejects `--project-id`. |
|
|
27
28
|
| `--package-manager <pm>` | no | `npm` \| `pnpm` \| `yarn` \| `bun`. |
|
|
28
29
|
| `--install` / `--no-install` | yes in non-TTY | Install deps after checkout (or skip it). |
|
|
@@ -60,6 +61,21 @@ writing anything. If dependencies were skipped, install them and run
|
|
|
60
61
|
|
|
61
62
|
> **Zero-install:** run `npx fimo@latest init` — no global install needed. `fimo projects create` is also an alias of `fimo init` (create-new path).
|
|
62
63
|
|
|
64
|
+
### Choose the application framework
|
|
65
|
+
|
|
66
|
+
Omit `--framework` for the existing React Router scaffold, or select the
|
|
67
|
+
minimal Next.js App Router shell explicitly:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
npx fimo@latest init my-next-site --framework nextjs --org <organizationId>
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
The Next scaffold includes `src/app`, `FimoProvider`, the hosted-preview config,
|
|
74
|
+
and `.fimo/config.json#runtime.framework`. It intentionally contains no schema,
|
|
75
|
+
labels, or designed website. After init, load the project rules and `fimo-code`
|
|
76
|
+
to build the requested site. The current `fimo-site@1` content starter supports
|
|
77
|
+
React Router only.
|
|
78
|
+
|
|
63
79
|
For `--agents`, pass the AI tool you're running in: `--agents=claude-code` for Claude Code, `--agents=cursor` for Cursor, `--agents=codex` for Codex, etc. When the flag is omitted, env-var detection of the invoking harness (e.g. `CLAUDECODE` / `CLAUDE_CODE_ENTRYPOINT` → claude-code) auto-targets that agent; other agents must be selected explicitly via `--agents`/`-a` or the interactive picker.
|
|
64
80
|
|
|
65
81
|
## Linking an existing project
|
|
@@ -70,7 +86,7 @@ Pass `--project-id <id>` to link an EXISTING project instead of creating one. Th
|
|
|
70
86
|
|
|
71
87
|
`fimo init` (create-new path) scaffolds:
|
|
72
88
|
|
|
73
|
-
- The project
|
|
89
|
+
- The selected project shell: React Router by default, or Next.js App Router with `--framework nextjs`
|
|
74
90
|
- `.fimo/project.json` — links this directory to the remote project (read-only after creation)
|
|
75
91
|
- `.fimo/config.json` — project, route, locale, SEO, and agent policy
|
|
76
92
|
- `.fimo/agents/` — versioned agent bundles
|
|
@@ -8,7 +8,7 @@ Commands for listing projects across an org, cloning a remote project locally, a
|
|
|
8
8
|
|
|
9
9
|
```bash
|
|
10
10
|
fimo projects list [--org <id>] # list projects in an org (defaults to active org)
|
|
11
|
-
fimo projects create [dir] [--org <id>] [--install|--no-install]
|
|
11
|
+
fimo projects create [dir] [--org <id>] [--framework react-router|nextjs] [--install|--no-install]
|
|
12
12
|
fimo projects clone [projectId] [dir] [--env <name>] # clone an existing project locally
|
|
13
13
|
fimo projects delete [projectId] [-C <dir>] [-y] # delete (defaults to current project)
|
|
14
14
|
fimo projects publish [projectId] [-C <dir>] # make the project live (publish from main)
|
|
@@ -35,7 +35,7 @@ When labels are not needed at that boundary, use `<FimoProvider locale={locale}>
|
|
|
35
35
|
|
|
36
36
|
With `next-i18next`, keep its routing and translation provider for the strings it owns. Pass the same resolved locale to Fimo; do not replace the library or duplicate its route structure.
|
|
37
37
|
|
|
38
|
-
Before creating non-default Fimo labels or content variants, confirm that those locales are enabled for the linked Fimo project. `.fimo/config.json` documents the application's locale policy, but `fimo validate` does not
|
|
38
|
+
Before creating non-default Fimo labels or content variants, confirm that those locales are enabled for the linked Fimo project. Load `fimo-cli` with its `locales` reference and run `fimo locales add <locale> --yes --json`; `.fimo/config.json` documents the application's locale policy, but `fimo validate` does not add project locales.
|
|
39
39
|
|
|
40
40
|
## Ownership boundary
|
|
41
41
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Setup Fimo on React Router 8
|
|
2
2
|
|
|
3
3
|
This recipe describes the canonical Fimo + React Router framework-mode setup.
|
|
4
|
-
It mirrors
|
|
4
|
+
It mirrors the default `fimo init` scaffold; you can also apply it to an
|
|
5
5
|
existing RR project.
|
|
6
6
|
|
|
7
7
|
## Prerequisites
|
|
@@ -15,7 +15,7 @@ The application owns locale resolution and routing. Fimo consumes the resolved l
|
|
|
15
15
|
|
|
16
16
|
Keep one locale unless the product asks for multilingual output. Locale tags should be structurally valid, such as `en`, `pt-BR`, or `zh-Hans`.
|
|
17
17
|
|
|
18
|
-
For an already linked project,
|
|
18
|
+
For an already linked project, enable each locale in Fimo before writing non-default label or content variants. Load `fimo-cli` with its `locales` reference and run `fimo locales add <locale> --yes --json`; local config and `fimo validate` do not provision project locales. Do not change the application's route strategy to work around a missing locale.
|
|
19
19
|
|
|
20
20
|
## Application responsibilities
|
|
21
21
|
|
package/dist/cli/bundle.json
CHANGED
package/dist/cli/index.js
CHANGED
|
@@ -183,14 +183,14 @@ ${end2.comment}`:end2.comment}this.doc.range[2]=end2.offset;break}default:this.e
|
|
|
183
183
|
`)+1;for(;nl!==0;)this.onNewLine(this.offset+nl),nl=this.source.indexOf(`
|
|
184
184
|
`,nl)+1}yield*this.pop();break;default:yield*this.pop(),yield*this.step()}}*blockMap(map2){let it2=map2.items[map2.items.length-1];switch(this.type){case"newline":if(this.onKeyLine=!1,it2.value){let end2="end"in it2.value?it2.value.end:void 0;(Array.isArray(end2)?end2[end2.length-1]:void 0)?.type==="comment"?end2?.push(this.sourceToken):map2.items.push({start:[this.sourceToken]})}else it2.sep?it2.sep.push(this.sourceToken):it2.start.push(this.sourceToken);return;case"space":case"comment":if(it2.value)map2.items.push({start:[this.sourceToken]});else if(it2.sep)it2.sep.push(this.sourceToken);else{if(this.atIndentedComment(it2.start,map2.indent)){let end2=map2.items[map2.items.length-2]?.value?.end;if(Array.isArray(end2)){Array.prototype.push.apply(end2,it2.start),end2.push(this.sourceToken),map2.items.pop();return}}it2.start.push(this.sourceToken)}return}if(this.indent>=map2.indent){let atMapIndent=!this.onKeyLine&&this.indent===map2.indent,atNextItem=atMapIndent&&(it2.sep||it2.explicitKey)&&this.type!=="seq-item-ind",start=[];if(atNextItem&&it2.sep&&!it2.value){let nl=[];for(let i=0;i<it2.sep.length;++i){let st2=it2.sep[i];switch(st2.type){case"newline":nl.push(i);break;case"space":break;case"comment":st2.indent>map2.indent&&(nl.length=0);break;default:nl.length=0}}nl.length>=2&&(start=it2.sep.splice(nl[1]))}switch(this.type){case"anchor":case"tag":atNextItem||it2.value?(start.push(this.sourceToken),map2.items.push({start}),this.onKeyLine=!0):it2.sep?it2.sep.push(this.sourceToken):it2.start.push(this.sourceToken);return;case"explicit-key-ind":!it2.sep&&!it2.explicitKey?(it2.start.push(this.sourceToken),it2.explicitKey=!0):atNextItem||it2.value?(start.push(this.sourceToken),map2.items.push({start,explicitKey:!0})):this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken],explicitKey:!0}]}),this.onKeyLine=!0;return;case"map-value-ind":if(it2.explicitKey)if(it2.sep)if(it2.value)map2.items.push({start:[],key:null,sep:[this.sourceToken]});else if(includesToken(it2.sep,"map-value-ind"))this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start,key:null,sep:[this.sourceToken]}]});else if(isFlowToken(it2.key)&&!includesToken(it2.sep,"newline")){let start2=getFirstKeyStartProps(it2.start),key=it2.key,sep2=it2.sep;sep2.push(this.sourceToken),delete it2.key,delete it2.sep,this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:start2,key,sep:sep2}]})}else start.length>0?it2.sep=it2.sep.concat(start,this.sourceToken):it2.sep.push(this.sourceToken);else if(includesToken(it2.start,"newline"))Object.assign(it2,{key:null,sep:[this.sourceToken]});else{let start2=getFirstKeyStartProps(it2.start);this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:start2,key:null,sep:[this.sourceToken]}]})}else it2.sep?it2.value||atNextItem?map2.items.push({start,key:null,sep:[this.sourceToken]}):includesToken(it2.sep,"map-value-ind")?this.stack.push({type:"block-map",offset:this.offset,indent:this.indent,items:[{start:[],key:null,sep:[this.sourceToken]}]}):it2.sep.push(this.sourceToken):Object.assign(it2,{key:null,sep:[this.sourceToken]});this.onKeyLine=!0;return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let fs44=this.flowScalar(this.type);atNextItem||it2.value?(map2.items.push({start,key:fs44,sep:[]}),this.onKeyLine=!0):it2.sep?this.stack.push(fs44):(Object.assign(it2,{key:fs44,sep:[]}),this.onKeyLine=!0);return}default:{let bv=this.startBlockValue(map2);if(bv){if(bv.type==="block-seq"){if(!it2.explicitKey&&it2.sep&&!includesToken(it2.sep,"newline")){yield*this.pop({type:"error",offset:this.offset,message:"Unexpected block-seq-ind on same line with key",source:this.source});return}}else atMapIndent&&map2.items.push({start});this.stack.push(bv);return}}}}yield*this.pop(),yield*this.step()}*blockSequence(seq){let it2=seq.items[seq.items.length-1];switch(this.type){case"newline":if(it2.value){let end2="end"in it2.value?it2.value.end:void 0;(Array.isArray(end2)?end2[end2.length-1]:void 0)?.type==="comment"?end2?.push(this.sourceToken):seq.items.push({start:[this.sourceToken]})}else it2.start.push(this.sourceToken);return;case"space":case"comment":if(it2.value)seq.items.push({start:[this.sourceToken]});else{if(this.atIndentedComment(it2.start,seq.indent)){let end2=seq.items[seq.items.length-2]?.value?.end;if(Array.isArray(end2)){Array.prototype.push.apply(end2,it2.start),end2.push(this.sourceToken),seq.items.pop();return}}it2.start.push(this.sourceToken)}return;case"anchor":case"tag":if(it2.value||this.indent<=seq.indent)break;it2.start.push(this.sourceToken);return;case"seq-item-ind":if(this.indent!==seq.indent)break;it2.value||includesToken(it2.start,"seq-item-ind")?seq.items.push({start:[this.sourceToken]}):it2.start.push(this.sourceToken);return}if(this.indent>seq.indent){let bv=this.startBlockValue(seq);if(bv){this.stack.push(bv);return}}yield*this.pop(),yield*this.step()}*flowCollection(fc){let it2=fc.items[fc.items.length-1];if(this.type==="flow-error-end"){let top;do yield*this.pop(),top=this.peek(1);while(top?.type==="flow-collection")}else if(fc.end.length===0){switch(this.type){case"comma":case"explicit-key-ind":!it2||it2.sep?fc.items.push({start:[this.sourceToken]}):it2.start.push(this.sourceToken);return;case"map-value-ind":!it2||it2.value?fc.items.push({start:[],key:null,sep:[this.sourceToken]}):it2.sep?it2.sep.push(this.sourceToken):Object.assign(it2,{key:null,sep:[this.sourceToken]});return;case"space":case"comment":case"newline":case"anchor":case"tag":!it2||it2.value?fc.items.push({start:[this.sourceToken]}):it2.sep?it2.sep.push(this.sourceToken):it2.start.push(this.sourceToken);return;case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":{let fs44=this.flowScalar(this.type);!it2||it2.value?fc.items.push({start:[],key:fs44,sep:[]}):it2.sep?this.stack.push(fs44):Object.assign(it2,{key:fs44,sep:[]});return}case"flow-map-end":case"flow-seq-end":fc.end.push(this.sourceToken);return}let bv=this.startBlockValue(fc);bv?this.stack.push(bv):(yield*this.pop(),yield*this.step())}else{let parent2=this.peek(2);if(parent2.type==="block-map"&&(this.type==="map-value-ind"&&parent2.indent===fc.indent||this.type==="newline"&&!parent2.items[parent2.items.length-1].sep))yield*this.pop(),yield*this.step();else if(this.type==="map-value-ind"&&parent2.type!=="flow-collection"){let prev2=getPrevProps(parent2),start=getFirstKeyStartProps(prev2);fixFlowSeqItems(fc);let sep2=fc.end.splice(1,fc.end.length);sep2.push(this.sourceToken);let map2={type:"block-map",offset:fc.offset,indent:fc.indent,items:[{start,key:fc,sep:sep2}]};this.onKeyLine=!0,this.stack[this.stack.length-1]=map2}else yield*this.lineEnd(fc)}}flowScalar(type){if(this.onNewLine){let nl=this.source.indexOf(`
|
|
185
185
|
`)+1;for(;nl!==0;)this.onNewLine(this.offset+nl),nl=this.source.indexOf(`
|
|
186
|
-
`,nl)+1}return{type,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(parent2){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let prev2=getPrevProps(parent2),start=getFirstKeyStartProps(prev2);return start.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let prev2=getPrevProps(parent2),start=getFirstKeyStartProps(prev2);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(start,indent){return this.type!=="comment"||this.indent<=indent?!1:start.every(st2=>st2.type==="newline"||st2.type==="space")}*documentEnd(docEnd){this.type!=="doc-mode"&&(docEnd.end?docEnd.end.push(this.sourceToken):docEnd.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(token){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;case"space":case"comment":default:token.end?token.end.push(this.sourceToken):token.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};exports2.Parser=Parser2}});var require_public_api=__commonJS({"../../node_modules/.pnpm/yaml@2.8.2/node_modules/yaml/dist/public-api.js"(exports2){"use strict";var composer=require_composer(),Document2=require_Document(),errors=require_errors(),log=require_log(),identity2=require_identity(),lineCounter=require_line_counter(),parser=require_parser();function parseOptions(options){let prettyErrors=options.prettyErrors!==!1;return{lineCounter:options.lineCounter||prettyErrors&&new lineCounter.LineCounter||null,prettyErrors}}__name(parseOptions,"parseOptions");function parseAllDocuments(source,options={}){let{lineCounter:lineCounter2,prettyErrors}=parseOptions(options),parser$1=new parser.Parser(lineCounter2?.addNewLine),composer$1=new composer.Composer(options),docs=Array.from(composer$1.compose(parser$1.parse(source)));if(prettyErrors&&lineCounter2)for(let doc of docs)doc.errors.forEach(errors.prettifyError(source,lineCounter2)),doc.warnings.forEach(errors.prettifyError(source,lineCounter2));return docs.length>0?docs:Object.assign([],{empty:!0},composer$1.streamInfo())}__name(parseAllDocuments,"parseAllDocuments");function parseDocument2(source,options={}){let{lineCounter:lineCounter2,prettyErrors}=parseOptions(options),parser$1=new parser.Parser(lineCounter2?.addNewLine),composer$1=new composer.Composer(options),doc=null;for(let _doc of composer$1.compose(parser$1.parse(source),!0,source.length))if(!doc)doc=_doc;else if(doc.options.logLevel!=="silent"){doc.errors.push(new errors.YAMLParseError(_doc.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return prettyErrors&&lineCounter2&&(doc.errors.forEach(errors.prettifyError(source,lineCounter2)),doc.warnings.forEach(errors.prettifyError(source,lineCounter2))),doc}__name(parseDocument2,"parseDocument");function parse13(src,reviver,options){let _reviver;typeof reviver=="function"?_reviver=reviver:options===void 0&&reviver&&typeof reviver=="object"&&(options=reviver);let doc=parseDocument2(src,options);if(!doc)return null;if(doc.warnings.forEach(warning=>log.warn(doc.options.logLevel,warning)),doc.errors.length>0){if(doc.options.logLevel!=="silent")throw doc.errors[0];doc.errors=[]}return doc.toJS(Object.assign({reviver:_reviver},options))}__name(parse13,"parse");function stringify5(value,replacer,options){let _replacer=null;if(typeof replacer=="function"||Array.isArray(replacer)?_replacer=replacer:options===void 0&&replacer&&(options=replacer),typeof options=="string"&&(options=options.length),typeof options=="number"){let indent=Math.round(options);options=indent<1?void 0:indent>8?{indent:8}:{indent}}if(value===void 0){let{keepUndefined}=options??replacer??{};if(!keepUndefined)return}return identity2.isDocument(value)&&!_replacer?value.toString(options):new Document2.Document(value,_replacer,options).toString(options)}__name(stringify5,"stringify");exports2.parse=parse13;exports2.parseAllDocuments=parseAllDocuments;exports2.parseDocument=parseDocument2;exports2.stringify=stringify5}});var require_dist=__commonJS({"../../node_modules/.pnpm/yaml@2.8.2/node_modules/yaml/dist/index.js"(exports2){"use strict";var composer=require_composer(),Document2=require_Document(),Schema=require_Schema(),errors=require_errors(),Alias=require_Alias(),identity2=require_identity(),Pair=require_Pair(),Scalar=require_Scalar(),YAMLMap=require_YAMLMap(),YAMLSeq=require_YAMLSeq(),cst=require_cst(),lexer=require_lexer(),lineCounter=require_line_counter(),parser=require_parser(),publicApi=require_public_api(),visit2=require_visit();exports2.Composer=composer.Composer;exports2.Document=Document2.Document;exports2.Schema=Schema.Schema;exports2.YAMLError=errors.YAMLError;exports2.YAMLParseError=errors.YAMLParseError;exports2.YAMLWarning=errors.YAMLWarning;exports2.Alias=Alias.Alias;exports2.isAlias=identity2.isAlias;exports2.isCollection=identity2.isCollection;exports2.isDocument=identity2.isDocument;exports2.isMap=identity2.isMap;exports2.isNode=identity2.isNode;exports2.isPair=identity2.isPair;exports2.isScalar=identity2.isScalar;exports2.isSeq=identity2.isSeq;exports2.Pair=Pair.Pair;exports2.Scalar=Scalar.Scalar;exports2.YAMLMap=YAMLMap.YAMLMap;exports2.YAMLSeq=YAMLSeq.YAMLSeq;exports2.CST=cst;exports2.Lexer=lexer.Lexer;exports2.LineCounter=lineCounter.LineCounter;exports2.Parser=parser.Parser;exports2.parse=publicApi.parse;exports2.parseAllDocuments=publicApi.parseAllDocuments;exports2.parseDocument=publicApi.parseDocument;exports2.stringify=publicApi.stringify;exports2.visit=visit2.visit;exports2.visitAsync=visit2.visitAsync}});import fs5 from"node:fs";import path5 from"node:path";import{fileURLToPath as fileURLToPath3}from"node:url";function getTemplatePath(framework=DEFAULT_TEMPLATE){return path5.resolve(PACKAGE_ROOT,"templates",framework)}function readReleaseMeta(){try{let raw=fs5.readFileSync(RELEASE_FILE2,"utf8"),parsed=JSON.parse(raw);return{source:parsed.source==="npm"||parsed.source==="dev"?parsed.source:null}}catch{return{source:null}}}function readCliSemver(){try{let raw=fs5.readFileSync(PACKAGE_JSON_FILE,"utf8"),parsed=JSON.parse(raw);if(typeof parsed.version=="string"&&parsed.version.length>0)return parsed.version}catch{}return null}function computeFimoPin(meta,semver,options={}){return meta.source==="npm"&&semver?semver:(meta.source==="dev"||meta.source===null)&&options.devPackageRoot?`file:${options.devPackageRoot}`:null}function resolveFimoPin(options={}){return computeFimoPin(readReleaseMeta(),readCliSemver(),options)}function readDevReleaseVersion(startPath=PACKAGE_ROOT){let devJsonPath=findDevJson(startPath);if(!devJsonPath)return{devJsonPath:null,version:null};let parsed;try{parsed=JSON.parse(fs5.readFileSync(devJsonPath,"utf8"))}catch{throw new Error(`Invalid JSON in ${devJsonPath}. Run \`pnpm -F fimo publish-cli -- --id <task-name>\` from that Fimo checkout, then retry.`)}if(typeof parsed.version!="string"||parsed.version.trim().length===0)throw new Error(`Missing "version" in ${devJsonPath}. Run \`pnpm -F fimo publish-cli -- --id <task-name>\` from that Fimo checkout, then retry.`);return{devJsonPath,version:parsed.version.trim()}}function findDevJson(startPath){let current=startPath;for(;;){let candidate=path5.join(current,".fimo","dev.json");if(fs5.existsSync(candidate))return candidate;let parent2=path5.dirname(current);if(parent2===current)return null;current=parent2}}function rewriteFimoDep(pkg,pin=resolveFimoPin()){if(!pin)return!1;let changed=!1;for(let field of["dependencies","devDependencies"]){let deps=pkg[field];if(!deps)continue;let current=deps.fimo;if(typeof current!="string")continue;let looksLikeLegacyR2=current.includes("r2.dev/cli/fimo-"),looksLikeLocalFile=current.startsWith("file:"),looksLikeSemver=/^[\^~]?\d+\.\d+\.\d+/.test(current);(looksLikeLegacyR2||looksLikeLocalFile||looksLikeSemver||(current==="latest"||current==="staging"||current==="experimental"))&¤t!==pin&&(deps.fimo=pin,changed=!0)}return changed}var MODULE_DIR,PACKAGE_ROOT,RELEASE_FILE2,PACKAGE_JSON_FILE,DEFAULT_TEMPLATE,init_templates=__esm({"src/runtime/templates.ts"(){MODULE_DIR=path5.dirname(fileURLToPath3(import.meta.url)),PACKAGE_ROOT=path5.resolve(MODULE_DIR,"..",".."),RELEASE_FILE2=path5.join(PACKAGE_ROOT,"release.json"),PACKAGE_JSON_FILE=path5.join(PACKAGE_ROOT,"package.json"),DEFAULT_TEMPLATE="react-router";__name(getTemplatePath,"getTemplatePath");__name(readReleaseMeta,"readReleaseMeta");__name(readCliSemver,"readCliSemver");__name(computeFimoPin,"computeFimoPin");__name(resolveFimoPin,"resolveFimoPin");__name(readDevReleaseVersion,"readDevReleaseVersion");__name(findDevJson,"findDevJson");__name(rewriteFimoDep,"rewriteFimoDep")}});import fs6 from"node:fs";import path6 from"node:path";function resolveTemplateRoot(){if(fs6.existsSync(path6.join(TEMPLATE_ROOT,"package.json")))return TEMPLATE_ROOT;throw new Error(`Bundled template not found at ${TEMPLATE_ROOT}.`)}function resolveAgentTemplatesRoot(){if(fs6.existsSync(AGENT_TEMPLATES_ROOT))return AGENT_TEMPLATES_ROOT;throw new Error(`Bundled agent templates dir not found at ${AGENT_TEMPLATES_ROOT}.`)}function resolveAgentTemplate(name){let dir=path6.join(resolveAgentTemplatesRoot(),name);if(!fs6.existsSync(dir))throw new Error(`Agent template '${name}' not found.`);return dir}function listAgentTemplates(){let root2=(()=>{try{return resolveAgentTemplatesRoot()}catch{return null}})();if(!root2)return[];let entries2=fs6.readdirSync(root2,{withFileTypes:!0}),out=[];for(let entry of entries2){if(!entry.isDirectory())continue;let goalPath=path6.join(root2,entry.name,"GOAL.md"),goalFirstLine="";try{goalFirstLine=(fs6.readFileSync(goalPath,"utf8").split(`
|
|
186
|
+
`,nl)+1}return{type,offset:this.offset,indent:this.indent,source:this.source}}startBlockValue(parent2){switch(this.type){case"alias":case"scalar":case"single-quoted-scalar":case"double-quoted-scalar":return this.flowScalar(this.type);case"block-scalar-header":return{type:"block-scalar",offset:this.offset,indent:this.indent,props:[this.sourceToken],source:""};case"flow-map-start":case"flow-seq-start":return{type:"flow-collection",offset:this.offset,indent:this.indent,start:this.sourceToken,items:[],end:[]};case"seq-item-ind":return{type:"block-seq",offset:this.offset,indent:this.indent,items:[{start:[this.sourceToken]}]};case"explicit-key-ind":{this.onKeyLine=!0;let prev2=getPrevProps(parent2),start=getFirstKeyStartProps(prev2);return start.push(this.sourceToken),{type:"block-map",offset:this.offset,indent:this.indent,items:[{start,explicitKey:!0}]}}case"map-value-ind":{this.onKeyLine=!0;let prev2=getPrevProps(parent2),start=getFirstKeyStartProps(prev2);return{type:"block-map",offset:this.offset,indent:this.indent,items:[{start,key:null,sep:[this.sourceToken]}]}}}return null}atIndentedComment(start,indent){return this.type!=="comment"||this.indent<=indent?!1:start.every(st2=>st2.type==="newline"||st2.type==="space")}*documentEnd(docEnd){this.type!=="doc-mode"&&(docEnd.end?docEnd.end.push(this.sourceToken):docEnd.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop()))}*lineEnd(token){switch(this.type){case"comma":case"doc-start":case"doc-end":case"flow-seq-end":case"flow-map-end":case"map-value-ind":yield*this.pop(),yield*this.step();break;case"newline":this.onKeyLine=!1;case"space":case"comment":default:token.end?token.end.push(this.sourceToken):token.end=[this.sourceToken],this.type==="newline"&&(yield*this.pop())}}};exports2.Parser=Parser2}});var require_public_api=__commonJS({"../../node_modules/.pnpm/yaml@2.8.2/node_modules/yaml/dist/public-api.js"(exports2){"use strict";var composer=require_composer(),Document2=require_Document(),errors=require_errors(),log=require_log(),identity2=require_identity(),lineCounter=require_line_counter(),parser=require_parser();function parseOptions(options){let prettyErrors=options.prettyErrors!==!1;return{lineCounter:options.lineCounter||prettyErrors&&new lineCounter.LineCounter||null,prettyErrors}}__name(parseOptions,"parseOptions");function parseAllDocuments(source,options={}){let{lineCounter:lineCounter2,prettyErrors}=parseOptions(options),parser$1=new parser.Parser(lineCounter2?.addNewLine),composer$1=new composer.Composer(options),docs=Array.from(composer$1.compose(parser$1.parse(source)));if(prettyErrors&&lineCounter2)for(let doc of docs)doc.errors.forEach(errors.prettifyError(source,lineCounter2)),doc.warnings.forEach(errors.prettifyError(source,lineCounter2));return docs.length>0?docs:Object.assign([],{empty:!0},composer$1.streamInfo())}__name(parseAllDocuments,"parseAllDocuments");function parseDocument2(source,options={}){let{lineCounter:lineCounter2,prettyErrors}=parseOptions(options),parser$1=new parser.Parser(lineCounter2?.addNewLine),composer$1=new composer.Composer(options),doc=null;for(let _doc of composer$1.compose(parser$1.parse(source),!0,source.length))if(!doc)doc=_doc;else if(doc.options.logLevel!=="silent"){doc.errors.push(new errors.YAMLParseError(_doc.range.slice(0,2),"MULTIPLE_DOCS","Source contains multiple documents; please use YAML.parseAllDocuments()"));break}return prettyErrors&&lineCounter2&&(doc.errors.forEach(errors.prettifyError(source,lineCounter2)),doc.warnings.forEach(errors.prettifyError(source,lineCounter2))),doc}__name(parseDocument2,"parseDocument");function parse13(src,reviver,options){let _reviver;typeof reviver=="function"?_reviver=reviver:options===void 0&&reviver&&typeof reviver=="object"&&(options=reviver);let doc=parseDocument2(src,options);if(!doc)return null;if(doc.warnings.forEach(warning=>log.warn(doc.options.logLevel,warning)),doc.errors.length>0){if(doc.options.logLevel!=="silent")throw doc.errors[0];doc.errors=[]}return doc.toJS(Object.assign({reviver:_reviver},options))}__name(parse13,"parse");function stringify5(value,replacer,options){let _replacer=null;if(typeof replacer=="function"||Array.isArray(replacer)?_replacer=replacer:options===void 0&&replacer&&(options=replacer),typeof options=="string"&&(options=options.length),typeof options=="number"){let indent=Math.round(options);options=indent<1?void 0:indent>8?{indent:8}:{indent}}if(value===void 0){let{keepUndefined}=options??replacer??{};if(!keepUndefined)return}return identity2.isDocument(value)&&!_replacer?value.toString(options):new Document2.Document(value,_replacer,options).toString(options)}__name(stringify5,"stringify");exports2.parse=parse13;exports2.parseAllDocuments=parseAllDocuments;exports2.parseDocument=parseDocument2;exports2.stringify=stringify5}});var require_dist=__commonJS({"../../node_modules/.pnpm/yaml@2.8.2/node_modules/yaml/dist/index.js"(exports2){"use strict";var composer=require_composer(),Document2=require_Document(),Schema=require_Schema(),errors=require_errors(),Alias=require_Alias(),identity2=require_identity(),Pair=require_Pair(),Scalar=require_Scalar(),YAMLMap=require_YAMLMap(),YAMLSeq=require_YAMLSeq(),cst=require_cst(),lexer=require_lexer(),lineCounter=require_line_counter(),parser=require_parser(),publicApi=require_public_api(),visit2=require_visit();exports2.Composer=composer.Composer;exports2.Document=Document2.Document;exports2.Schema=Schema.Schema;exports2.YAMLError=errors.YAMLError;exports2.YAMLParseError=errors.YAMLParseError;exports2.YAMLWarning=errors.YAMLWarning;exports2.Alias=Alias.Alias;exports2.isAlias=identity2.isAlias;exports2.isCollection=identity2.isCollection;exports2.isDocument=identity2.isDocument;exports2.isMap=identity2.isMap;exports2.isNode=identity2.isNode;exports2.isPair=identity2.isPair;exports2.isScalar=identity2.isScalar;exports2.isSeq=identity2.isSeq;exports2.Pair=Pair.Pair;exports2.Scalar=Scalar.Scalar;exports2.YAMLMap=YAMLMap.YAMLMap;exports2.YAMLSeq=YAMLSeq.YAMLSeq;exports2.CST=cst;exports2.Lexer=lexer.Lexer;exports2.LineCounter=lineCounter.LineCounter;exports2.Parser=parser.Parser;exports2.parse=publicApi.parse;exports2.parseAllDocuments=publicApi.parseAllDocuments;exports2.parseDocument=publicApi.parseDocument;exports2.stringify=publicApi.stringify;exports2.visit=visit2.visit;exports2.visitAsync=visit2.visitAsync}});import fs5 from"node:fs";import path5 from"node:path";import{fileURLToPath as fileURLToPath3}from"node:url";function getTemplatePath(framework=DEFAULT_TEMPLATE){return path5.resolve(PACKAGE_ROOT,"templates",framework)}function readReleaseMeta(){try{let raw=fs5.readFileSync(RELEASE_FILE2,"utf8"),parsed=JSON.parse(raw);return{source:parsed.source==="npm"||parsed.source==="dev"?parsed.source:null}}catch{return{source:null}}}function readCliSemver(){try{let raw=fs5.readFileSync(PACKAGE_JSON_FILE,"utf8"),parsed=JSON.parse(raw);if(typeof parsed.version=="string"&&parsed.version.length>0)return parsed.version}catch{}return null}function computeFimoPin(meta,semver,options={}){return meta.source==="npm"&&semver?semver:(meta.source==="dev"||meta.source===null)&&options.devPackageRoot?`file:${options.devPackageRoot}`:null}function resolveFimoPin(options={}){return computeFimoPin(readReleaseMeta(),readCliSemver(),options)}function readDevReleaseVersion(startPath=PACKAGE_ROOT){let devJsonPath=findDevJson(startPath);if(!devJsonPath)return{devJsonPath:null,version:null};let parsed;try{parsed=JSON.parse(fs5.readFileSync(devJsonPath,"utf8"))}catch{throw new Error(`Invalid JSON in ${devJsonPath}. Run \`pnpm -F fimo publish-cli -- --id <task-name>\` from that Fimo checkout, then retry.`)}if(typeof parsed.version!="string"||parsed.version.trim().length===0)throw new Error(`Missing "version" in ${devJsonPath}. Run \`pnpm -F fimo publish-cli -- --id <task-name>\` from that Fimo checkout, then retry.`);return{devJsonPath,version:parsed.version.trim()}}function findDevJson(startPath){let current=startPath;for(;;){let candidate=path5.join(current,".fimo","dev.json");if(fs5.existsSync(candidate))return candidate;let parent2=path5.dirname(current);if(parent2===current)return null;current=parent2}}function rewriteFimoDep(pkg,pin=resolveFimoPin()){if(!pin)return!1;let changed=!1;for(let field of["dependencies","devDependencies"]){let deps=pkg[field];if(!deps)continue;let current=deps.fimo;if(typeof current!="string")continue;let looksLikeLegacyR2=current.includes("r2.dev/cli/fimo-"),looksLikeLocalFile=current.startsWith("file:"),looksLikeSemver=/^[\^~]?\d+\.\d+\.\d+/.test(current);(looksLikeLegacyR2||looksLikeLocalFile||looksLikeSemver||(current==="latest"||current==="staging"||current==="experimental"))&¤t!==pin&&(deps.fimo=pin,changed=!0)}return changed}var MODULE_DIR,PACKAGE_ROOT,RELEASE_FILE2,PACKAGE_JSON_FILE,TEMPLATE_FRAMEWORKS,DEFAULT_TEMPLATE,init_templates=__esm({"src/runtime/templates.ts"(){MODULE_DIR=path5.dirname(fileURLToPath3(import.meta.url)),PACKAGE_ROOT=path5.resolve(MODULE_DIR,"..",".."),RELEASE_FILE2=path5.join(PACKAGE_ROOT,"release.json"),PACKAGE_JSON_FILE=path5.join(PACKAGE_ROOT,"package.json"),TEMPLATE_FRAMEWORKS=["react-router","nextjs"],DEFAULT_TEMPLATE="react-router";__name(getTemplatePath,"getTemplatePath");__name(readReleaseMeta,"readReleaseMeta");__name(readCliSemver,"readCliSemver");__name(computeFimoPin,"computeFimoPin");__name(resolveFimoPin,"resolveFimoPin");__name(readDevReleaseVersion,"readDevReleaseVersion");__name(findDevJson,"findDevJson");__name(rewriteFimoDep,"rewriteFimoDep")}});import fs6 from"node:fs";import path6 from"node:path";function resolveTemplateFramework(value){let framework=value===void 0?DEFAULT_TEMPLATE:value.trim().toLowerCase();if(!TEMPLATE_FRAMEWORKS.includes(framework))throw new TemplateFrameworkError(`Unknown project framework "${value}". Use one of: ${TEMPLATE_FRAMEWORKS.join(", ")}.`);return framework}function resolveTemplateRoot(framework=DEFAULT_TEMPLATE){let templateRoot=getTemplatePath(framework);if(fs6.existsSync(path6.join(templateRoot,"package.json")))return templateRoot;throw new Error(`Bundled ${framework} template not found at ${templateRoot}.`)}function resolveAgentTemplatesRoot(){if(fs6.existsSync(AGENT_TEMPLATES_ROOT))return AGENT_TEMPLATES_ROOT;throw new Error(`Bundled agent templates dir not found at ${AGENT_TEMPLATES_ROOT}.`)}function resolveAgentTemplate(name){let dir=path6.join(resolveAgentTemplatesRoot(),name);if(!fs6.existsSync(dir))throw new Error(`Agent template '${name}' not found.`);return dir}function listAgentTemplates(){let root2=(()=>{try{return resolveAgentTemplatesRoot()}catch{return null}})();if(!root2)return[];let entries2=fs6.readdirSync(root2,{withFileTypes:!0}),out=[];for(let entry of entries2){if(!entry.isDirectory())continue;let goalPath=path6.join(root2,entry.name,"GOAL.md"),goalFirstLine="";try{goalFirstLine=(fs6.readFileSync(goalPath,"utf8").split(`
|
|
187
187
|
`).find(l=>l.trim().length>0)??"").replace(/^#+\s*/,"").trim()}catch{}out.push({name:entry.name,goalFirstLine})}return out.sort((a,b)=>a.name.localeCompare(b.name))}async function copyAgentTemplate(templateRoot,targetDir){if(fs6.existsSync(targetDir))throw new Error(`Target directory '${targetDir}' already exists.`);fs6.mkdirSync(targetDir,{recursive:!0}),await copyTree(templateRoot,targetDir)}async function copyTemplate(templateRoot,targetDir){fs6.mkdirSync(targetDir,{recursive:!0}),await copyTree(templateRoot,targetDir),pinFimoDependency(targetDir)}function pinFimoDependency(targetDir){let pin=resolveFimoPin({devPackageRoot:CLI_ROOT});if(!pin)return;let pkgPath=path6.join(targetDir,"package.json");if(!fs6.existsSync(pkgPath))return;let pkg=JSON.parse(fs6.readFileSync(pkgPath,"utf8"));rewriteFimoDep(pkg,pin)&&(fs6.writeFileSync(pkgPath,JSON.stringify(pkg,null,2)+`
|
|
188
188
|
`),fs6.rmSync(path6.join(targetDir,"pnpm-lock.yaml"),{force:!0}))}async function copyTree(srcDir,destDir){let entries2=fs6.readdirSync(srcDir,{withFileTypes:!0});for(let entry of entries2){if(EXCLUDED_DIRS.has(entry.name))continue;let srcPath=path6.join(srcDir,entry.name),destName=entry.name==="_gitignore"?".gitignore":entry.name,destPath=path6.join(destDir,destName);entry.isDirectory()?(fs6.mkdirSync(destPath,{recursive:!0}),await copyTree(srcPath,destPath)):entry.isFile()&&fs6.copyFileSync(srcPath,destPath)}}function writePerAgentVariants(targetDir,agents,agentsMdContent){let result={perAgentVariants:[],perAgentVariantsSkipped:[]},selected=new Set(agents);function writeIfMissing(relativePath,content2){let fullPath=path6.join(targetDir,relativePath);if(fs6.existsSync(fullPath)){result.perAgentVariantsSkipped.push(relativePath);return}fs6.mkdirSync(path6.dirname(fullPath),{recursive:!0}),fs6.writeFileSync(fullPath,content2),result.perAgentVariants.push(relativePath)}if(__name(writeIfMissing,"writeIfMissing"),selected.has("claude-code")&&writeIfMissing("CLAUDE.md",agentsMdContent),selected.has("cursor")){let cursorContent=`---
|
|
189
189
|
description: Fimo project rules
|
|
190
190
|
alwaysApply: true
|
|
191
191
|
---
|
|
192
192
|
|
|
193
|
-
${agentsMdContent}`;writeIfMissing(".cursor/rules/fimo.mdc",cursorContent)}return selected.has("windsurf")&&writeIfMissing(".windsurfrules",agentsMdContent),selected.has("gemini-cli")&&writeIfMissing("GEMINI.md",agentsMdContent),result}function syncPerAgentVariants(targetDir,agents){let agentsMdPath=path6.join(targetDir,"AGENTS.md");if(!fs6.existsSync(agentsMdPath))throw new Error(`No AGENTS.md found in ${targetDir}. Run \`fimo create\` first, or create AGENTS.md manually before running \`fimo rules sync\`.`);let agentsMdContent=fs6.readFileSync(agentsMdPath,"utf8");return writePerAgentVariants(targetDir,agents,agentsMdContent)}function detectAgentsInProject(cwd){let detected=[];return fs6.existsSync(path6.join(cwd,"CLAUDE.md"))&&detected.push("claude-code"),fs6.existsSync(path6.join(cwd,".cursor","rules","fimo.mdc"))&&detected.push("cursor"),fs6.existsSync(path6.join(cwd,".windsurfrules"))&&detected.push("windsurf"),fs6.existsSync(path6.join(cwd,"GEMINI.md"))&&detected.push("gemini-cli"),detected}var
|
|
193
|
+
${agentsMdContent}`;writeIfMissing(".cursor/rules/fimo.mdc",cursorContent)}return selected.has("windsurf")&&writeIfMissing(".windsurfrules",agentsMdContent),selected.has("gemini-cli")&&writeIfMissing("GEMINI.md",agentsMdContent),result}function syncPerAgentVariants(targetDir,agents){let agentsMdPath=path6.join(targetDir,"AGENTS.md");if(!fs6.existsSync(agentsMdPath))throw new Error(`No AGENTS.md found in ${targetDir}. Run \`fimo create\` first, or create AGENTS.md manually before running \`fimo rules sync\`.`);let agentsMdContent=fs6.readFileSync(agentsMdPath,"utf8");return writePerAgentVariants(targetDir,agents,agentsMdContent)}function detectAgentsInProject(cwd){let detected=[];return fs6.existsSync(path6.join(cwd,"CLAUDE.md"))&&detected.push("claude-code"),fs6.existsSync(path6.join(cwd,".cursor","rules","fimo.mdc"))&&detected.push("cursor"),fs6.existsSync(path6.join(cwd,".windsurfrules"))&&detected.push("windsurf"),fs6.existsSync(path6.join(cwd,"GEMINI.md"))&&detected.push("gemini-cli"),detected}var AGENT_TEMPLATES_ROOT,EXCLUDED_DIRS,TemplateFrameworkError,init_scaffold=__esm({"src/cli/utils/scaffold.ts"(){init_templates();init_config();init_templates();AGENT_TEMPLATES_ROOT=path6.resolve(CLI_ROOT,"assets","agent-templates"),EXCLUDED_DIRS=new Set(["node_modules","dist","build",".turbo",".git"]),TemplateFrameworkError=class extends Error{static{__name(this,"TemplateFrameworkError")}constructor(message){super(message),this.name="TemplateFrameworkError"}};__name(resolveTemplateFramework,"resolveTemplateFramework");__name(resolveTemplateRoot,"resolveTemplateRoot");__name(resolveAgentTemplatesRoot,"resolveAgentTemplatesRoot");__name(resolveAgentTemplate,"resolveAgentTemplate");__name(listAgentTemplates,"listAgentTemplates");__name(copyAgentTemplate,"copyAgentTemplate");__name(copyTemplate,"copyTemplate");__name(pinFimoDependency,"pinFimoDependency");__name(copyTree,"copyTree");__name(writePerAgentVariants,"writePerAgentVariants");__name(syncPerAgentVariants,"syncPerAgentVariants");__name(detectAgentsInProject,"detectAgentsInProject")}});function colorEnabled(opts={}){if(opts.forceDisable)return!1;let env=opts.env??process.env;return env.NO_COLOR&&env.NO_COLOR.length>0?!1:env.FORCE_COLOR&&env.FORCE_COLOR!=="0"&&env.FORCE_COLOR!=="false"?!0:(opts.isTTY??process.stdout.isTTY??!1)===!0}function makeColorPalette(opts={}){let on=colorEnabled(opts),wrap2=__name(style=>s=>on?`${ANSI[style]}${s}${ANSI.reset}`:s,"wrap");return{enabled:on,bold:wrap2("bold"),dim:wrap2("dim"),red:wrap2("red"),green:wrap2("green"),yellow:wrap2("yellow"),blue:wrap2("blue"),magenta:wrap2("magenta"),cyan:wrap2("cyan"),gray:wrap2("gray")}}var ANSI,palette,init_color=__esm({"src/cli/utils/format/color.ts"(){ANSI={reset:"\x1B[0m",bold:"\x1B[1m",dim:"\x1B[2m",red:"\x1B[31m",green:"\x1B[32m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",gray:"\x1B[90m"};__name(colorEnabled,"colorEnabled");__name(makeColorPalette,"makeColorPalette");palette=makeColorPalette()}});function isCliAuthError(err){return err instanceof NotAuthenticatedError||err instanceof UnauthorizedError||err instanceof PermissionDeniedError}function rethrowCliAuthError(err,beforeThrow){if(isCliAuthError(err))throw beforeThrow?.(err),err}function retryCommand(args=process.argv.slice(2)){return["fimo",...args].map(formatShellArg).join(" ")}function formatCliAuthError(err,opts={}){let p2=opts.palette??palette,command=retryCommand(opts.args);if(err instanceof PermissionDeniedError)return[`${p2.red("\u2717")} You don't have permission to run this command.`,"",err.required.length?` Missing permission: ${p2.bold(err.required.join(", "))}`:" Your role on this project does not allow this action."," Ask a project admin for access, or use an account with a higher role.","",p2.dim(` Backend: ${err.apiUrl}`)].join(`
|
|
194
194
|
`);let expired=err instanceof UnauthorizedError,intro=expired?"Your Fimo session is expired or invalid.":"You're not signed in to Fimo.",loginVerb=expired?"refresh your session":"sign in";return[`${p2.red("\u2717")} ${intro}`,"",` Run this to ${loginVerb}:`,` ${p2.bold("fimo login")}`,""," Then retry:",` ${p2.bold(command)}`,"",p2.dim(` Backend: ${err.apiUrl}`)].join(`
|
|
195
195
|
`)}function renderCliAuthError(err,opts={}){console.error(formatCliAuthError(err,opts))}function formatShellArg(arg){return/^[A-Za-z0-9_/:=.,@%+-]+$/.test(arg)?arg:`'${arg.replace(/'/g,"'\\''")}'`}var init_auth_errors=__esm({"src/cli/utils/auth-errors.ts"(){init_api();init_auth();init_color();__name(isCliAuthError,"isCliAuthError");__name(rethrowCliAuthError,"rethrowCliAuthError");__name(retryCommand,"retryCommand");__name(formatCliAuthError,"formatCliAuthError");__name(renderCliAuthError,"renderCliAuthError");__name(formatShellArg,"formatShellArg")}});function detectProjectLayout(paths){let hasCurrentProject=!1,hasLegacyProject=!1,hasCurrentMarker=!1,hasLegacyMarker=!1;for(let input of paths){let file=input.replace(/\\/g,"/").replace(/^\.\//,"").replace(/\/$/,"");hasCurrentProject||=file===CURRENT_PROJECT_LAYOUT.project,hasLegacyProject||=file===LEGACY_PROJECT_LAYOUT.project,hasCurrentMarker||=file===CURRENT_PROJECT_LAYOUT.config||file===CURRENT_PROJECT_LAYOUT.agents||file.startsWith(`${CURRENT_PROJECT_LAYOUT.agents}/`),hasLegacyMarker||=file===LEGACY_PROJECT_LAYOUT.config||file===LEGACY_AGENT_POLICY_PATH}return hasCurrentProject?"current":hasLegacyProject?"legacy":hasCurrentMarker?"current":hasLegacyMarker?"legacy":null}function getProjectLayoutPaths(layout){return layout==="current"?CURRENT_PROJECT_LAYOUT:LEGACY_PROJECT_LAYOUT}function selectProjectConfigPath(paths,layout){let files=new Set(Array.from(paths,file=>file.replace(/\\/g,"/").replace(/^\.\//,"")));return(layout??detectProjectLayout(files)??"current")==="current"?CURRENT_PROJECT_LAYOUT.config:files.has(LEGACY_AGENT_POLICY_PATH)&&!files.has(LEGACY_PROJECT_LAYOUT.config)?LEGACY_AGENT_POLICY_PATH:LEGACY_PROJECT_LAYOUT.config}function selectProjectPolicyPath(paths,layout){let files=new Set(Array.from(paths,file=>file.replace(/\\/g,"/").replace(/^\.\//,"")));return(layout??detectProjectLayout(files)??"current")==="current"?CURRENT_PROJECT_LAYOUT.config:files.has(LEGACY_AGENT_POLICY_PATH)?LEGACY_AGENT_POLICY_PATH:LEGACY_PROJECT_LAYOUT.config}var CURRENT_PROJECT_LAYOUT,LEGACY_PROJECT_LAYOUT,LEGACY_AGENT_POLICY_PATH,init_project_layout=__esm({"src/runtime/project-layout.ts"(){CURRENT_PROJECT_LAYOUT={project:".fimo/project.json",config:".fimo/config.json",agents:".fimo/agents"},LEGACY_PROJECT_LAYOUT={project:".fimo.settings.json",config:"fimo-config.json",agents:"agents"},LEGACY_AGENT_POLICY_PATH="fimo.config.json";__name(detectProjectLayout,"detectProjectLayout");__name(getProjectLayoutPaths,"getProjectLayoutPaths");__name(selectProjectConfigPath,"selectProjectConfigPath");__name(selectProjectPolicyPath,"selectProjectPolicyPath")}});import fs7 from"node:fs";import path7 from"node:path";function existingLayoutPaths(cwd){return[CURRENT_PROJECT_LAYOUT.project,CURRENT_PROJECT_LAYOUT.config,CURRENT_PROJECT_LAYOUT.agents,LEGACY_PROJECT_LAYOUT.project,LEGACY_PROJECT_LAYOUT.config,LEGACY_AGENT_POLICY_PATH].filter(file=>fs7.existsSync(path7.join(cwd,file)))}function detectProjectLayoutAtRoot(cwd){return detectProjectLayout(existingLayoutPaths(cwd))}function resolveProjectLayoutPaths(cwd,fallback="current"){return getProjectLayoutPaths(detectProjectLayoutAtRoot(cwd)??fallback)}function resolveProjectSettingsPath(cwd){return path7.join(cwd,resolveProjectLayoutPaths(cwd).project)}function resolveProjectConfigPath(cwd){let files=existingLayoutPaths(cwd);return path7.join(cwd,selectProjectConfigPath(files,detectProjectLayout(files)))}function resolveProjectPolicyPath(cwd){let files=existingLayoutPaths(cwd);return path7.join(cwd,selectProjectPolicyPath(files,detectProjectLayout(files)))}function resolveProjectAgentsDir(cwd){return path7.join(cwd,resolveProjectLayoutPaths(cwd).agents)}function loadProjectSettings(cwd){let settingsPath=resolveProjectSettingsPath(cwd);if(!fs7.existsSync(settingsPath))throw new Error("You are not in a Fimo project. Run `fimo create` to start one, or cd into a linked project.");return JSON.parse(fs7.readFileSync(settingsPath,"utf-8"))}function findProjectRoot(start){let dir=path7.resolve(start);for(;;){if(fs7.existsSync(path7.join(dir,CURRENT_PROJECT_LAYOUT.project))||fs7.existsSync(path7.join(dir,LEGACY_PROJECT_LAYOUT.project)))return dir;let parent2=path7.dirname(dir);if(parent2===dir)return null;dir=parent2}}function resolveProjectCwd(cwdOption){let start=path7.resolve(cwdOption??process.cwd());return findProjectRoot(start)??start}var init_project=__esm({"src/cli/utils/project.ts"(){init_project_layout();__name(existingLayoutPaths,"existingLayoutPaths");__name(detectProjectLayoutAtRoot,"detectProjectLayoutAtRoot");__name(resolveProjectLayoutPaths,"resolveProjectLayoutPaths");__name(resolveProjectSettingsPath,"resolveProjectSettingsPath");__name(resolveProjectConfigPath,"resolveProjectConfigPath");__name(resolveProjectPolicyPath,"resolveProjectPolicyPath");__name(resolveProjectAgentsDir,"resolveProjectAgentsDir");__name(loadProjectSettings,"loadProjectSettings");__name(findProjectRoot,"findProjectRoot");__name(resolveProjectCwd,"resolveProjectCwd")}});import{execFile as execFile2}from"node:child_process";import{promisify as promisify2}from"node:util";async function runGit(args,cwd){let{stdout}=await execFileAsync2("git",args,{cwd});return stdout.trim()}async function isGitRepo(cwd){try{return await runGit(["rev-parse","--is-inside-work-tree"],cwd),!0}catch{return!1}}async function hasUncommittedChanges(cwd){return(await runGit(["status","--porcelain"],cwd)).length>0}async function cloneRepo(args){await execFileAsync2("git",["clone","--branch",args.branch,"--single-branch",args.url,args.targetDir])}function isMissingRemoteBranch(error){let stderr=extractStderr(error).toLowerCase();return stderr.includes("remote branch")&&stderr.includes("not found")}async function remoteHasBranch(remoteUrl,branch){let{stdout}=await execFileAsync2("git",["ls-remote","--heads",remoteUrl,branch]);return stdout.trim().length>0}async function currentBranch(cwd){return runGit(["rev-parse","--abbrev-ref","HEAD"],cwd)}async function currentTagOrNull(cwd){try{return await runGit(["describe","--tags","--exact-match","HEAD"],cwd)||null}catch{return null}}function isReleaseTag(tag){return tag?/^release\/.+/.test(tag):!1}function classifyPushError(error){let stderr=extractStderr(error),lower=stderr.toLowerCase();return lower.includes("invalid or expired token")||lower.includes("expired token")||lower.includes("invalid token")||lower.includes("could not obtain git credentials")||lower.includes("not signed in")?{kind:"auth",stderr}:lower.includes("remote rejected")||lower.includes("protected")||lower.includes("no-push")||lower.includes("push declined")||lower.includes("not allowed to push")||lower.includes("permission to push")||lower.includes("forbidden")||lower.includes("403")?{kind:"protected",stderr}:lower.includes("non-fast-forward")||lower.includes("rejected")||lower.includes("fetch first")||lower.includes("updates were rejected")?{kind:"non-fast-forward",stderr}:lower.includes("authentication")||lower.includes("permission denied")?{kind:"auth",stderr}:lower.includes("could not resolve host")||lower.includes("timed out")||lower.includes("connection")?{kind:"network",stderr}:{kind:"unknown",stderr}}function extractStderr(error){if(error&&typeof error=="object"&&"stderr"in error){let value=error.stderr;if(typeof value=="string")return value;if(Buffer.isBuffer(value))return value.toString("utf8")}return error instanceof Error?error.message:String(error)}var execFileAsync2,init_git=__esm({"src/cli/utils/git.ts"(){execFileAsync2=promisify2(execFile2);__name(runGit,"runGit");__name(isGitRepo,"isGitRepo");__name(hasUncommittedChanges,"hasUncommittedChanges");__name(cloneRepo,"cloneRepo");__name(isMissingRemoteBranch,"isMissingRemoteBranch");__name(remoteHasBranch,"remoteHasBranch");__name(currentBranch,"currentBranch");__name(currentTagOrNull,"currentTagOrNull");__name(isReleaseTag,"isReleaseTag");__name(classifyPushError,"classifyPushError");__name(extractStderr,"extractStderr")}});function projectSettingsFromEnv(){let projectId=process.env.FIMO_PROJECT_ID?.trim();return projectId?{projectId,organizationId:process.env.FIMO_ORGANIZATION_ID?.trim()??"",name:process.env.FIMO_PROJECT_NAME?.trim()??projectId,apiUrl:process.env.FIMO_API_URL?.trim()??loadConfig().apiUrl}:null}async function resolveEnvFromGit(cwd){if(!await isGitRepo(cwd))return null;try{let tag=await currentTagOrNull(cwd);if(isReleaseTag(tag))return{env:"prod",source:"tag",readOnly:!0};let branch=await currentBranch(cwd);return!branch||branch==="HEAD"||!isValidEnv(branch)?null:{env:branch,source:"branch"}}catch{return null}}async function getProjectContext(opts={}){let cwd=resolveProjectCwd(opts.cwd),settings;try{settings=loadProjectSettings(cwd)}catch{let fromEnv=projectSettingsFromEnv();if(!fromEnv)throw new NotInProjectError;settings=fromEnv}let env,source,readOnly=!1;if(opts.envOverride!==void 0){if(!isValidEnv(opts.envOverride))throw new InvalidEnvOverrideError(opts.envOverride);env=opts.envOverride,source="flag"}else{let fromGit=await resolveEnvFromGit(cwd);if(fromGit)env=fromGit.env,source=fromGit.source,readOnly=fromGit.readOnly===!0;else{if(opts.requireBranch)throw await isGitRepo(cwd)?new GitBranchUndetectedError:new NotInProjectError;env=DEFAULT_ENV,source="fallback"}}if(opts.api&&env!=="prod")try{let names=(await opts.api.listEnvs(settings.projectId,{includeAgentEnvs:!0})).map(e=>e.env);if(!names.includes(env)&&source==="flag")throw new EnvNotFoundError(env,names)}catch(err){if(err instanceof EnvNotFoundError)throw err}return{projectId:settings.projectId,organizationId:settings.organizationId,name:settings.name,apiUrl:settings.apiUrl,env,source,readOnly:readOnly||void 0}}function envSourceBanner(ctx){let sourceHint=ctx.source==="flag"?"--env":ctx.source==="branch"?"git branch":ctx.source==="tag"?"git tag":"default",ro=ctx.readOnly?" \xB7 read-only":"";return`\u2192 env: ${ctx.env} (from ${sourceHint}${ro})`}function envOverrideFromCommand(cmd){let cur=cmd??void 0;for(;cur;){let env=cur.opts().env;if(typeof env=="string"&&env.length>0)return env;cur=cur.parent??null}}async function bootstrapProjectCommand(options={},cmd,bootstrapOpts={}){let envOverride2=envOverrideFromCommand(cmd),baseApi=new FimoApiClient(loadConfig()),ctx=await getProjectContext({cwd:options.cwd,envOverride:envOverride2,requireBranch:bootstrapOpts.requireBranch,api:baseApi});if(!bootstrapOpts.quiet){let{currentMode:currentMode2}=await Promise.resolve().then(()=>(init_dist(),dist_exports));currentMode2().format==="pretty"&&process.stderr.write(`${envSourceBanner(ctx)}
|
|
196
196
|
`)}if(bootstrapOpts.refuseReadOnly&&ctx.readOnly)throw new Error(`Refusing to run a mutating command against read-only env '${ctx.env}'. Switch off the release/* tag or pass --env <writable-env>.`);return{ctx,api:baseApi.withEnv(ctx.env)}}var NotInProjectError,InvalidEnvOverrideError,EnvNotFoundError,GitBranchUndetectedError,init_project_context=__esm({"src/cli/utils/project-context.ts"(){init_esm();init_api();init_config();init_git();init_project();NotInProjectError=class extends Error{static{__name(this,"NotInProjectError")}constructor(){super("You are not in a Fimo project. Run `fimo create` to start one, or cd into a linked project."),this.name="NotInProjectError"}};__name(projectSettingsFromEnv,"projectSettingsFromEnv");InvalidEnvOverrideError=class extends Error{static{__name(this,"InvalidEnvOverrideError")}value;constructor(value){super(`--env value '${value}' is invalid. Env names must match /^[a-zA-Z0-9._/-]+$/, not start with '-', and be \u2264255 chars.`),this.name="InvalidEnvOverrideError",this.value=value}},EnvNotFoundError=class extends Error{static{__name(this,"EnvNotFoundError")}env;knownEnvs;constructor(env,knownEnvs){super(`Env '${env}' not found on the server. Known envs: ${knownEnvs.length>0?knownEnvs.join(", "):"(none yet)"}.`),this.name="EnvNotFoundError",this.env=env,this.knownEnvs=knownEnvs}},GitBranchUndetectedError=class extends Error{static{__name(this,"GitBranchUndetectedError")}constructor(){super("In a git repository but no branch could be detected (detached HEAD or empty repo). Pass --env <name> to target an env explicitly."),this.name="GitBranchUndetectedError"}};__name(resolveEnvFromGit,"resolveEnvFromGit");__name(getProjectContext,"getProjectContext");__name(envSourceBanner,"envSourceBanner");__name(envOverrideFromCommand,"envOverrideFromCommand");__name(bootstrapProjectCommand,"bootstrapProjectCommand")}});var isAmbiguous,isFullWidth,isWide,init_utils=__esm({"../../node_modules/.pnpm/fast-string-truncated-width@1.2.1/node_modules/fast-string-truncated-width/dist/utils.js"(){isAmbiguous=__name(x=>x===161||x===164||x===167||x===168||x===170||x===173||x===174||x>=176&&x<=180||x>=182&&x<=186||x>=188&&x<=191||x===198||x===208||x===215||x===216||x>=222&&x<=225||x===230||x>=232&&x<=234||x===236||x===237||x===240||x===242||x===243||x>=247&&x<=250||x===252||x===254||x===257||x===273||x===275||x===283||x===294||x===295||x===299||x>=305&&x<=307||x===312||x>=319&&x<=322||x===324||x>=328&&x<=331||x===333||x===338||x===339||x===358||x===359||x===363||x===462||x===464||x===466||x===468||x===470||x===472||x===474||x===476||x===593||x===609||x===708||x===711||x>=713&&x<=715||x===717||x===720||x>=728&&x<=731||x===733||x===735||x>=768&&x<=879||x>=913&&x<=929||x>=931&&x<=937||x>=945&&x<=961||x>=963&&x<=969||x===1025||x>=1040&&x<=1103||x===1105||x===8208||x>=8211&&x<=8214||x===8216||x===8217||x===8220||x===8221||x>=8224&&x<=8226||x>=8228&&x<=8231||x===8240||x===8242||x===8243||x===8245||x===8251||x===8254||x===8308||x===8319||x>=8321&&x<=8324||x===8364||x===8451||x===8453||x===8457||x===8467||x===8470||x===8481||x===8482||x===8486||x===8491||x===8531||x===8532||x>=8539&&x<=8542||x>=8544&&x<=8555||x>=8560&&x<=8569||x===8585||x>=8592&&x<=8601||x===8632||x===8633||x===8658||x===8660||x===8679||x===8704||x===8706||x===8707||x===8711||x===8712||x===8715||x===8719||x===8721||x===8725||x===8730||x>=8733&&x<=8736||x===8739||x===8741||x>=8743&&x<=8748||x===8750||x>=8756&&x<=8759||x===8764||x===8765||x===8776||x===8780||x===8786||x===8800||x===8801||x>=8804&&x<=8807||x===8810||x===8811||x===8814||x===8815||x===8834||x===8835||x===8838||x===8839||x===8853||x===8857||x===8869||x===8895||x===8978||x>=9312&&x<=9449||x>=9451&&x<=9547||x>=9552&&x<=9587||x>=9600&&x<=9615||x>=9618&&x<=9621||x===9632||x===9633||x>=9635&&x<=9641||x===9650||x===9651||x===9654||x===9655||x===9660||x===9661||x===9664||x===9665||x>=9670&&x<=9672||x===9675||x>=9678&&x<=9681||x>=9698&&x<=9701||x===9711||x===9733||x===9734||x===9737||x===9742||x===9743||x===9756||x===9758||x===9792||x===9794||x===9824||x===9825||x>=9827&&x<=9829||x>=9831&&x<=9834||x===9836||x===9837||x===9839||x===9886||x===9887||x===9919||x>=9926&&x<=9933||x>=9935&&x<=9939||x>=9941&&x<=9953||x===9955||x===9960||x===9961||x>=9963&&x<=9969||x===9972||x>=9974&&x<=9977||x===9979||x===9980||x===9982||x===9983||x===10045||x>=10102&&x<=10111||x>=11094&&x<=11097||x>=12872&&x<=12879||x>=57344&&x<=63743||x>=65024&&x<=65039||x===65533||x>=127232&&x<=127242||x>=127248&&x<=127277||x>=127280&&x<=127337||x>=127344&&x<=127373||x===127375||x===127376||x>=127387&&x<=127404||x>=917760&&x<=917999||x>=983040&&x<=1048573||x>=1048576&&x<=1114109,"isAmbiguous"),isFullWidth=__name(x=>x===12288||x>=65281&&x<=65376||x>=65504&&x<=65510,"isFullWidth"),isWide=__name(x=>x>=4352&&x<=4447||x===8986||x===8987||x===9001||x===9002||x>=9193&&x<=9196||x===9200||x===9203||x===9725||x===9726||x===9748||x===9749||x>=9800&&x<=9811||x===9855||x===9875||x===9889||x===9898||x===9899||x===9917||x===9918||x===9924||x===9925||x===9934||x===9940||x===9962||x===9970||x===9971||x===9973||x===9978||x===9981||x===9989||x===9994||x===9995||x===10024||x===10060||x===10062||x>=10067&&x<=10069||x===10071||x>=10133&&x<=10135||x===10160||x===10175||x===11035||x===11036||x===11088||x===11093||x>=11904&&x<=11929||x>=11931&&x<=12019||x>=12032&&x<=12245||x>=12272&&x<=12287||x>=12289&&x<=12350||x>=12353&&x<=12438||x>=12441&&x<=12543||x>=12549&&x<=12591||x>=12593&&x<=12686||x>=12688&&x<=12771||x>=12783&&x<=12830||x>=12832&&x<=12871||x>=12880&&x<=19903||x>=19968&&x<=42124||x>=42128&&x<=42182||x>=43360&&x<=43388||x>=44032&&x<=55203||x>=63744&&x<=64255||x>=65040&&x<=65049||x>=65072&&x<=65106||x>=65108&&x<=65126||x>=65128&&x<=65131||x>=94176&&x<=94180||x===94192||x===94193||x>=94208&&x<=100343||x>=100352&&x<=101589||x>=101632&&x<=101640||x>=110576&&x<=110579||x>=110581&&x<=110587||x===110589||x===110590||x>=110592&&x<=110882||x===110898||x>=110928&&x<=110930||x===110933||x>=110948&&x<=110951||x>=110960&&x<=111355||x===126980||x===127183||x===127374||x>=127377&&x<=127386||x>=127488&&x<=127490||x>=127504&&x<=127547||x>=127552&&x<=127560||x===127568||x===127569||x>=127584&&x<=127589||x>=127744&&x<=127776||x>=127789&&x<=127797||x>=127799&&x<=127868||x>=127870&&x<=127891||x>=127904&&x<=127946||x>=127951&&x<=127955||x>=127968&&x<=127984||x===127988||x>=127992&&x<=128062||x===128064||x>=128066&&x<=128252||x>=128255&&x<=128317||x>=128331&&x<=128334||x>=128336&&x<=128359||x===128378||x===128405||x===128406||x===128420||x>=128507&&x<=128591||x>=128640&&x<=128709||x===128716||x>=128720&&x<=128722||x>=128725&&x<=128727||x>=128732&&x<=128735||x===128747||x===128748||x>=128756&&x<=128764||x>=128992&&x<=129003||x===129008||x>=129292&&x<=129338||x>=129340&&x<=129349||x>=129351&&x<=129535||x>=129648&&x<=129660||x>=129664&&x<=129672||x>=129680&&x<=129725||x>=129727&&x<=129733||x>=129742&&x<=129755||x>=129760&&x<=129768||x>=129776&&x<=129784||x>=131072&&x<=196605||x>=196608&&x<=262141,"isWide")}});var ANSI_RE,CONTROL_RE,TAB_RE,EMOJI_RE,LATIN_RE,MODIFIER_RE,NO_TRUNCATION,getStringTruncatedWidth,dist_default,init_dist2=__esm({"../../node_modules/.pnpm/fast-string-truncated-width@1.2.1/node_modules/fast-string-truncated-width/dist/index.js"(){init_utils();ANSI_RE=/[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/y,CONTROL_RE=/[\x00-\x08\x0A-\x1F\x7F-\x9F]{1,1000}/y,TAB_RE=/\t{1,1000}/y,EMOJI_RE=new RegExp("[\\u{1F1E6}-\\u{1F1FF}]{2}|\\u{1F3F4}[\\u{E0061}-\\u{E007A}]{2}[\\u{E0030}-\\u{E0039}\\u{E0061}-\\u{E007A}]{1,3}\\u{E007F}|(?:\\p{Emoji}\\uFE0F\\u20E3?|\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation})(?:\\u200D(?:\\p{Emoji_Modifier_Base}\\p{Emoji_Modifier}?|\\p{Emoji_Presentation}|\\p{Emoji}\\uFE0F\\u20E3?))*","yu"),LATIN_RE=/(?:[\x20-\x7E\xA0-\xFF](?!\uFE0F)){1,1000}/y,MODIFIER_RE=new RegExp("\\p{M}+","gu"),NO_TRUNCATION={limit:1/0,ellipsis:""},getStringTruncatedWidth=__name((input,truncationOptions={},widthOptions={})=>{let LIMIT=truncationOptions.limit??1/0,ELLIPSIS=truncationOptions.ellipsis??"",ELLIPSIS_WIDTH=truncationOptions?.ellipsisWidth??(ELLIPSIS?getStringTruncatedWidth(ELLIPSIS,NO_TRUNCATION,widthOptions).width:0),ANSI_WIDTH=widthOptions.ansiWidth??0,CONTROL_WIDTH=widthOptions.controlWidth??0,TAB_WIDTH=widthOptions.tabWidth??8,AMBIGUOUS_WIDTH=widthOptions.ambiguousWidth??1,EMOJI_WIDTH=widthOptions.emojiWidth??2,FULL_WIDTH_WIDTH=widthOptions.fullWidthWidth??2,REGULAR_WIDTH=widthOptions.regularWidth??1,WIDE_WIDTH=widthOptions.wideWidth??2,indexPrev=0,index2=0,length=input.length,lengthExtra=0,truncationEnabled=!1,truncationIndex=length,truncationLimit=Math.max(0,LIMIT-ELLIPSIS_WIDTH),unmatchedStart=0,unmatchedEnd=0,width=0,widthExtra=0;outer:for(;;){if(unmatchedEnd>unmatchedStart||index2>=length&&index2>indexPrev){let unmatched=input.slice(unmatchedStart,unmatchedEnd)||input.slice(indexPrev,index2);lengthExtra=0;for(let char of unmatched.replaceAll(MODIFIER_RE,"")){let codePoint=char.codePointAt(0)||0;if(isFullWidth(codePoint)?widthExtra=FULL_WIDTH_WIDTH:isWide(codePoint)?widthExtra=WIDE_WIDTH:AMBIGUOUS_WIDTH!==REGULAR_WIDTH&&isAmbiguous(codePoint)?widthExtra=AMBIGUOUS_WIDTH:widthExtra=REGULAR_WIDTH,width+widthExtra>truncationLimit&&(truncationIndex=Math.min(truncationIndex,Math.max(unmatchedStart,indexPrev)+lengthExtra)),width+widthExtra>LIMIT){truncationEnabled=!0;break outer}lengthExtra+=char.length,width+=widthExtra}unmatchedStart=unmatchedEnd=0}if(index2>=length)break;if(LATIN_RE.lastIndex=index2,LATIN_RE.test(input)){if(lengthExtra=LATIN_RE.lastIndex-index2,widthExtra=lengthExtra*REGULAR_WIDTH,width+widthExtra>truncationLimit&&(truncationIndex=Math.min(truncationIndex,index2+Math.floor((truncationLimit-width)/REGULAR_WIDTH))),width+widthExtra>LIMIT){truncationEnabled=!0;break}width+=widthExtra,unmatchedStart=indexPrev,unmatchedEnd=index2,index2=indexPrev=LATIN_RE.lastIndex;continue}if(ANSI_RE.lastIndex=index2,ANSI_RE.test(input)){if(width+ANSI_WIDTH>truncationLimit&&(truncationIndex=Math.min(truncationIndex,index2)),width+ANSI_WIDTH>LIMIT){truncationEnabled=!0;break}width+=ANSI_WIDTH,unmatchedStart=indexPrev,unmatchedEnd=index2,index2=indexPrev=ANSI_RE.lastIndex;continue}if(CONTROL_RE.lastIndex=index2,CONTROL_RE.test(input)){if(lengthExtra=CONTROL_RE.lastIndex-index2,widthExtra=lengthExtra*CONTROL_WIDTH,width+widthExtra>truncationLimit&&(truncationIndex=Math.min(truncationIndex,index2+Math.floor((truncationLimit-width)/CONTROL_WIDTH))),width+widthExtra>LIMIT){truncationEnabled=!0;break}width+=widthExtra,unmatchedStart=indexPrev,unmatchedEnd=index2,index2=indexPrev=CONTROL_RE.lastIndex;continue}if(TAB_RE.lastIndex=index2,TAB_RE.test(input)){if(lengthExtra=TAB_RE.lastIndex-index2,widthExtra=lengthExtra*TAB_WIDTH,width+widthExtra>truncationLimit&&(truncationIndex=Math.min(truncationIndex,index2+Math.floor((truncationLimit-width)/TAB_WIDTH))),width+widthExtra>LIMIT){truncationEnabled=!0;break}width+=widthExtra,unmatchedStart=indexPrev,unmatchedEnd=index2,index2=indexPrev=TAB_RE.lastIndex;continue}if(EMOJI_RE.lastIndex=index2,EMOJI_RE.test(input)){if(width+EMOJI_WIDTH>truncationLimit&&(truncationIndex=Math.min(truncationIndex,index2)),width+EMOJI_WIDTH>LIMIT){truncationEnabled=!0;break}width+=EMOJI_WIDTH,unmatchedStart=indexPrev,unmatchedEnd=index2,index2=indexPrev=EMOJI_RE.lastIndex;continue}index2+=1}return{width:truncationEnabled?truncationLimit:width,index:truncationEnabled?truncationIndex:length,truncated:truncationEnabled,ellipsed:truncationEnabled&&LIMIT>=ELLIPSIS_WIDTH}},"getStringTruncatedWidth"),dist_default=getStringTruncatedWidth}});var NO_TRUNCATION2,fastStringWidth,dist_default2,init_dist3=__esm({"../../node_modules/.pnpm/fast-string-width@1.1.0/node_modules/fast-string-width/dist/index.js"(){init_dist2();NO_TRUNCATION2={limit:1/0,ellipsis:"",ellipsisWidth:0},fastStringWidth=__name((input,options={})=>dist_default(input,NO_TRUNCATION2,options).width,"fastStringWidth"),dist_default2=fastStringWidth}});function wrapAnsi(string2,columns,options){return String(string2).normalize().split(CRLF_OR_LF).map(line=>exec(line,columns,options)).join(`
|
|
@@ -659,16 +659,16 @@ ${removed.map(r=>` ${r.skill} \u2192 ${r.agent}`).join(`
|
|
|
659
659
|
`)}`,"render")})}function listReferenceDocs(skillDir){let refsDir=path31.join(skillDir,"references");if(!fs32.existsSync(refsDir))return[];let out=[],walk=__name((cur,prefix)=>{for(let entry of fs32.readdirSync(cur,{withFileTypes:!0})){let rel=prefix?`${prefix}/${entry.name}`:entry.name;entry.isDirectory()?walk(path31.join(cur,entry.name),rel):entry.isFile()&&entry.name.endsWith(".md")&&out.push(rel.slice(0,-3))}},"walk");return walk(refsDir,""),out.sort()}function discoverBundledSkills(skillsRoot=SKILLS_ROOT){if(!fs32.existsSync(skillsRoot))return[];let skills2=[];for(let entry of fs32.readdirSync(skillsRoot,{withFileTypes:!0})){if(!entry.isDirectory()||entry.name===BOOTSTRAP_SKILL_NAME)continue;let dir=path31.join(skillsRoot,entry.name),skillMd=path31.join(dir,"SKILL.md");if(!fs32.existsSync(skillMd))continue;let{data:data2}=parseFrontmatter(fs32.readFileSync(skillMd,"utf8")),description=typeof data2.description=="string"?data2.description.trim():"";skills2.push({name:entry.name,description,refs:listReferenceDocs(dir),dir})}return skills2.sort((a,b)=>a.name.localeCompare(b.name))}function firstLine(text3){let line=text3.split(`
|
|
660
660
|
`,1)[0]?.trim()??"";return line.length>80?`${line.slice(0,79)}\u2026`:line}function skillsListCommand(){let skills2=discoverBundledSkills();if(skills2.length===0){ui.error({command:"skills list",code:"BUNDLED_SKILL_MISSING",message:`No bundled skills found at ${SKILLS_ROOT}.`,hint:"Try reinstalling fimo, or report this as a bug."});return}ui.result({command:"skills list",data:{skills:skills2.map(s=>({name:s.name,description:s.description,refs:s.refs}))},render:__name(()=>{let nameWidth=Math.max(4,...skills2.map(s=>s.name.length)),header=`${"NAME".padEnd(nameWidth)} REFS DESCRIPTION`,lines=skills2.map(s=>{let refs=String(s.refs.length).padStart(4);return`${s.name.padEnd(nameWidth)} ${refs} ${firstLine(s.description)}`});return[header,...lines].join(`
|
|
661
661
|
`)},"render"),hint:"Run `fimo skills get <name>` for a skill, or add `--ref <doc>` for a reference."})}function resolveSkillsGetSource(name,cwd){if(name!=="fimo-code")return{status:"ok",data:{root:SKILLS_ROOT,source:"running-cli",version:getCliVersion()}};let projectRoot=findProjectRoot(cwd);if(!projectRoot)return{status:"ok",data:{root:SKILLS_ROOT,source:"running-cli",version:getCliVersion()}};let packageJsonPath=resolveProjectFimoPackageJson(projectRoot);if(!packageJsonPath)return{status:"error",code:"PROJECT_RUNTIME_NOT_INSTALLED",message:"The project-local fimo package is not installed, so version-matched code guidance is unavailable.",hint:"Install the project dependencies, then run `fimo skills get fimo-code` again."};let version="unknown";try{let pkg=JSON.parse(fs32.readFileSync(packageJsonPath,"utf8"));typeof pkg.version=="string"&&(version=pkg.version)}catch{}let root2=path31.join(path31.dirname(packageJsonPath),"assets","skills");return fs32.existsSync(path31.join(root2,"fimo-code","SKILL.md"))?{status:"ok",data:{root:root2,source:"project-runtime",version}}:{status:"error",code:"PROJECT_SKILL_UNAVAILABLE",message:`Project runtime fimo@${version} does not include version-matched fimo-code guidance.`,hint:"Upgrade the project runtime, then run `fimo skills get fimo-code` again."}}function resolveProjectFimoPackageJson(projectRoot){let requireFromProject=createRequire(path31.join(projectRoot,"package.json")),ancestorNodeModules=new Set,directory=projectRoot;for(;;){ancestorNodeModules.add(path31.join(directory,"node_modules"));let parent2=path31.dirname(directory);if(parent2===directory)break;directory=parent2}for(let searchRoot of requireFromProject.resolve.paths("fimo")??[]){if(!ancestorNodeModules.has(path31.normalize(searchRoot)))continue;let packageJsonPath=path31.join(searchRoot,"fimo","package.json");if(fs32.existsSync(packageJsonPath))return packageJsonPath}}function normalizeRef(ref){return ref.trim().replace(/\\/g,"/").replace(/^references\//,"").replace(/\.md$/,"")}function skillsGetCommand(name,options={}){let source=resolveSkillsGetSource(name,path31.resolve(options.cwd??process.cwd()));if(source.status==="error"){ui.error({command:"skills get",code:source.code,message:source.message,hint:source.hint});return}let skills2=discoverBundledSkills(source.data.root),skill=skills2.find(s=>s.name===name);if(!skill){ui.error({command:"skills get",code:"SKILL_NOT_FOUND",message:`Unknown skill "${name}".`,hint:skills2.length?`Available: ${skills2.map(s=>s.name).join(", ")}. Run \`fimo skills list\`.`:"No bundled skills found \u2014 try reinstalling fimo."});return}let targetPath,refId=null;if(options.ref){refId=normalizeRef(options.ref);let refsRoot=path31.resolve(skill.dir,"references"),candidate=path31.resolve(refsRoot,`${refId}.md`);if(!(candidate===refsRoot||candidate.startsWith(refsRoot+path31.sep))||!fs32.existsSync(candidate)){ui.error({command:"skills get",code:"SKILL_REF_NOT_FOUND",message:`Reference "${options.ref}" not found in skill "${skill.name}".`,hint:skill.refs.length?`Available refs: ${skill.refs.join(", ")}.`:"This skill has no reference docs."});return}targetPath=candidate}else targetPath=path31.join(skill.dir,"SKILL.md");let content2=fs32.readFileSync(targetPath,"utf8");ui.result({command:"skills get",data:{skill:skill.name,ref:refId,path:targetPath,content:content2,source:source.data.source,version:source.data.version},render:__name(()=>content2,"render"),hint:STREAMED_REFERENCE_HINT})}var SKILLS_ROOT,BOOTSTRAP_SKILL_NAME,BOOTSTRAP_SKILL_SOURCE,STREAMED_REFERENCE_HINT,STALE_GLOBAL_SKILL_NAMES,DETECTABLE_FIMO_SKILL_NAMES,init_skills=__esm({"src/cli/commands/skills.ts"(){init_dist5();init_dist();init_dist8();init_config();init_agents();init_project();init_version();SKILLS_ROOT=path31.resolve(CLI_ROOT,"assets","skills"),BOOTSTRAP_SKILL_NAME="fimo",BOOTSTRAP_SKILL_SOURCE=path31.join(SKILLS_ROOT,BOOTSTRAP_SKILL_NAME),STREAMED_REFERENCE_HINT="Reference paths in this document are identifiers, not project files. Load one with `fimo skills get <skill> --ref <reference>`.",STALE_GLOBAL_SKILL_NAMES=["fimo-cli","fimo-studio","fimo-migration","fimo-migrate","fimo-source-migrate"],DETECTABLE_FIMO_SKILL_NAMES=[BOOTSTRAP_SKILL_NAME,...STALE_GLOBAL_SKILL_NAMES];__name(isPrettyMode,"isPrettyMode");__name(runSkillsInstall,"runSkillsInstall");__name(renderSkillsInstall,"renderSkillsInstall");__name(skillsInstallCommand,"skillsInstallCommand");__name(skillsSyncCommand,"skillsSyncCommand");__name(detectAgentsWithFimoSkills,"detectAgentsWithFimoSkills");__name(removeDirIfExists,"removeDirIfExists");__name(removeGlobalSkillDirs,"removeGlobalSkillDirs");__name(hasGlobalSkillInstalled,"hasGlobalSkillInstalled");__name(removeCanonicalSkillDirs,"removeCanonicalSkillDirs");__name(cleanupStaleGlobalSkills,"cleanupStaleGlobalSkills");__name(skillsUninstallCommand,"skillsUninstallCommand");__name(listReferenceDocs,"listReferenceDocs");__name(discoverBundledSkills,"discoverBundledSkills");__name(firstLine,"firstLine");__name(skillsListCommand,"skillsListCommand");__name(resolveSkillsGetSource,"resolveSkillsGetSource");__name(resolveProjectFimoPackageJson,"resolveProjectFimoPackageJson");__name(normalizeRef,"normalizeRef");__name(skillsGetCommand,"skillsGetCommand")}});import{execFile as execFile8,spawnSync as spawnSync2}from"node:child_process";import path32 from"node:path";import{promisify as promisify8}from"node:util";function explainCreateProjectError(error){return error instanceof ApiRequestError&&error.detail.includes('insert into "projects"')&&(error.detail.includes('"subdomain"')||error.detail.includes('"subdomain_updated_at"'))?["Project creation failed because the local API database schema looks out of date.","The server is trying to write the `projects.subdomain` fields, but your database likely has not applied the latest migration yet.","Run `cd apps/api && pnpm db:migrate`, restart the API if needed, then retry."].join(`
|
|
662
|
-
`):error instanceof Error?error.message:String(error)}async function scaffoldNewProject(args){let{api,cfg,targetDir,displayName,options}=args,organizationId=await resolveOrganization(api,options.org),createSpinner=spinner("Creating Fimo project"),project;try{project=await api.createProject({organizationId,displayName:displayName??path32.basename(targetDir)})}catch(error){throw createSpinner.fail("Project creation failed"),new ScaffoldError("PROJECT_CREATE_FAILED",explainCreateProjectError(error))}createSpinner.succeed(`Project ${project.displayName??project.name} created (${project.id})`);let releaseAbort=installAbortHandler(api,project.id,project.name);try{return{scaffold:await scaffoldIntoProject({project,api,cfg,targetDir,options}),releaseAbort}}catch(error){throw releaseAbort(),options.starter&&await api.deleteProject(project.id).catch(()=>{}),error}}async function scaffoldIntoProject(args){let{project,api,cfg,targetDir,options}=args,starter;try{starter=resolveProjectStarter(options.starter)}catch(error){throw error instanceof StarterError?new ScaffoldError(error.code,error.message):error}let remoteSp=spinner("Fetching git remote"),remote=await api.getGitRemote(project.id,MAIN_BRANCH);remoteSp.succeed("Remote ready");let selectedAgents;try{selectedAgents=await selectAgents(options,{promptMessage:"Which agents do you want to set up?",detectFn:detectAgentsWithFimoSkills})}catch(err){throw new ScaffoldError("AGENT_SELECTION_FAILED",err instanceof Error?err.message:String(err))}let scaffoldSp=spinner("Scaffolding template"),templateRoot=options.templateRoot?path32.resolve(options.templateRoot):process.env.FIMO_TEMPLATE_ROOT?path32.resolve(process.env.FIMO_TEMPLATE_ROOT):resolveTemplateRoot();await copyTemplate(templateRoot,targetDir),starter&&await copyStarterOverlay(starter,targetDir),seedSiteName({targetDir,project}),writeLocalProjectFiles({targetDir,project,apiUrl:cfg.apiUrl,tenantApiUrl:remote.tenantApiUrl});let starterSeed=null;if(starter)try{starterSeed=await applyStarterSeeds({starter,api,projectId:project.id,targetDir})}catch(error){throw new ScaffoldError("STARTER_SEED_FAILED",`Could not seed project starter ${starter.id}@${starter.version}: ${error instanceof Error?error.message:String(error)}`)}let gitSp=spinner("Initializing git repository");await runGit(["init","-b",MAIN_BRANCH],targetDir),await ensureFimoRemote(targetDir,remote.url),gitSp.succeed("Git initialized with `fimo` remote"),scaffoldSp.succeed("Template scaffolded");let relativeTarget=path32.relative(process.cwd(),targetDir)||".";return{project,targetDir,relativeTarget,selectedAgents,tenantApiUrl:remote.tenantApiUrl,starter:starterSeed}}async function finalizeInitialCommit(args){let{targetDir}=args,gitSp=spinner("Creating the initial commit");await runGit(["add","-A"],targetDir),await runGit(["commit","-m","chore: scaffold Fimo project"],targetDir).catch(()=>{}),gitSp.succeed("Initial commit created");let pushSp=spinner("Pushing initial commit to Fimo");try{return await runGit(["push","fimo",`HEAD:${MAIN_BRANCH}`],targetDir),pushSp.succeed("Initial commit pushed"),{pushedInitial:!0}}catch(error){pushSp.fail("Initial push failed");let failure=classifyPushError(error),retryHint=failure.kind==="auth"?"Sign in with `fimo login`, then run `fimo deploy` to push it.":"Run `fimo deploy` later to retry.";return O2.error(`Could not push the initial commit. ${retryHint}
|
|
662
|
+
`):error instanceof Error?error.message:String(error)}async function scaffoldNewProject(args){let{api,cfg,targetDir,displayName,options}=args,organizationId=await resolveOrganization(api,options.org),createSpinner=spinner("Creating Fimo project"),project;try{project=await api.createProject({organizationId,displayName:displayName??path32.basename(targetDir)})}catch(error){throw createSpinner.fail("Project creation failed"),new ScaffoldError("PROJECT_CREATE_FAILED",explainCreateProjectError(error))}createSpinner.succeed(`Project ${project.displayName??project.name} created (${project.id})`);let releaseAbort=installAbortHandler(api,project.id,project.name);try{return{scaffold:await scaffoldIntoProject({project,api,cfg,targetDir,options}),releaseAbort}}catch(error){throw releaseAbort(),options.starter&&await api.deleteProject(project.id).catch(()=>{}),error}}async function scaffoldIntoProject(args){let{project,api,cfg,targetDir,options}=args,starter;try{starter=resolveProjectStarter(options.starter)}catch(error){throw error instanceof StarterError?new ScaffoldError(error.code,error.message):error}let remoteSp=spinner("Fetching git remote"),remote=await api.getGitRemote(project.id,MAIN_BRANCH);remoteSp.succeed("Remote ready");let selectedAgents;try{selectedAgents=await selectAgents(options,{promptMessage:"Which agents do you want to set up?",detectFn:detectAgentsWithFimoSkills})}catch(err){throw new ScaffoldError("AGENT_SELECTION_FAILED",err instanceof Error?err.message:String(err))}let scaffoldSp=spinner("Scaffolding template"),framework=resolveTemplateFramework(options.framework),templateRoot=options.templateRoot?path32.resolve(options.templateRoot):process.env.FIMO_TEMPLATE_ROOT?path32.resolve(process.env.FIMO_TEMPLATE_ROOT):resolveTemplateRoot(framework);await copyTemplate(templateRoot,targetDir),starter&&await copyStarterOverlay(starter,targetDir),seedSiteName({targetDir,project}),writeLocalProjectFiles({targetDir,project,apiUrl:cfg.apiUrl,tenantApiUrl:remote.tenantApiUrl});let starterSeed=null;if(starter)try{starterSeed=await applyStarterSeeds({starter,api,projectId:project.id,targetDir})}catch(error){throw new ScaffoldError("STARTER_SEED_FAILED",`Could not seed project starter ${starter.id}@${starter.version}: ${error instanceof Error?error.message:String(error)}`)}let gitSp=spinner("Initializing git repository");await runGit(["init","-b",MAIN_BRANCH],targetDir),await ensureFimoRemote(targetDir,remote.url),gitSp.succeed("Git initialized with `fimo` remote"),scaffoldSp.succeed("Template scaffolded");let relativeTarget=path32.relative(process.cwd(),targetDir)||".";return{project,targetDir,relativeTarget,selectedAgents,tenantApiUrl:remote.tenantApiUrl,starter:starterSeed}}async function finalizeInitialCommit(args){let{targetDir}=args,gitSp=spinner("Creating the initial commit");await runGit(["add","-A"],targetDir),await runGit(["commit","-m","chore: scaffold Fimo project"],targetDir).catch(()=>{}),gitSp.succeed("Initial commit created");let pushSp=spinner("Pushing initial commit to Fimo");try{return await runGit(["push","fimo",`HEAD:${MAIN_BRANCH}`],targetDir),pushSp.succeed("Initial commit pushed"),{pushedInitial:!0}}catch(error){pushSp.fail("Initial push failed");let failure=classifyPushError(error),retryHint=failure.kind==="auth"?"Sign in with `fimo login`, then run `fimo deploy` to push it.":"Run `fimo deploy` later to retry.";return O2.error(`Could not push the initial commit. ${retryHint}
|
|
663
663
|
${failure.stderr||""}`.trim()),{pushedInitial:!1}}}function installAbortHandler(api,projectId,projectName){let cleaningUp=!1,handler=__name(()=>{cleaningUp&&(process.stderr.write(`
|
|
664
664
|
Force-exiting. Project may not have been fully cleaned up.
|
|
665
665
|
`),process.exit(130)),cleaningUp=!0,process.stderr.write(`
|
|
666
666
|
Aborted. Deleting project ${projectName}\u2026
|
|
667
667
|
`),api.deleteProject(projectId).then(()=>{process.stderr.write(`Deleted project ${projectName}.
|
|
668
668
|
`)}).catch(error=>{process.stderr.write(`Failed to delete project: ${error instanceof Error?error.message:String(error)}
|
|
669
|
-
`)}).finally(()=>{process.exit(130)})},"handler");return process.on("SIGINT",handler),()=>{process.off("SIGINT",handler)}}function installArgsForPackageManager(packageManager){return packageManager==="pnpm"?["install","--config.dangerouslyAllowAllBuilds=true"]:["install"]}function formatPackageManagerCommand(packageManager,args){return[packageManager,...args].join(" ")}async function installDependencies(packageManager,targetDir){let args=installArgsForPackageManager(packageManager),command=formatPackageManagerCommand(packageManager,args),installSp=spinner(`Installing dependencies (${command})`);try{return await execFileAsync7(packageManager,args,{cwd:targetDir}),installSp.succeed("Dependencies installed"),{installed:!0,command,error:null}}catch(error){let message=error instanceof Error?error.message:String(error);return installSp.fail(`Failed to install dependencies: ${message}`),{installed:!1,command,error:message}}}function detectPackageManager2(){return isCommandAvailable("pnpm")?"pnpm":isCommandAvailable("bun")?"bun":isCommandAvailable("yarn")?"yarn":"npm"}function isCommandAvailable(command){let probe=process.platform==="win32"?"where":"which";return spawnSync2(probe,[command],{stdio:"ignore"}).status===0}async function resolveOrganization(api,explicit,options={}){if(explicit)return explicit;let activeOrganizationId=readCredentials()?.activeOrganization?.id,nonInteractive2=options.nonInteractive??(currentMode().format==="json"||!isInteractive());if(nonInteractive2&&activeOrganizationId)return activeOrganizationId;let orgs2;try{orgs2=await api.listOrganizations()}catch(error){throw rethrowCliAuthError(error),new ScaffoldError("LIST_ORGS_FAILED",`Failed to list organizations: ${error instanceof Error?error.message:String(error)}`)}if(orgs2.length===0)throw new ScaffoldError("NO_ORGANIZATIONS","No organization found for this account.");if(orgs2.length===1)return orgs2[0].id;if(nonInteractive2)throw new ScaffoldError("ORGANIZATION_REQUIRED","Several organizations are available and no active organization is configured.","Pass --org <organizationId>, or run `fimo orgs switch --org <id-or-slug>` first.");let currentId=orgs2.some(organization=>organization.id===activeOrganizationId)?activeOrganizationId:void 0,selected=await _t({message:"Select an organization for this project",initialValue:currentId,options:orgs2.map(organization=>({value:organization.id,label:organization.name,hint:organization.id===currentId?"current":organization.slug}))});if(q(selected))throw new ScaffoldError("ORGANIZATION_SELECTION_CANCELLED","Organization selection cancelled.");return selected}var execFileAsync7,MAIN_BRANCH,ScaffoldError,init_scaffold_project=__esm({"src/cli/commands/scaffold-project.ts"(){init_dist5();init_dist();init_api();init_auth();init_starters();init_agents();init_auth_errors();init_git_credential_setup();init_git();init_interactive();init_local_project_files();init_scaffold();init_skills();execFileAsync7=promisify8(execFile8),MAIN_BRANCH="main",ScaffoldError=class extends Error{static{__name(this,"ScaffoldError")}code;hint;constructor(code2,message,hint){super(message),this.name="ScaffoldError",this.code=code2,this.hint=hint}};__name(explainCreateProjectError,"explainCreateProjectError");__name(scaffoldNewProject,"scaffoldNewProject");__name(scaffoldIntoProject,"scaffoldIntoProject");__name(finalizeInitialCommit,"finalizeInitialCommit");__name(installAbortHandler,"installAbortHandler");__name(installArgsForPackageManager,"installArgsForPackageManager");__name(formatPackageManagerCommand,"formatPackageManagerCommand");__name(installDependencies,"installDependencies");__name(detectPackageManager2,"detectPackageManager");__name(isCommandAvailable,"isCommandAvailable");__name(resolveOrganization,"resolveOrganization")}});import fs33 from"node:fs";import path33 from"node:path";function emitInitOutcome(command,outcome){switch(outcome.status){case"ok":ui.result({command,data:outcome.data,render:__name(ctx=>renderInitSuccess(ctx,outcome.renderArgs),"render"),warnings:outcome.warnings.length>0?outcome.warnings:void 0});return;case"cancelled":ui.info({command,message:"Cancelled."});return;case"info":ui.info({command,message:outcome.message});return;case"error":ui.error({command,code:outcome.code,message:outcome.message,...outcome.hint?{hint:outcome.hint}:{}})}}function isPretty(){return currentMode().format==="pretty"}function nonInteractive(options){return options.yes===!0||currentMode().format==="json"||!isInteractive()}async function initCommand(dirArg,options){isPretty()&&mt("Set up your Fimo project"),emitInitOutcome("init",await runInit(dirArg,options))}async function runInit(dirArg,options){let
|
|
669
|
+
`)}).finally(()=>{process.exit(130)})},"handler");return process.on("SIGINT",handler),()=>{process.off("SIGINT",handler)}}function installArgsForPackageManager(packageManager){return packageManager==="pnpm"?["install","--config.dangerouslyAllowAllBuilds=true"]:["install"]}function formatPackageManagerCommand(packageManager,args){return[packageManager,...args].join(" ")}async function installDependencies(packageManager,targetDir){let args=installArgsForPackageManager(packageManager),command=formatPackageManagerCommand(packageManager,args),installSp=spinner(`Installing dependencies (${command})`);try{return await execFileAsync7(packageManager,args,{cwd:targetDir}),installSp.succeed("Dependencies installed"),{installed:!0,command,error:null}}catch(error){let message=error instanceof Error?error.message:String(error);return installSp.fail(`Failed to install dependencies: ${message}`),{installed:!1,command,error:message}}}function detectPackageManager2(){return isCommandAvailable("pnpm")?"pnpm":isCommandAvailable("bun")?"bun":isCommandAvailable("yarn")?"yarn":"npm"}function isCommandAvailable(command){let probe=process.platform==="win32"?"where":"which";return spawnSync2(probe,[command],{stdio:"ignore"}).status===0}async function resolveOrganization(api,explicit,options={}){if(explicit)return explicit;let activeOrganizationId=readCredentials()?.activeOrganization?.id,nonInteractive2=options.nonInteractive??(currentMode().format==="json"||!isInteractive());if(nonInteractive2&&activeOrganizationId)return activeOrganizationId;let orgs2;try{orgs2=await api.listOrganizations()}catch(error){throw rethrowCliAuthError(error),new ScaffoldError("LIST_ORGS_FAILED",`Failed to list organizations: ${error instanceof Error?error.message:String(error)}`)}if(orgs2.length===0)throw new ScaffoldError("NO_ORGANIZATIONS","No organization found for this account.");if(orgs2.length===1)return orgs2[0].id;if(nonInteractive2)throw new ScaffoldError("ORGANIZATION_REQUIRED","Several organizations are available and no active organization is configured.","Pass --org <organizationId>, or run `fimo orgs switch --org <id-or-slug>` first.");let currentId=orgs2.some(organization=>organization.id===activeOrganizationId)?activeOrganizationId:void 0,selected=await _t({message:"Select an organization for this project",initialValue:currentId,options:orgs2.map(organization=>({value:organization.id,label:organization.name,hint:organization.id===currentId?"current":organization.slug}))});if(q(selected))throw new ScaffoldError("ORGANIZATION_SELECTION_CANCELLED","Organization selection cancelled.");return selected}var execFileAsync7,MAIN_BRANCH,ScaffoldError,init_scaffold_project=__esm({"src/cli/commands/scaffold-project.ts"(){init_dist5();init_dist();init_api();init_auth();init_starters();init_agents();init_auth_errors();init_git_credential_setup();init_git();init_interactive();init_local_project_files();init_scaffold();init_skills();execFileAsync7=promisify8(execFile8),MAIN_BRANCH="main",ScaffoldError=class extends Error{static{__name(this,"ScaffoldError")}code;hint;constructor(code2,message,hint){super(message),this.name="ScaffoldError",this.code=code2,this.hint=hint}};__name(explainCreateProjectError,"explainCreateProjectError");__name(scaffoldNewProject,"scaffoldNewProject");__name(scaffoldIntoProject,"scaffoldIntoProject");__name(finalizeInitialCommit,"finalizeInitialCommit");__name(installAbortHandler,"installAbortHandler");__name(installArgsForPackageManager,"installArgsForPackageManager");__name(formatPackageManagerCommand,"formatPackageManagerCommand");__name(installDependencies,"installDependencies");__name(detectPackageManager2,"detectPackageManager");__name(isCommandAvailable,"isCommandAvailable");__name(resolveOrganization,"resolveOrganization")}});import fs33 from"node:fs";import path33 from"node:path";function emitInitOutcome(command,outcome){switch(outcome.status){case"ok":ui.result({command,data:outcome.data,render:__name(ctx=>renderInitSuccess(ctx,outcome.renderArgs),"render"),warnings:outcome.warnings.length>0?outcome.warnings:void 0});return;case"cancelled":ui.info({command,message:"Cancelled."});return;case"info":ui.info({command,message:outcome.message});return;case"error":ui.error({command,code:outcome.code,message:outcome.message,...outcome.hint?{hint:outcome.hint}:{}})}}function isPretty(){return currentMode().format==="pretty"}function nonInteractive(options){return options.yes===!0||currentMode().format==="json"||!isInteractive()}async function initCommand(dirArg,options){isPretty()&&mt("Set up your Fimo project"),emitInitOutcome("init",await runInit(dirArg,options))}async function runInit(dirArg,options){let framework;try{framework=resolveTemplateFramework(options.framework)}catch(error){if(error instanceof TemplateFrameworkError)return{status:"error",code:"FRAMEWORK_INVALID",message:error.message};throw error}let initOptions={...options,framework};if(initOptions.projectId&&initOptions.starter)return{status:"error",code:"STARTER_EXISTING_PROJECT",message:"Project starters can only be used when creating a new project.",hint:"Remove --starter when using --project-id, or omit --project-id to create a new project."};try{resolveProjectStarter(initOptions.starter)}catch(error){if(error instanceof StarterError)return{status:"error",code:error.code,message:error.message};throw error}if(initOptions.starter&&framework!=="react-router")return{status:"error",code:"STARTER_FRAMEWORK_UNSUPPORTED",message:`Project starter "${initOptions.starter}" does not support ${framework}.`,hint:"Remove --starter, or use --framework react-router."};let cfg=loadConfig();if(initOptions.packageManager&&!PACKAGE_MANAGERS.includes(initOptions.packageManager.toLowerCase()))return{status:"error",code:"PACKAGE_MANAGER_INVALID",message:`Unknown package manager "${initOptions.packageManager}".`,hint:`Use one of: ${PACKAGE_MANAGERS.join(", ")}.`};let authAbort=await ensureAuthenticated(cfg,nonInteractive(initOptions));if(authAbort)return authAbort;let api=new FimoApiClient(cfg),creds=readCredentials(cfg),mode2=await resolveUseExisting(initOptions);if(mode2==="cancelled")return{status:"cancelled"};let useExisting=mode2==="existing";if(useExisting&&initOptions.starter)return{status:"error",code:"STARTER_EXISTING_PROJECT",message:"Project starters can only be used when creating a new project.",hint:"Remove --starter when linking an existing project, or choose create-new without an existing project."};let planned=await planInit({api,creds,useExisting,dirArg,options:initOptions});if("status"in planned)return planned;let{plan}=planned,ran=useExisting?await runExisting({api,cfg,projectId:plan.projectId,dirArg,options:plan.options}):await runNew({api,cfg,targetDir:plan.targetDir,displayName:plan.displayName,options:plan.options});if("status"in ran)return ran;let{checkout}=ran.run,scaffoldSummary=ran.run.summary,starterSeed=ran.run.starterSeed,scaffoldedAgents=ran.run.selectedAgents,pushedInitial=!0,depResult=await maybeInstallDependencies(checkout.targetDir,plan.packageManager);try{({pushedInitial}=await ran.run.finalize(checkout.targetDir))}finally{ran.run.releaseAbort()}let skills2=await maybeInstallSkills(plan.options,scaffoldedAgents),warnings=[];return pushedInitial||warnings.push("Initial commit was not pushed \u2014 the project's remote is empty. Sign in (`fimo login`), then run `fimo deploy` from the project to push it."),depResult.error&&warnings.push(`Dependency install failed: ${depResult.error}`),skills2.error&&warnings.push(skills2.error),{status:"ok",data:{ok:!0,project_id:checkout.projectId,project_name:checkout.projectName,mode:useExisting?"existing":"new",target_dir:checkout.targetDir,relative_dir:checkout.relativeTarget,scaffold:scaffoldSummary,...starterSeed?{starter:`${starterSeed.id}@${starterSeed.version}`,starter_seed:starterSeed}:{},installed_deps:depResult.installed,package_manager:depResult.packageManager,install_error:depResult.error,skills_set_up:skills2.setUp,skills_error:skills2.error,pushed_initial:pushedInitial},renderArgs:{projectName:checkout.projectName,relativeDir:checkout.relativeTarget,isNew:!useExisting,installedDeps:depResult.installed,packageManager:depResult.packageManager,pushedInitial,starter:starterSeed?`${starterSeed.id}@${starterSeed.version}`:null},warnings}}function renderInitSuccess(ctx,args){let p2=ctx.color?palette:makeColorPalette({forceDisable:!0});if(!args.pushedInitial)return renderInitPushFailed(p2,ctx.ascii,args);let check=ctx.ascii?"[ok]":"\u2705",pm=args.packageManager??"pnpm",dev=args.installedDeps?`${pm} dev`:`${pm} install`,devTail=args.installedDeps?"to launch your project's development server":`then ${p2.cyan(`${pm} dev`)} to launch it`,commands=[["npx fimo deploy","to push a preview of your site"],["npx fimo deploy --publish","to push your site live"],["npx fimo skills install","to set up Fimo skills for your AI tools"],["npx fimo --help","to explore the CLI"]],width=Math.max(...commands.map(([c2])=>c2.length)),lines=[];lines.push(`${check} ${p2.bold(`Success! Your project ${args.projectName} ${args.isNew?"has been created":"is linked"}.`)}`),lines.push(""),args.relativeDir!=="."&&args.relativeDir!==""&&(lines.push(`${p2.cyan(`cd ${args.relativeDir}`)} ${p2.dim("to navigate to your project directory")}`),lines.push("")),args.starter&&(lines.push(`Starter content: ${p2.cyan(args.starter)} ${p2.dim("is ready to edit in Fimo")}`),lines.push("")),lines.push(`Get started by running ${p2.cyan(dev)} ${devTail}`),lines.push(""),lines.push(""),lines.push(p2.bold("Other helpful commands:"));for(let[cmd,desc]of commands)lines.push(`${p2.cyan(cmd.padEnd(width))} ${p2.dim(desc)}`);return lines.join(`
|
|
670
670
|
`)}function renderInitPushFailed(p2,ascii,args){let warn=ascii?"[!]":"\u26A0\uFE0F",steps=[["npx fimo login","to sign in (if you are not already)"],["npx fimo deploy","to push the first commit and finish setup"]],width=Math.max(...steps.map(([c2])=>c2.length)),lines=[];lines.push(`${warn} ${p2.bold(`Your project ${args.projectName} was created, but its first commit was not pushed.`)}`),lines.push(""),lines.push(p2.dim("The remote is empty until you push, so it can't be cloned or deployed yet.")),lines.push(""),args.relativeDir!=="."&&args.relativeDir!==""?lines.push(`${p2.cyan(`cd ${args.relativeDir}`)} ${p2.dim("then finish setup:")}`):lines.push(p2.dim("Finish setup:"));for(let[cmd,desc]of steps)lines.push(`${p2.cyan(cmd.padEnd(width))} ${p2.dim(desc)}`);return lines.join(`
|
|
671
|
-
`)}async function ensureAuthenticated(cfg,noPrompt){if(readCredentials(cfg)?.access_token)return null;if(noPrompt)return{status:"error",code:"NOT_AUTHENTICATED",message:"You are not signed in to Fimo.",hint:"Run `fimo login` first, then re-run `fimo init`."};isPretty()&&O2.step("You are not signed in yet \u2014 opening your browser to sign in.");try{return await performBrowserLogin(cfg),null}catch(error){if(error instanceof LoginError)return{status:"error",code:error.code,message:error.message};throw error}}async function resolveUseExisting(options){if(options.projectId)return"existing";if(nonInteractive(options))return"new";let choice=await _t({message:"What do you want to do?",options:[{value:"new",label:"Create a new project"},{value:"existing",label:"Link an existing project"}]});return q(choice)?"cancelled":choice==="existing"?"existing":"new"}async function planInit(args){let{api,creds,useExisting,dirArg,options}=args,projectId,targetDir,displayName,derived={...options};if(useExisting)if(options.projectId)projectId=options.projectId;else{let picked=await selectProjectId({api,activeOrganizationId:creds?.activeOrganization?.id??null,message:"Select a project to link"});if(picked.status==="empty")return{status:"info",message:picked.message};if(picked.status!=="selected")return picked;projectId=picked.projectId}else{let resolved=await resolveTargetDir(dirArg,nonInteractive(options));if("status"in resolved)return resolved;if(targetDir=resolved.targetDir,displayName=resolved.displayName,fs33.existsSync(targetDir)&&fs33.readdirSync(targetDir).length>0){let name=path33.basename(targetDir);return{status:"error",code:"DIRECTORY_NOT_EMPTY",message:`The folder "${name}" already exists and isn't empty.`,hint:`Pick a different directory (e.g. \`fimo init <dir>\`), or empty "${name}" first.`}}try{derived.org=await resolveOrganization(api,options.org,{nonInteractive:nonInteractive(options)})}catch(error){if(error instanceof ScaffoldError&&error.code==="ORGANIZATION_SELECTION_CANCELLED")return{status:"cancelled"};if(error instanceof ScaffoldError)return{status:"error",code:error.code,message:error.message,...error.hint?{hint:error.hint}:{}};throw error}}if(nonInteractive(options))options.skills===!1&&!derived.agents&&(derived.agents="none");else{let wantSkills;if(options.skills===!0||options.skills===!1)wantSkills=options.skills;else{let alreadySetUp=(await detectAgentsWithFimoSkills()).length>0,answer=await ot2({message:alreadySetUp?"Fimo skills are already set up for your AI agents. Set them up again?":"Set up Fimo skills for your AI coding agents?",initialValue:!alreadySetUp});if(q(answer))return{status:"cancelled"};wantSkills=answer}if(wantSkills){let agents;try{agents=await selectAgents(options,{promptMessage:"Which agents do you want to set up?",detectFn:detectAgentsWithFimoSkills})}catch(err){return{status:"error",code:"AGENT_SELECTION_FAILED",message:err instanceof Error?err.message:String(err)}}derived.skills=!0,derived.agents=agents.length>0?agents.join(","):"none"}else derived.skills=!1,derived.agents="none"}let packageManager=options.install===!1?null:await resolvePackageManager(derived);return{plan:{projectId,targetDir,displayName,packageManager,options:derived}}}async function runExisting(args){let{api,cfg,projectId,dirArg,options}=args;try{let result=await cloneProject({api,cfg,projectId,dir:dirArg,env:options.env});return{run:{checkout:{projectId:result.project.id,projectName:result.project.displayName??result.project.name,targetDir:result.targetDir,relativeTarget:result.relativeTarget},summary:null,starterSeed:null,selectedAgents:null,finalize:__name(async()=>({pushedInitial:!0}),"finalize"),releaseAbort:__name(()=>{},"releaseAbort")}}}catch(error){if(error instanceof CloneError&&error.code==="EMPTY_REMOTE"&&error.emptyRemote)return adoptEmptyRemote({api,cfg,ctx:error.emptyRemote,options});if(error instanceof CloneError)return{status:"error",code:error.code,message:error.message,...error.hint?{hint:error.hint}:{}};throw error}}async function adoptEmptyRemote(args){let{api,cfg,ctx,options}=args;isPretty()&&O2.step("This project has no content yet \u2014 scaffolding a starter site and pushing the first commit.");try{let result=await scaffoldIntoProject({project:ctx.project,api,cfg,targetDir:ctx.targetDir,options});return{run:{checkout:{projectId:result.project.id,projectName:result.project.displayName??result.project.name,targetDir:result.targetDir,relativeTarget:result.relativeTarget},summary:null,starterSeed:result.starter,selectedAgents:result.selectedAgents,finalize:__name(targetDir=>finalizeInitialCommit({targetDir}),"finalize"),releaseAbort:__name(()=>{},"releaseAbort")}}}catch(error){if(error instanceof ScaffoldError)return{status:"error",code:error.code,message:error.message,...error.hint?{hint:error.hint}:{}};throw error}}async function runNew(args){let{api,cfg,targetDir,displayName,options}=args;try{let{scaffold,releaseAbort}=await scaffoldNewProject({api,cfg,targetDir,displayName,options});return{run:{checkout:{projectId:scaffold.project.id,projectName:scaffold.project.displayName??scaffold.project.name,targetDir:scaffold.targetDir,relativeTarget:scaffold.relativeTarget},summary:null,starterSeed:scaffold.starter,selectedAgents:scaffold.selectedAgents,finalize:__name(dir=>finalizeInitialCommit({targetDir:dir}),"finalize"),releaseAbort}}}catch(error){if(error instanceof ScaffoldError)return{status:"error",code:error.code,message:error.message,...error.hint?{hint:error.hint}:{}};throw error}}async function resolveTargetDir(dirArg,noPrompt){if(dirArg)return{targetDir:path33.resolve(dirArg)};if(noPrompt)return{status:"error",code:"DIRECTORY_REQUIRED",message:"A target directory is required to create a new project.",hint:"Pass [dir] (e.g. `fimo init my-site`), or `--project-id <id>` to link an existing project."};let input=await Ot({message:"Project name",placeholder:"My Fimo Site",validate:__name(value=>value&&value.trim().length>0?void 0:"project name required","validate")});if(q(input))return{status:"cancelled"};let displayName=String(input).trim(),folder=slugifyName(displayName)||"fimo-project";return{targetDir:path33.resolve(folder),displayName}}async function maybeInstallDependencies(targetDir,packageManager){if(!packageManager)return{installed:!1,packageManager:null,error:null};let result=await installDependencies(packageManager,targetDir);return{installed:result.installed,packageManager,error:result.error}}async function resolvePackageManager(options){if(options.packageManager)return options.packageManager.toLowerCase();let detected=detectPackageManager2();if(nonInteractive(options))return detected;let selected=await _t({message:"Install dependencies with which package manager?",initialValue:detected,options:[...PACKAGE_MANAGERS.map(pm=>({value:pm,label:pm})),{value:MANUAL_INSTALL,label:"Manual \u2014 I'll install dependencies myself"}]});return q(selected)||selected===MANUAL_INSTALL?null:selected}async function maybeInstallSkills(options,scaffoldedAgents){if(options.skills===!1)return{setUp:!1,error:null};if(options.skills!==!0&&nonInteractive(options))return{setUp:!1,error:null};let agentsFlag=options.agents;if(scaffoldedAgents!==null){if(scaffoldedAgents.length===0)return{setUp:!1,error:null};agentsFlag=scaffoldedAgents.join(",")}else if(nonInteractive(options)&&!agentsFlag)return{setUp:!1,error:null};let outcome=await runSkillsInstall({agents:agentsFlag,agent:scaffoldedAgents!==null?void 0:options.agent,yes:!0});return outcome.status==="error"&&outcome.code==="NO_AGENTS_SELECTED"?{setUp:!1,error:null}:outcome.status==="ok"?{setUp:!0,error:outcome.data.ok?null:"Some skills failed to install."}:outcome.status==="cancelled"?{setUp:!1,error:null}:{setUp:!1,error:outcome.message}}var PACKAGE_MANAGERS,MANUAL_INSTALL,init_init=__esm({"src/cli/commands/init.ts"(){init_dist5();init_dist();init_api();init_auth();init_config();init_starters();init_agents();init_color();init_interactive();init_slug();init_clone();init_login();init_scaffold_project();init_skills();PACKAGE_MANAGERS=["npm","pnpm","yarn","bun"],MANUAL_INSTALL="manual";__name(emitInitOutcome,"emitInitOutcome");__name(isPretty,"isPretty");__name(nonInteractive,"nonInteractive");__name(initCommand,"initCommand");__name(runInit,"runInit");__name(renderInitSuccess,"renderInitSuccess");__name(renderInitPushFailed,"renderInitPushFailed");__name(ensureAuthenticated,"ensureAuthenticated");__name(resolveUseExisting,"resolveUseExisting");__name(planInit,"planInit");__name(runExisting,"runExisting");__name(adoptEmptyRemote,"adoptEmptyRemote");__name(runNew,"runNew");__name(resolveTargetDir,"resolveTargetDir");__name(maybeInstallDependencies,"maybeInstallDependencies");__name(resolvePackageManager,"resolvePackageManager");__name(maybeInstallSkills,"maybeInstallSkills")}});var require_code=__commonJS({"../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/code.js"(exports2){"use strict";Object.defineProperty(exports2,"__esModule",{value:!0});exports2.regexpCode=exports2.getEsmExportName=exports2.getProperty=exports2.safeStringify=exports2.stringify=exports2.strConcat=exports2.addCodeArg=exports2.str=exports2._=exports2.nil=exports2._Code=exports2.Name=exports2.IDENTIFIER=exports2._CodeOrName=void 0;var _CodeOrName=class{static{__name(this,"_CodeOrName")}};exports2._CodeOrName=_CodeOrName;exports2.IDENTIFIER=/^[a-z$_][a-z$_0-9]*$/i;var Name=class extends _CodeOrName{static{__name(this,"Name")}constructor(s){if(super(),!exports2.IDENTIFIER.test(s))throw new Error("CodeGen: name must be a valid identifier");this.str=s}toString(){return this.str}emptyStr(){return!1}get names(){return{[this.str]:1}}};exports2.Name=Name;var _Code=class extends _CodeOrName{static{__name(this,"_Code")}constructor(code2){super(),this._items=typeof code2=="string"?[code2]:code2}toString(){return this.str}emptyStr(){if(this._items.length>1)return!1;let item=this._items[0];return item===""||item==='""'}get str(){var _a4;return(_a4=this._str)!==null&&_a4!==void 0?_a4:this._str=this._items.reduce((s,c2)=>`${s}${c2}`,"")}get names(){var _a4;return(_a4=this._names)!==null&&_a4!==void 0?_a4:this._names=this._items.reduce((names,c2)=>(c2 instanceof Name&&(names[c2.str]=(names[c2.str]||0)+1),names),{})}};exports2._Code=_Code;exports2.nil=new _Code("");function _(strs,...args){let code2=[strs[0]],i=0;for(;i<args.length;)addCodeArg(code2,args[i]),code2.push(strs[++i]);return new _Code(code2)}__name(_,"_");exports2._=_;var plus=new _Code("+");function str(strs,...args){let expr=[safeStringify(strs[0])],i=0;for(;i<args.length;)expr.push(plus),addCodeArg(expr,args[i]),expr.push(plus,safeStringify(strs[++i]));return optimize(expr),new _Code(expr)}__name(str,"str");exports2.str=str;function addCodeArg(code2,arg){arg instanceof _Code?code2.push(...arg._items):arg instanceof Name?code2.push(arg):code2.push(interpolate(arg))}__name(addCodeArg,"addCodeArg");exports2.addCodeArg=addCodeArg;function optimize(expr){let i=1;for(;i<expr.length-1;){if(expr[i]===plus){let res=mergeExprItems(expr[i-1],expr[i+1]);if(res!==void 0){expr.splice(i-1,3,res);continue}expr[i++]="+"}i++}}__name(optimize,"optimize");function mergeExprItems(a,b){if(b==='""')return a;if(a==='""')return b;if(typeof a=="string")return b instanceof Name||a[a.length-1]!=='"'?void 0:typeof b!="string"?`${a.slice(0,-1)}${b}"`:b[0]==='"'?a.slice(0,-1)+b.slice(1):void 0;if(typeof b=="string"&&b[0]==='"'&&!(a instanceof Name))return`"${a}${b.slice(1)}`}__name(mergeExprItems,"mergeExprItems");function strConcat(c1,c2){return c2.emptyStr()?c1:c1.emptyStr()?c2:str`${c1}${c2}`}__name(strConcat,"strConcat");exports2.strConcat=strConcat;function interpolate(x){return typeof x=="number"||typeof x=="boolean"||x===null?x:safeStringify(Array.isArray(x)?x.join(","):x)}__name(interpolate,"interpolate");function stringify5(x){return new _Code(safeStringify(x))}__name(stringify5,"stringify");exports2.stringify=stringify5;function safeStringify(x){return JSON.stringify(x).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}__name(safeStringify,"safeStringify");exports2.safeStringify=safeStringify;function getProperty(key){return typeof key=="string"&&exports2.IDENTIFIER.test(key)?new _Code(`.${key}`):_`[${key}]`}__name(getProperty,"getProperty");exports2.getProperty=getProperty;function getEsmExportName(key){if(typeof key=="string"&&exports2.IDENTIFIER.test(key))return new _Code(`${key}`);throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`)}__name(getEsmExportName,"getEsmExportName");exports2.getEsmExportName=getEsmExportName;function regexpCode(rx){return new _Code(rx.toString())}__name(regexpCode,"regexpCode");exports2.regexpCode=regexpCode}});var require_scope=__commonJS({"../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/scope.js"(exports2){"use strict";Object.defineProperty(exports2,"__esModule",{value:!0});exports2.ValueScope=exports2.ValueScopeName=exports2.Scope=exports2.varKinds=exports2.UsedValueState=void 0;var code_1=require_code(),ValueError=class extends Error{static{__name(this,"ValueError")}constructor(name){super(`CodeGen: "code" for ${name} not defined`),this.value=name.value}},UsedValueState;(function(UsedValueState2){UsedValueState2[UsedValueState2.Started=0]="Started",UsedValueState2[UsedValueState2.Completed=1]="Completed"})(UsedValueState||(exports2.UsedValueState=UsedValueState={}));exports2.varKinds={const:new code_1.Name("const"),let:new code_1.Name("let"),var:new code_1.Name("var")};var Scope=class{static{__name(this,"Scope")}constructor({prefixes,parent:parent2}={}){this._names={},this._prefixes=prefixes,this._parent=parent2}toName(nameOrPrefix){return nameOrPrefix instanceof code_1.Name?nameOrPrefix:this.name(nameOrPrefix)}name(prefix){return new code_1.Name(this._newName(prefix))}_newName(prefix){let ng=this._names[prefix]||this._nameGroup(prefix);return`${prefix}${ng.index++}`}_nameGroup(prefix){var _a4,_b;if(!((_b=(_a4=this._parent)===null||_a4===void 0?void 0:_a4._prefixes)===null||_b===void 0)&&_b.has(prefix)||this._prefixes&&!this._prefixes.has(prefix))throw new Error(`CodeGen: prefix "${prefix}" is not allowed in this scope`);return this._names[prefix]={prefix,index:0}}};exports2.Scope=Scope;var ValueScopeName=class extends code_1.Name{static{__name(this,"ValueScopeName")}constructor(prefix,nameStr){super(nameStr),this.prefix=prefix}setValue(value,{property,itemIndex}){this.value=value,this.scopePath=(0,code_1._)`.${new code_1.Name(property)}[${itemIndex}]`}};exports2.ValueScopeName=ValueScopeName;var line=(0,code_1._)`\n`,ValueScope=class extends Scope{static{__name(this,"ValueScope")}constructor(opts){super(opts),this._values={},this._scope=opts.scope,this.opts={...opts,_n:opts.lines?line:code_1.nil}}get(){return this._scope}name(prefix){return new ValueScopeName(prefix,this._newName(prefix))}value(nameOrPrefix,value){var _a4;if(value.ref===void 0)throw new Error("CodeGen: ref must be passed in value");let name=this.toName(nameOrPrefix),{prefix}=name,valueKey=(_a4=value.key)!==null&&_a4!==void 0?_a4:value.ref,vs=this._values[prefix];if(vs){let _name=vs.get(valueKey);if(_name)return _name}else vs=this._values[prefix]=new Map;vs.set(valueKey,name);let s=this._scope[prefix]||(this._scope[prefix]=[]),itemIndex=s.length;return s[itemIndex]=value.ref,name.setValue(value,{property:prefix,itemIndex}),name}getValue(prefix,keyOrRef){let vs=this._values[prefix];if(vs)return vs.get(keyOrRef)}scopeRefs(scopeName,values=this._values){return this._reduceValues(values,name=>{if(name.scopePath===void 0)throw new Error(`CodeGen: name "${name}" has no value`);return(0,code_1._)`${scopeName}${name.scopePath}`})}scopeCode(values=this._values,usedValues,getCode){return this._reduceValues(values,name=>{if(name.value===void 0)throw new Error(`CodeGen: name "${name}" has no value`);return name.value.code},usedValues,getCode)}_reduceValues(values,valueCode,usedValues={},getCode){let code2=code_1.nil;for(let prefix in values){let vs=values[prefix];if(!vs)continue;let nameSet=usedValues[prefix]=usedValues[prefix]||new Map;vs.forEach(name=>{if(nameSet.has(name))return;nameSet.set(name,UsedValueState.Started);let c2=valueCode(name);if(c2){let def=this.opts.es5?exports2.varKinds.var:exports2.varKinds.const;code2=(0,code_1._)`${code2}${def} ${name} = ${c2};${this.opts._n}`}else if(c2=getCode?.(name))code2=(0,code_1._)`${code2}${c2}${this.opts._n}`;else throw new ValueError(name);nameSet.set(name,UsedValueState.Completed)})}return code2}};exports2.ValueScope=ValueScope}});var require_codegen=__commonJS({"../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/index.js"(exports2){"use strict";Object.defineProperty(exports2,"__esModule",{value:!0});exports2.or=exports2.and=exports2.not=exports2.CodeGen=exports2.operators=exports2.varKinds=exports2.ValueScopeName=exports2.ValueScope=exports2.Scope=exports2.Name=exports2.regexpCode=exports2.stringify=exports2.getProperty=exports2.nil=exports2.strConcat=exports2.str=exports2._=void 0;var code_1=require_code(),scope_1=require_scope(),code_2=require_code();Object.defineProperty(exports2,"_",{enumerable:!0,get:__name(function(){return code_2._},"get")});Object.defineProperty(exports2,"str",{enumerable:!0,get:__name(function(){return code_2.str},"get")});Object.defineProperty(exports2,"strConcat",{enumerable:!0,get:__name(function(){return code_2.strConcat},"get")});Object.defineProperty(exports2,"nil",{enumerable:!0,get:__name(function(){return code_2.nil},"get")});Object.defineProperty(exports2,"getProperty",{enumerable:!0,get:__name(function(){return code_2.getProperty},"get")});Object.defineProperty(exports2,"stringify",{enumerable:!0,get:__name(function(){return code_2.stringify},"get")});Object.defineProperty(exports2,"regexpCode",{enumerable:!0,get:__name(function(){return code_2.regexpCode},"get")});Object.defineProperty(exports2,"Name",{enumerable:!0,get:__name(function(){return code_2.Name},"get")});var scope_2=require_scope();Object.defineProperty(exports2,"Scope",{enumerable:!0,get:__name(function(){return scope_2.Scope},"get")});Object.defineProperty(exports2,"ValueScope",{enumerable:!0,get:__name(function(){return scope_2.ValueScope},"get")});Object.defineProperty(exports2,"ValueScopeName",{enumerable:!0,get:__name(function(){return scope_2.ValueScopeName},"get")});Object.defineProperty(exports2,"varKinds",{enumerable:!0,get:__name(function(){return scope_2.varKinds},"get")});exports2.operators={GT:new code_1._Code(">"),GTE:new code_1._Code(">="),LT:new code_1._Code("<"),LTE:new code_1._Code("<="),EQ:new code_1._Code("==="),NEQ:new code_1._Code("!=="),NOT:new code_1._Code("!"),OR:new code_1._Code("||"),AND:new code_1._Code("&&"),ADD:new code_1._Code("+")};var Node2=class{static{__name(this,"Node")}optimizeNodes(){return this}optimizeNames(_names,_constants){return this}},Def=class extends Node2{static{__name(this,"Def")}constructor(varKind,name,rhs){super(),this.varKind=varKind,this.name=name,this.rhs=rhs}render({es5,_n}){let varKind=es5?scope_1.varKinds.var:this.varKind,rhs=this.rhs===void 0?"":` = ${this.rhs}`;return`${varKind} ${this.name}${rhs};`+_n}optimizeNames(names,constants){if(names[this.name.str])return this.rhs&&(this.rhs=optimizeExpr(this.rhs,names,constants)),this}get names(){return this.rhs instanceof code_1._CodeOrName?this.rhs.names:{}}},Assign=class extends Node2{static{__name(this,"Assign")}constructor(lhs,rhs,sideEffects){super(),this.lhs=lhs,this.rhs=rhs,this.sideEffects=sideEffects}render({_n}){return`${this.lhs} = ${this.rhs};`+_n}optimizeNames(names,constants){if(!(this.lhs instanceof code_1.Name&&!names[this.lhs.str]&&!this.sideEffects))return this.rhs=optimizeExpr(this.rhs,names,constants),this}get names(){let names=this.lhs instanceof code_1.Name?{}:{...this.lhs.names};return addExprNames(names,this.rhs)}},AssignOp=class extends Assign{static{__name(this,"AssignOp")}constructor(lhs,op,rhs,sideEffects){super(lhs,rhs,sideEffects),this.op=op}render({_n}){return`${this.lhs} ${this.op}= ${this.rhs};`+_n}},Label=class extends Node2{static{__name(this,"Label")}constructor(label){super(),this.label=label,this.names={}}render({_n}){return`${this.label}:`+_n}},Break=class extends Node2{static{__name(this,"Break")}constructor(label){super(),this.label=label,this.names={}}render({_n}){return`break${this.label?` ${this.label}`:""};`+_n}},Throw=class extends Node2{static{__name(this,"Throw")}constructor(error){super(),this.error=error}render({_n}){return`throw ${this.error};`+_n}get names(){return this.error.names}},AnyCode=class extends Node2{static{__name(this,"AnyCode")}constructor(code2){super(),this.code=code2}render({_n}){return`${this.code};`+_n}optimizeNodes(){return`${this.code}`?this:void 0}optimizeNames(names,constants){return this.code=optimizeExpr(this.code,names,constants),this}get names(){return this.code instanceof code_1._CodeOrName?this.code.names:{}}},ParentNode=class extends Node2{static{__name(this,"ParentNode")}constructor(nodes=[]){super(),this.nodes=nodes}render(opts){return this.nodes.reduce((code2,n)=>code2+n.render(opts),"")}optimizeNodes(){let{nodes}=this,i=nodes.length;for(;i--;){let n=nodes[i].optimizeNodes();Array.isArray(n)?nodes.splice(i,1,...n):n?nodes[i]=n:nodes.splice(i,1)}return nodes.length>0?this:void 0}optimizeNames(names,constants){let{nodes}=this,i=nodes.length;for(;i--;){let n=nodes[i];n.optimizeNames(names,constants)||(subtractNames(names,n.names),nodes.splice(i,1))}return nodes.length>0?this:void 0}get names(){return this.nodes.reduce((names,n)=>addNames(names,n.names),{})}},BlockNode=class extends ParentNode{static{__name(this,"BlockNode")}render(opts){return"{"+opts._n+super.render(opts)+"}"+opts._n}},Root2=class extends ParentNode{static{__name(this,"Root")}},Else=class extends BlockNode{static{__name(this,"Else")}};Else.kind="else";var If=class _If extends BlockNode{static{__name(this,"If")}constructor(condition,nodes){super(nodes),this.condition=condition}render(opts){let code2=`if(${this.condition})`+super.render(opts);return this.else&&(code2+="else "+this.else.render(opts)),code2}optimizeNodes(){super.optimizeNodes();let cond=this.condition;if(cond===!0)return this.nodes;let e=this.else;if(e){let ns=e.optimizeNodes();e=this.else=Array.isArray(ns)?new Else(ns):ns}if(e)return cond===!1?e instanceof _If?e:e.nodes:this.nodes.length?this:new _If(not2(cond),e instanceof _If?[e]:e.nodes);if(!(cond===!1||!this.nodes.length))return this}optimizeNames(names,constants){var _a4;if(this.else=(_a4=this.else)===null||_a4===void 0?void 0:_a4.optimizeNames(names,constants),!!(super.optimizeNames(names,constants)||this.else))return this.condition=optimizeExpr(this.condition,names,constants),this}get names(){let names=super.names;return addExprNames(names,this.condition),this.else&&addNames(names,this.else.names),names}};If.kind="if";var For=class extends BlockNode{static{__name(this,"For")}};For.kind="for";var ForLoop=class extends For{static{__name(this,"ForLoop")}constructor(iteration){super(),this.iteration=iteration}render(opts){return`for(${this.iteration})`+super.render(opts)}optimizeNames(names,constants){if(super.optimizeNames(names,constants))return this.iteration=optimizeExpr(this.iteration,names,constants),this}get names(){return addNames(super.names,this.iteration.names)}},ForRange=class extends For{static{__name(this,"ForRange")}constructor(varKind,name,from,to){super(),this.varKind=varKind,this.name=name,this.from=from,this.to=to}render(opts){let varKind=opts.es5?scope_1.varKinds.var:this.varKind,{name,from,to}=this;return`for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)`+super.render(opts)}get names(){let names=addExprNames(super.names,this.from);return addExprNames(names,this.to)}},ForIter=class extends For{static{__name(this,"ForIter")}constructor(loop,varKind,name,iterable){super(),this.loop=loop,this.varKind=varKind,this.name=name,this.iterable=iterable}render(opts){return`for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})`+super.render(opts)}optimizeNames(names,constants){if(super.optimizeNames(names,constants))return this.iterable=optimizeExpr(this.iterable,names,constants),this}get names(){return addNames(super.names,this.iterable.names)}},Func=class extends BlockNode{static{__name(this,"Func")}constructor(name,args,async){super(),this.name=name,this.args=args,this.async=async}render(opts){return`${this.async?"async ":""}function ${this.name}(${this.args})`+super.render(opts)}};Func.kind="func";var Return=class extends ParentNode{static{__name(this,"Return")}render(opts){return"return "+super.render(opts)}};Return.kind="return";var Try=class extends BlockNode{static{__name(this,"Try")}render(opts){let code2="try"+super.render(opts);return this.catch&&(code2+=this.catch.render(opts)),this.finally&&(code2+=this.finally.render(opts)),code2}optimizeNodes(){var _a4,_b;return super.optimizeNodes(),(_a4=this.catch)===null||_a4===void 0||_a4.optimizeNodes(),(_b=this.finally)===null||_b===void 0||_b.optimizeNodes(),this}optimizeNames(names,constants){var _a4,_b;return super.optimizeNames(names,constants),(_a4=this.catch)===null||_a4===void 0||_a4.optimizeNames(names,constants),(_b=this.finally)===null||_b===void 0||_b.optimizeNames(names,constants),this}get names(){let names=super.names;return this.catch&&addNames(names,this.catch.names),this.finally&&addNames(names,this.finally.names),names}},Catch=class extends BlockNode{static{__name(this,"Catch")}constructor(error){super(),this.error=error}render(opts){return`catch(${this.error})`+super.render(opts)}};Catch.kind="catch";var Finally=class extends BlockNode{static{__name(this,"Finally")}render(opts){return"finally"+super.render(opts)}};Finally.kind="finally";var CodeGen=class{static{__name(this,"CodeGen")}constructor(extScope,opts={}){this._values={},this._blockStarts=[],this._constants={},this.opts={...opts,_n:opts.lines?`
|
|
671
|
+
`)}async function ensureAuthenticated(cfg,noPrompt){if(readCredentials(cfg)?.access_token)return null;if(noPrompt)return{status:"error",code:"NOT_AUTHENTICATED",message:"You are not signed in to Fimo.",hint:"Run `fimo login` first, then re-run `fimo init`."};isPretty()&&O2.step("You are not signed in yet \u2014 opening your browser to sign in.");try{return await performBrowserLogin(cfg),null}catch(error){if(error instanceof LoginError)return{status:"error",code:error.code,message:error.message};throw error}}async function resolveUseExisting(options){if(options.projectId)return"existing";if(nonInteractive(options))return"new";let choice=await _t({message:"What do you want to do?",options:[{value:"new",label:"Create a new project"},{value:"existing",label:"Link an existing project"}]});return q(choice)?"cancelled":choice==="existing"?"existing":"new"}async function planInit(args){let{api,creds,useExisting,dirArg,options}=args,projectId,targetDir,displayName,derived={...options};if(useExisting)if(options.projectId)projectId=options.projectId;else{let picked=await selectProjectId({api,activeOrganizationId:creds?.activeOrganization?.id??null,message:"Select a project to link"});if(picked.status==="empty")return{status:"info",message:picked.message};if(picked.status!=="selected")return picked;projectId=picked.projectId}else{let resolved=await resolveTargetDir(dirArg,nonInteractive(options));if("status"in resolved)return resolved;if(targetDir=resolved.targetDir,displayName=resolved.displayName,fs33.existsSync(targetDir)&&fs33.readdirSync(targetDir).length>0){let name=path33.basename(targetDir);return{status:"error",code:"DIRECTORY_NOT_EMPTY",message:`The folder "${name}" already exists and isn't empty.`,hint:`Pick a different directory (e.g. \`fimo init <dir>\`), or empty "${name}" first.`}}try{derived.org=await resolveOrganization(api,options.org,{nonInteractive:nonInteractive(options)})}catch(error){if(error instanceof ScaffoldError&&error.code==="ORGANIZATION_SELECTION_CANCELLED")return{status:"cancelled"};if(error instanceof ScaffoldError)return{status:"error",code:error.code,message:error.message,...error.hint?{hint:error.hint}:{}};throw error}}if(nonInteractive(options))options.skills===!1&&!derived.agents&&(derived.agents="none");else{let wantSkills;if(options.skills===!0||options.skills===!1)wantSkills=options.skills;else{let alreadySetUp=(await detectAgentsWithFimoSkills()).length>0,answer=await ot2({message:alreadySetUp?"Fimo skills are already set up for your AI agents. Set them up again?":"Set up Fimo skills for your AI coding agents?",initialValue:!alreadySetUp});if(q(answer))return{status:"cancelled"};wantSkills=answer}if(wantSkills){let agents;try{agents=await selectAgents(options,{promptMessage:"Which agents do you want to set up?",detectFn:detectAgentsWithFimoSkills})}catch(err){return{status:"error",code:"AGENT_SELECTION_FAILED",message:err instanceof Error?err.message:String(err)}}derived.skills=!0,derived.agents=agents.length>0?agents.join(","):"none"}else derived.skills=!1,derived.agents="none"}let packageManager=options.install===!1?null:await resolvePackageManager(derived);return{plan:{projectId,targetDir,displayName,packageManager,options:derived}}}async function runExisting(args){let{api,cfg,projectId,dirArg,options}=args;try{let result=await cloneProject({api,cfg,projectId,dir:dirArg,env:options.env});return{run:{checkout:{projectId:result.project.id,projectName:result.project.displayName??result.project.name,targetDir:result.targetDir,relativeTarget:result.relativeTarget},summary:null,starterSeed:null,selectedAgents:null,finalize:__name(async()=>({pushedInitial:!0}),"finalize"),releaseAbort:__name(()=>{},"releaseAbort")}}}catch(error){if(error instanceof CloneError&&error.code==="EMPTY_REMOTE"&&error.emptyRemote)return adoptEmptyRemote({api,cfg,ctx:error.emptyRemote,options});if(error instanceof CloneError)return{status:"error",code:error.code,message:error.message,...error.hint?{hint:error.hint}:{}};throw error}}async function adoptEmptyRemote(args){let{api,cfg,ctx,options}=args;isPretty()&&O2.step("This project has no content yet \u2014 scaffolding a starter site and pushing the first commit.");try{let result=await scaffoldIntoProject({project:ctx.project,api,cfg,targetDir:ctx.targetDir,options});return{run:{checkout:{projectId:result.project.id,projectName:result.project.displayName??result.project.name,targetDir:result.targetDir,relativeTarget:result.relativeTarget},summary:null,starterSeed:result.starter,selectedAgents:result.selectedAgents,finalize:__name(targetDir=>finalizeInitialCommit({targetDir}),"finalize"),releaseAbort:__name(()=>{},"releaseAbort")}}}catch(error){if(error instanceof ScaffoldError)return{status:"error",code:error.code,message:error.message,...error.hint?{hint:error.hint}:{}};throw error}}async function runNew(args){let{api,cfg,targetDir,displayName,options}=args;try{let{scaffold,releaseAbort}=await scaffoldNewProject({api,cfg,targetDir,displayName,options});return{run:{checkout:{projectId:scaffold.project.id,projectName:scaffold.project.displayName??scaffold.project.name,targetDir:scaffold.targetDir,relativeTarget:scaffold.relativeTarget},summary:null,starterSeed:scaffold.starter,selectedAgents:scaffold.selectedAgents,finalize:__name(dir=>finalizeInitialCommit({targetDir:dir}),"finalize"),releaseAbort}}}catch(error){if(error instanceof ScaffoldError)return{status:"error",code:error.code,message:error.message,...error.hint?{hint:error.hint}:{}};throw error}}async function resolveTargetDir(dirArg,noPrompt){if(dirArg)return{targetDir:path33.resolve(dirArg)};if(noPrompt)return{status:"error",code:"DIRECTORY_REQUIRED",message:"A target directory is required to create a new project.",hint:"Pass [dir] (e.g. `fimo init my-site`), or `--project-id <id>` to link an existing project."};let input=await Ot({message:"Project name",placeholder:"My Fimo Site",validate:__name(value=>value&&value.trim().length>0?void 0:"project name required","validate")});if(q(input))return{status:"cancelled"};let displayName=String(input).trim(),folder=slugifyName(displayName)||"fimo-project";return{targetDir:path33.resolve(folder),displayName}}async function maybeInstallDependencies(targetDir,packageManager){if(!packageManager)return{installed:!1,packageManager:null,error:null};let result=await installDependencies(packageManager,targetDir);return{installed:result.installed,packageManager,error:result.error}}async function resolvePackageManager(options){if(options.packageManager)return options.packageManager.toLowerCase();let detected=detectPackageManager2();if(nonInteractive(options))return detected;let selected=await _t({message:"Install dependencies with which package manager?",initialValue:detected,options:[...PACKAGE_MANAGERS.map(pm=>({value:pm,label:pm})),{value:MANUAL_INSTALL,label:"Manual \u2014 I'll install dependencies myself"}]});return q(selected)||selected===MANUAL_INSTALL?null:selected}async function maybeInstallSkills(options,scaffoldedAgents){if(options.skills===!1)return{setUp:!1,error:null};if(options.skills!==!0&&nonInteractive(options))return{setUp:!1,error:null};let agentsFlag=options.agents;if(scaffoldedAgents!==null){if(scaffoldedAgents.length===0)return{setUp:!1,error:null};agentsFlag=scaffoldedAgents.join(",")}else if(nonInteractive(options)&&!agentsFlag)return{setUp:!1,error:null};let outcome=await runSkillsInstall({agents:agentsFlag,agent:scaffoldedAgents!==null?void 0:options.agent,yes:!0});return outcome.status==="error"&&outcome.code==="NO_AGENTS_SELECTED"?{setUp:!1,error:null}:outcome.status==="ok"?{setUp:!0,error:outcome.data.ok?null:"Some skills failed to install."}:outcome.status==="cancelled"?{setUp:!1,error:null}:{setUp:!1,error:outcome.message}}var PACKAGE_MANAGERS,MANUAL_INSTALL,init_init=__esm({"src/cli/commands/init.ts"(){init_dist5();init_dist();init_api();init_auth();init_config();init_starters();init_agents();init_color();init_interactive();init_scaffold();init_slug();init_clone();init_login();init_scaffold_project();init_skills();PACKAGE_MANAGERS=["npm","pnpm","yarn","bun"],MANUAL_INSTALL="manual";__name(emitInitOutcome,"emitInitOutcome");__name(isPretty,"isPretty");__name(nonInteractive,"nonInteractive");__name(initCommand,"initCommand");__name(runInit,"runInit");__name(renderInitSuccess,"renderInitSuccess");__name(renderInitPushFailed,"renderInitPushFailed");__name(ensureAuthenticated,"ensureAuthenticated");__name(resolveUseExisting,"resolveUseExisting");__name(planInit,"planInit");__name(runExisting,"runExisting");__name(adoptEmptyRemote,"adoptEmptyRemote");__name(runNew,"runNew");__name(resolveTargetDir,"resolveTargetDir");__name(maybeInstallDependencies,"maybeInstallDependencies");__name(resolvePackageManager,"resolvePackageManager");__name(maybeInstallSkills,"maybeInstallSkills")}});var require_code=__commonJS({"../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/code.js"(exports2){"use strict";Object.defineProperty(exports2,"__esModule",{value:!0});exports2.regexpCode=exports2.getEsmExportName=exports2.getProperty=exports2.safeStringify=exports2.stringify=exports2.strConcat=exports2.addCodeArg=exports2.str=exports2._=exports2.nil=exports2._Code=exports2.Name=exports2.IDENTIFIER=exports2._CodeOrName=void 0;var _CodeOrName=class{static{__name(this,"_CodeOrName")}};exports2._CodeOrName=_CodeOrName;exports2.IDENTIFIER=/^[a-z$_][a-z$_0-9]*$/i;var Name=class extends _CodeOrName{static{__name(this,"Name")}constructor(s){if(super(),!exports2.IDENTIFIER.test(s))throw new Error("CodeGen: name must be a valid identifier");this.str=s}toString(){return this.str}emptyStr(){return!1}get names(){return{[this.str]:1}}};exports2.Name=Name;var _Code=class extends _CodeOrName{static{__name(this,"_Code")}constructor(code2){super(),this._items=typeof code2=="string"?[code2]:code2}toString(){return this.str}emptyStr(){if(this._items.length>1)return!1;let item=this._items[0];return item===""||item==='""'}get str(){var _a4;return(_a4=this._str)!==null&&_a4!==void 0?_a4:this._str=this._items.reduce((s,c2)=>`${s}${c2}`,"")}get names(){var _a4;return(_a4=this._names)!==null&&_a4!==void 0?_a4:this._names=this._items.reduce((names,c2)=>(c2 instanceof Name&&(names[c2.str]=(names[c2.str]||0)+1),names),{})}};exports2._Code=_Code;exports2.nil=new _Code("");function _(strs,...args){let code2=[strs[0]],i=0;for(;i<args.length;)addCodeArg(code2,args[i]),code2.push(strs[++i]);return new _Code(code2)}__name(_,"_");exports2._=_;var plus=new _Code("+");function str(strs,...args){let expr=[safeStringify(strs[0])],i=0;for(;i<args.length;)expr.push(plus),addCodeArg(expr,args[i]),expr.push(plus,safeStringify(strs[++i]));return optimize(expr),new _Code(expr)}__name(str,"str");exports2.str=str;function addCodeArg(code2,arg){arg instanceof _Code?code2.push(...arg._items):arg instanceof Name?code2.push(arg):code2.push(interpolate(arg))}__name(addCodeArg,"addCodeArg");exports2.addCodeArg=addCodeArg;function optimize(expr){let i=1;for(;i<expr.length-1;){if(expr[i]===plus){let res=mergeExprItems(expr[i-1],expr[i+1]);if(res!==void 0){expr.splice(i-1,3,res);continue}expr[i++]="+"}i++}}__name(optimize,"optimize");function mergeExprItems(a,b){if(b==='""')return a;if(a==='""')return b;if(typeof a=="string")return b instanceof Name||a[a.length-1]!=='"'?void 0:typeof b!="string"?`${a.slice(0,-1)}${b}"`:b[0]==='"'?a.slice(0,-1)+b.slice(1):void 0;if(typeof b=="string"&&b[0]==='"'&&!(a instanceof Name))return`"${a}${b.slice(1)}`}__name(mergeExprItems,"mergeExprItems");function strConcat(c1,c2){return c2.emptyStr()?c1:c1.emptyStr()?c2:str`${c1}${c2}`}__name(strConcat,"strConcat");exports2.strConcat=strConcat;function interpolate(x){return typeof x=="number"||typeof x=="boolean"||x===null?x:safeStringify(Array.isArray(x)?x.join(","):x)}__name(interpolate,"interpolate");function stringify5(x){return new _Code(safeStringify(x))}__name(stringify5,"stringify");exports2.stringify=stringify5;function safeStringify(x){return JSON.stringify(x).replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}__name(safeStringify,"safeStringify");exports2.safeStringify=safeStringify;function getProperty(key){return typeof key=="string"&&exports2.IDENTIFIER.test(key)?new _Code(`.${key}`):_`[${key}]`}__name(getProperty,"getProperty");exports2.getProperty=getProperty;function getEsmExportName(key){if(typeof key=="string"&&exports2.IDENTIFIER.test(key))return new _Code(`${key}`);throw new Error(`CodeGen: invalid export name: ${key}, use explicit $id name mapping`)}__name(getEsmExportName,"getEsmExportName");exports2.getEsmExportName=getEsmExportName;function regexpCode(rx){return new _Code(rx.toString())}__name(regexpCode,"regexpCode");exports2.regexpCode=regexpCode}});var require_scope=__commonJS({"../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/scope.js"(exports2){"use strict";Object.defineProperty(exports2,"__esModule",{value:!0});exports2.ValueScope=exports2.ValueScopeName=exports2.Scope=exports2.varKinds=exports2.UsedValueState=void 0;var code_1=require_code(),ValueError=class extends Error{static{__name(this,"ValueError")}constructor(name){super(`CodeGen: "code" for ${name} not defined`),this.value=name.value}},UsedValueState;(function(UsedValueState2){UsedValueState2[UsedValueState2.Started=0]="Started",UsedValueState2[UsedValueState2.Completed=1]="Completed"})(UsedValueState||(exports2.UsedValueState=UsedValueState={}));exports2.varKinds={const:new code_1.Name("const"),let:new code_1.Name("let"),var:new code_1.Name("var")};var Scope=class{static{__name(this,"Scope")}constructor({prefixes,parent:parent2}={}){this._names={},this._prefixes=prefixes,this._parent=parent2}toName(nameOrPrefix){return nameOrPrefix instanceof code_1.Name?nameOrPrefix:this.name(nameOrPrefix)}name(prefix){return new code_1.Name(this._newName(prefix))}_newName(prefix){let ng=this._names[prefix]||this._nameGroup(prefix);return`${prefix}${ng.index++}`}_nameGroup(prefix){var _a4,_b;if(!((_b=(_a4=this._parent)===null||_a4===void 0?void 0:_a4._prefixes)===null||_b===void 0)&&_b.has(prefix)||this._prefixes&&!this._prefixes.has(prefix))throw new Error(`CodeGen: prefix "${prefix}" is not allowed in this scope`);return this._names[prefix]={prefix,index:0}}};exports2.Scope=Scope;var ValueScopeName=class extends code_1.Name{static{__name(this,"ValueScopeName")}constructor(prefix,nameStr){super(nameStr),this.prefix=prefix}setValue(value,{property,itemIndex}){this.value=value,this.scopePath=(0,code_1._)`.${new code_1.Name(property)}[${itemIndex}]`}};exports2.ValueScopeName=ValueScopeName;var line=(0,code_1._)`\n`,ValueScope=class extends Scope{static{__name(this,"ValueScope")}constructor(opts){super(opts),this._values={},this._scope=opts.scope,this.opts={...opts,_n:opts.lines?line:code_1.nil}}get(){return this._scope}name(prefix){return new ValueScopeName(prefix,this._newName(prefix))}value(nameOrPrefix,value){var _a4;if(value.ref===void 0)throw new Error("CodeGen: ref must be passed in value");let name=this.toName(nameOrPrefix),{prefix}=name,valueKey=(_a4=value.key)!==null&&_a4!==void 0?_a4:value.ref,vs=this._values[prefix];if(vs){let _name=vs.get(valueKey);if(_name)return _name}else vs=this._values[prefix]=new Map;vs.set(valueKey,name);let s=this._scope[prefix]||(this._scope[prefix]=[]),itemIndex=s.length;return s[itemIndex]=value.ref,name.setValue(value,{property:prefix,itemIndex}),name}getValue(prefix,keyOrRef){let vs=this._values[prefix];if(vs)return vs.get(keyOrRef)}scopeRefs(scopeName,values=this._values){return this._reduceValues(values,name=>{if(name.scopePath===void 0)throw new Error(`CodeGen: name "${name}" has no value`);return(0,code_1._)`${scopeName}${name.scopePath}`})}scopeCode(values=this._values,usedValues,getCode){return this._reduceValues(values,name=>{if(name.value===void 0)throw new Error(`CodeGen: name "${name}" has no value`);return name.value.code},usedValues,getCode)}_reduceValues(values,valueCode,usedValues={},getCode){let code2=code_1.nil;for(let prefix in values){let vs=values[prefix];if(!vs)continue;let nameSet=usedValues[prefix]=usedValues[prefix]||new Map;vs.forEach(name=>{if(nameSet.has(name))return;nameSet.set(name,UsedValueState.Started);let c2=valueCode(name);if(c2){let def=this.opts.es5?exports2.varKinds.var:exports2.varKinds.const;code2=(0,code_1._)`${code2}${def} ${name} = ${c2};${this.opts._n}`}else if(c2=getCode?.(name))code2=(0,code_1._)`${code2}${c2}${this.opts._n}`;else throw new ValueError(name);nameSet.set(name,UsedValueState.Completed)})}return code2}};exports2.ValueScope=ValueScope}});var require_codegen=__commonJS({"../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/codegen/index.js"(exports2){"use strict";Object.defineProperty(exports2,"__esModule",{value:!0});exports2.or=exports2.and=exports2.not=exports2.CodeGen=exports2.operators=exports2.varKinds=exports2.ValueScopeName=exports2.ValueScope=exports2.Scope=exports2.Name=exports2.regexpCode=exports2.stringify=exports2.getProperty=exports2.nil=exports2.strConcat=exports2.str=exports2._=void 0;var code_1=require_code(),scope_1=require_scope(),code_2=require_code();Object.defineProperty(exports2,"_",{enumerable:!0,get:__name(function(){return code_2._},"get")});Object.defineProperty(exports2,"str",{enumerable:!0,get:__name(function(){return code_2.str},"get")});Object.defineProperty(exports2,"strConcat",{enumerable:!0,get:__name(function(){return code_2.strConcat},"get")});Object.defineProperty(exports2,"nil",{enumerable:!0,get:__name(function(){return code_2.nil},"get")});Object.defineProperty(exports2,"getProperty",{enumerable:!0,get:__name(function(){return code_2.getProperty},"get")});Object.defineProperty(exports2,"stringify",{enumerable:!0,get:__name(function(){return code_2.stringify},"get")});Object.defineProperty(exports2,"regexpCode",{enumerable:!0,get:__name(function(){return code_2.regexpCode},"get")});Object.defineProperty(exports2,"Name",{enumerable:!0,get:__name(function(){return code_2.Name},"get")});var scope_2=require_scope();Object.defineProperty(exports2,"Scope",{enumerable:!0,get:__name(function(){return scope_2.Scope},"get")});Object.defineProperty(exports2,"ValueScope",{enumerable:!0,get:__name(function(){return scope_2.ValueScope},"get")});Object.defineProperty(exports2,"ValueScopeName",{enumerable:!0,get:__name(function(){return scope_2.ValueScopeName},"get")});Object.defineProperty(exports2,"varKinds",{enumerable:!0,get:__name(function(){return scope_2.varKinds},"get")});exports2.operators={GT:new code_1._Code(">"),GTE:new code_1._Code(">="),LT:new code_1._Code("<"),LTE:new code_1._Code("<="),EQ:new code_1._Code("==="),NEQ:new code_1._Code("!=="),NOT:new code_1._Code("!"),OR:new code_1._Code("||"),AND:new code_1._Code("&&"),ADD:new code_1._Code("+")};var Node2=class{static{__name(this,"Node")}optimizeNodes(){return this}optimizeNames(_names,_constants){return this}},Def=class extends Node2{static{__name(this,"Def")}constructor(varKind,name,rhs){super(),this.varKind=varKind,this.name=name,this.rhs=rhs}render({es5,_n}){let varKind=es5?scope_1.varKinds.var:this.varKind,rhs=this.rhs===void 0?"":` = ${this.rhs}`;return`${varKind} ${this.name}${rhs};`+_n}optimizeNames(names,constants){if(names[this.name.str])return this.rhs&&(this.rhs=optimizeExpr(this.rhs,names,constants)),this}get names(){return this.rhs instanceof code_1._CodeOrName?this.rhs.names:{}}},Assign=class extends Node2{static{__name(this,"Assign")}constructor(lhs,rhs,sideEffects){super(),this.lhs=lhs,this.rhs=rhs,this.sideEffects=sideEffects}render({_n}){return`${this.lhs} = ${this.rhs};`+_n}optimizeNames(names,constants){if(!(this.lhs instanceof code_1.Name&&!names[this.lhs.str]&&!this.sideEffects))return this.rhs=optimizeExpr(this.rhs,names,constants),this}get names(){let names=this.lhs instanceof code_1.Name?{}:{...this.lhs.names};return addExprNames(names,this.rhs)}},AssignOp=class extends Assign{static{__name(this,"AssignOp")}constructor(lhs,op,rhs,sideEffects){super(lhs,rhs,sideEffects),this.op=op}render({_n}){return`${this.lhs} ${this.op}= ${this.rhs};`+_n}},Label=class extends Node2{static{__name(this,"Label")}constructor(label){super(),this.label=label,this.names={}}render({_n}){return`${this.label}:`+_n}},Break=class extends Node2{static{__name(this,"Break")}constructor(label){super(),this.label=label,this.names={}}render({_n}){return`break${this.label?` ${this.label}`:""};`+_n}},Throw=class extends Node2{static{__name(this,"Throw")}constructor(error){super(),this.error=error}render({_n}){return`throw ${this.error};`+_n}get names(){return this.error.names}},AnyCode=class extends Node2{static{__name(this,"AnyCode")}constructor(code2){super(),this.code=code2}render({_n}){return`${this.code};`+_n}optimizeNodes(){return`${this.code}`?this:void 0}optimizeNames(names,constants){return this.code=optimizeExpr(this.code,names,constants),this}get names(){return this.code instanceof code_1._CodeOrName?this.code.names:{}}},ParentNode=class extends Node2{static{__name(this,"ParentNode")}constructor(nodes=[]){super(),this.nodes=nodes}render(opts){return this.nodes.reduce((code2,n)=>code2+n.render(opts),"")}optimizeNodes(){let{nodes}=this,i=nodes.length;for(;i--;){let n=nodes[i].optimizeNodes();Array.isArray(n)?nodes.splice(i,1,...n):n?nodes[i]=n:nodes.splice(i,1)}return nodes.length>0?this:void 0}optimizeNames(names,constants){let{nodes}=this,i=nodes.length;for(;i--;){let n=nodes[i];n.optimizeNames(names,constants)||(subtractNames(names,n.names),nodes.splice(i,1))}return nodes.length>0?this:void 0}get names(){return this.nodes.reduce((names,n)=>addNames(names,n.names),{})}},BlockNode=class extends ParentNode{static{__name(this,"BlockNode")}render(opts){return"{"+opts._n+super.render(opts)+"}"+opts._n}},Root2=class extends ParentNode{static{__name(this,"Root")}},Else=class extends BlockNode{static{__name(this,"Else")}};Else.kind="else";var If=class _If extends BlockNode{static{__name(this,"If")}constructor(condition,nodes){super(nodes),this.condition=condition}render(opts){let code2=`if(${this.condition})`+super.render(opts);return this.else&&(code2+="else "+this.else.render(opts)),code2}optimizeNodes(){super.optimizeNodes();let cond=this.condition;if(cond===!0)return this.nodes;let e=this.else;if(e){let ns=e.optimizeNodes();e=this.else=Array.isArray(ns)?new Else(ns):ns}if(e)return cond===!1?e instanceof _If?e:e.nodes:this.nodes.length?this:new _If(not2(cond),e instanceof _If?[e]:e.nodes);if(!(cond===!1||!this.nodes.length))return this}optimizeNames(names,constants){var _a4;if(this.else=(_a4=this.else)===null||_a4===void 0?void 0:_a4.optimizeNames(names,constants),!!(super.optimizeNames(names,constants)||this.else))return this.condition=optimizeExpr(this.condition,names,constants),this}get names(){let names=super.names;return addExprNames(names,this.condition),this.else&&addNames(names,this.else.names),names}};If.kind="if";var For=class extends BlockNode{static{__name(this,"For")}};For.kind="for";var ForLoop=class extends For{static{__name(this,"ForLoop")}constructor(iteration){super(),this.iteration=iteration}render(opts){return`for(${this.iteration})`+super.render(opts)}optimizeNames(names,constants){if(super.optimizeNames(names,constants))return this.iteration=optimizeExpr(this.iteration,names,constants),this}get names(){return addNames(super.names,this.iteration.names)}},ForRange=class extends For{static{__name(this,"ForRange")}constructor(varKind,name,from,to){super(),this.varKind=varKind,this.name=name,this.from=from,this.to=to}render(opts){let varKind=opts.es5?scope_1.varKinds.var:this.varKind,{name,from,to}=this;return`for(${varKind} ${name}=${from}; ${name}<${to}; ${name}++)`+super.render(opts)}get names(){let names=addExprNames(super.names,this.from);return addExprNames(names,this.to)}},ForIter=class extends For{static{__name(this,"ForIter")}constructor(loop,varKind,name,iterable){super(),this.loop=loop,this.varKind=varKind,this.name=name,this.iterable=iterable}render(opts){return`for(${this.varKind} ${this.name} ${this.loop} ${this.iterable})`+super.render(opts)}optimizeNames(names,constants){if(super.optimizeNames(names,constants))return this.iterable=optimizeExpr(this.iterable,names,constants),this}get names(){return addNames(super.names,this.iterable.names)}},Func=class extends BlockNode{static{__name(this,"Func")}constructor(name,args,async){super(),this.name=name,this.args=args,this.async=async}render(opts){return`${this.async?"async ":""}function ${this.name}(${this.args})`+super.render(opts)}};Func.kind="func";var Return=class extends ParentNode{static{__name(this,"Return")}render(opts){return"return "+super.render(opts)}};Return.kind="return";var Try=class extends BlockNode{static{__name(this,"Try")}render(opts){let code2="try"+super.render(opts);return this.catch&&(code2+=this.catch.render(opts)),this.finally&&(code2+=this.finally.render(opts)),code2}optimizeNodes(){var _a4,_b;return super.optimizeNodes(),(_a4=this.catch)===null||_a4===void 0||_a4.optimizeNodes(),(_b=this.finally)===null||_b===void 0||_b.optimizeNodes(),this}optimizeNames(names,constants){var _a4,_b;return super.optimizeNames(names,constants),(_a4=this.catch)===null||_a4===void 0||_a4.optimizeNames(names,constants),(_b=this.finally)===null||_b===void 0||_b.optimizeNames(names,constants),this}get names(){let names=super.names;return this.catch&&addNames(names,this.catch.names),this.finally&&addNames(names,this.finally.names),names}},Catch=class extends BlockNode{static{__name(this,"Catch")}constructor(error){super(),this.error=error}render(opts){return`catch(${this.error})`+super.render(opts)}};Catch.kind="catch";var Finally=class extends BlockNode{static{__name(this,"Finally")}render(opts){return"finally"+super.render(opts)}};Finally.kind="finally";var CodeGen=class{static{__name(this,"CodeGen")}constructor(extScope,opts={}){this._values={},this._blockStarts=[],this._constants={},this.opts={...opts,_n:opts.lines?`
|
|
672
672
|
`:""},this._extScope=extScope,this._scope=new scope_1.Scope({parent:extScope}),this._nodes=[new Root2]}toString(){return this._root.render(this.opts)}name(prefix){return this._scope.name(prefix)}scopeName(prefix){return this._extScope.name(prefix)}scopeValue(prefixOrName,value){let name=this._extScope.value(prefixOrName,value);return(this._values[name.prefix]||(this._values[name.prefix]=new Set)).add(name),name}getScopeValue(prefix,keyOrRef){return this._extScope.getValue(prefix,keyOrRef)}scopeRefs(scopeName){return this._extScope.scopeRefs(scopeName,this._values)}scopeCode(){return this._extScope.scopeCode(this._values)}_def(varKind,nameOrPrefix,rhs,constant){let name=this._scope.toName(nameOrPrefix);return rhs!==void 0&&constant&&(this._constants[name.str]=rhs),this._leafNode(new Def(varKind,name,rhs)),name}const(nameOrPrefix,rhs,_constant){return this._def(scope_1.varKinds.const,nameOrPrefix,rhs,_constant)}let(nameOrPrefix,rhs,_constant){return this._def(scope_1.varKinds.let,nameOrPrefix,rhs,_constant)}var(nameOrPrefix,rhs,_constant){return this._def(scope_1.varKinds.var,nameOrPrefix,rhs,_constant)}assign(lhs,rhs,sideEffects){return this._leafNode(new Assign(lhs,rhs,sideEffects))}add(lhs,rhs){return this._leafNode(new AssignOp(lhs,exports2.operators.ADD,rhs))}code(c2){return typeof c2=="function"?c2():c2!==code_1.nil&&this._leafNode(new AnyCode(c2)),this}object(...keyValues){let code2=["{"];for(let[key,value]of keyValues)code2.length>1&&code2.push(","),code2.push(key),(key!==value||this.opts.es5)&&(code2.push(":"),(0,code_1.addCodeArg)(code2,value));return code2.push("}"),new code_1._Code(code2)}if(condition,thenBody,elseBody){if(this._blockNode(new If(condition)),thenBody&&elseBody)this.code(thenBody).else().code(elseBody).endIf();else if(thenBody)this.code(thenBody).endIf();else if(elseBody)throw new Error('CodeGen: "else" body without "then" body');return this}elseIf(condition){return this._elseNode(new If(condition))}else(){return this._elseNode(new Else)}endIf(){return this._endBlockNode(If,Else)}_for(node,forBody){return this._blockNode(node),forBody&&this.code(forBody).endFor(),this}for(iteration,forBody){return this._for(new ForLoop(iteration),forBody)}forRange(nameOrPrefix,from,to,forBody,varKind=this.opts.es5?scope_1.varKinds.var:scope_1.varKinds.let){let name=this._scope.toName(nameOrPrefix);return this._for(new ForRange(varKind,name,from,to),()=>forBody(name))}forOf(nameOrPrefix,iterable,forBody,varKind=scope_1.varKinds.const){let name=this._scope.toName(nameOrPrefix);if(this.opts.es5){let arr=iterable instanceof code_1.Name?iterable:this.var("_arr",iterable);return this.forRange("_i",0,(0,code_1._)`${arr}.length`,i=>{this.var(name,(0,code_1._)`${arr}[${i}]`),forBody(name)})}return this._for(new ForIter("of",varKind,name,iterable),()=>forBody(name))}forIn(nameOrPrefix,obj,forBody,varKind=this.opts.es5?scope_1.varKinds.var:scope_1.varKinds.const){if(this.opts.ownProperties)return this.forOf(nameOrPrefix,(0,code_1._)`Object.keys(${obj})`,forBody);let name=this._scope.toName(nameOrPrefix);return this._for(new ForIter("in",varKind,name,obj),()=>forBody(name))}endFor(){return this._endBlockNode(For)}label(label){return this._leafNode(new Label(label))}break(label){return this._leafNode(new Break(label))}return(value){let node=new Return;if(this._blockNode(node),this.code(value),node.nodes.length!==1)throw new Error('CodeGen: "return" should have one node');return this._endBlockNode(Return)}try(tryBody,catchCode,finallyCode){if(!catchCode&&!finallyCode)throw new Error('CodeGen: "try" without "catch" and "finally"');let node=new Try;if(this._blockNode(node),this.code(tryBody),catchCode){let error=this.name("e");this._currNode=node.catch=new Catch(error),catchCode(error)}return finallyCode&&(this._currNode=node.finally=new Finally,this.code(finallyCode)),this._endBlockNode(Catch,Finally)}throw(error){return this._leafNode(new Throw(error))}block(body,nodeCount){return this._blockStarts.push(this._nodes.length),body&&this.code(body).endBlock(nodeCount),this}endBlock(nodeCount){let len=this._blockStarts.pop();if(len===void 0)throw new Error("CodeGen: not in self-balancing block");let toClose=this._nodes.length-len;if(toClose<0||nodeCount!==void 0&&toClose!==nodeCount)throw new Error(`CodeGen: wrong number of nodes: ${toClose} vs ${nodeCount} expected`);return this._nodes.length=len,this}func(name,args=code_1.nil,async,funcBody){return this._blockNode(new Func(name,args,async)),funcBody&&this.code(funcBody).endFunc(),this}endFunc(){return this._endBlockNode(Func)}optimize(n=1){for(;n-- >0;)this._root.optimizeNodes(),this._root.optimizeNames(this._root.names,this._constants)}_leafNode(node){return this._currNode.nodes.push(node),this}_blockNode(node){this._currNode.nodes.push(node),this._nodes.push(node)}_endBlockNode(N1,N2){let n=this._currNode;if(n instanceof N1||N2&&n instanceof N2)return this._nodes.pop(),this;throw new Error(`CodeGen: not in block "${N2?`${N1.kind}/${N2.kind}`:N1.kind}"`)}_elseNode(node){let n=this._currNode;if(!(n instanceof If))throw new Error('CodeGen: "else" without "if"');return this._currNode=n.else=node,this}get _root(){return this._nodes[0]}get _currNode(){let ns=this._nodes;return ns[ns.length-1]}set _currNode(node){let ns=this._nodes;ns[ns.length-1]=node}};exports2.CodeGen=CodeGen;function addNames(names,from){for(let n in from)names[n]=(names[n]||0)+(from[n]||0);return names}__name(addNames,"addNames");function addExprNames(names,from){return from instanceof code_1._CodeOrName?addNames(names,from.names):names}__name(addExprNames,"addExprNames");function optimizeExpr(expr,names,constants){if(expr instanceof code_1.Name)return replaceName(expr);if(!canOptimize(expr))return expr;return new code_1._Code(expr._items.reduce((items,c2)=>(c2 instanceof code_1.Name&&(c2=replaceName(c2)),c2 instanceof code_1._Code?items.push(...c2._items):items.push(c2),items),[]));function replaceName(n){let c2=constants[n.str];return c2===void 0||names[n.str]!==1?n:(delete names[n.str],c2)}function canOptimize(e){return e instanceof code_1._Code&&e._items.some(c2=>c2 instanceof code_1.Name&&names[c2.str]===1&&constants[c2.str]!==void 0)}}__name(optimizeExpr,"optimizeExpr");function subtractNames(names,from){for(let n in from)names[n]=(names[n]||0)-(from[n]||0)}__name(subtractNames,"subtractNames");function not2(x){return typeof x=="boolean"||typeof x=="number"||x===null?!x:(0,code_1._)`!${par(x)}`}__name(not2,"not");exports2.not=not2;var andCode=mappend(exports2.operators.AND);function and(...args){return args.reduce(andCode)}__name(and,"and");exports2.and=and;var orCode=mappend(exports2.operators.OR);function or(...args){return args.reduce(orCode)}__name(or,"or");exports2.or=or;function mappend(op){return(x,y2)=>x===code_1.nil?y2:y2===code_1.nil?x:(0,code_1._)`${par(x)} ${op} ${par(y2)}`}__name(mappend,"mappend");function par(x){return x instanceof code_1.Name?x:(0,code_1._)`(${x})`}__name(par,"par")}});var require_util=__commonJS({"../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/util.js"(exports2){"use strict";Object.defineProperty(exports2,"__esModule",{value:!0});exports2.checkStrictMode=exports2.getErrorPath=exports2.Type=exports2.useFunc=exports2.setEvaluated=exports2.evaluatedPropsToName=exports2.mergeEvaluated=exports2.eachItem=exports2.unescapeJsonPointer=exports2.escapeJsonPointer=exports2.escapeFragment=exports2.unescapeFragment=exports2.schemaRefOrVal=exports2.schemaHasRulesButRef=exports2.schemaHasRules=exports2.checkUnknownRules=exports2.alwaysValidSchema=exports2.toHash=void 0;var codegen_1=require_codegen(),code_1=require_code();function toHash(arr){let hash={};for(let item of arr)hash[item]=!0;return hash}__name(toHash,"toHash");exports2.toHash=toHash;function alwaysValidSchema(it2,schema){return typeof schema=="boolean"?schema:Object.keys(schema).length===0?!0:(checkUnknownRules(it2,schema),!schemaHasRules(schema,it2.self.RULES.all))}__name(alwaysValidSchema,"alwaysValidSchema");exports2.alwaysValidSchema=alwaysValidSchema;function checkUnknownRules(it2,schema=it2.schema){let{opts,self}=it2;if(!opts.strictSchema||typeof schema=="boolean")return;let rules2=self.RULES.keywords;for(let key in schema)rules2[key]||checkStrictMode(it2,`unknown keyword: "${key}"`)}__name(checkUnknownRules,"checkUnknownRules");exports2.checkUnknownRules=checkUnknownRules;function schemaHasRules(schema,rules2){if(typeof schema=="boolean")return!schema;for(let key in schema)if(rules2[key])return!0;return!1}__name(schemaHasRules,"schemaHasRules");exports2.schemaHasRules=schemaHasRules;function schemaHasRulesButRef(schema,RULES){if(typeof schema=="boolean")return!schema;for(let key in schema)if(key!=="$ref"&&RULES.all[key])return!0;return!1}__name(schemaHasRulesButRef,"schemaHasRulesButRef");exports2.schemaHasRulesButRef=schemaHasRulesButRef;function schemaRefOrVal({topSchemaRef,schemaPath},schema,keyword,$data){if(!$data){if(typeof schema=="number"||typeof schema=="boolean")return schema;if(typeof schema=="string")return(0,codegen_1._)`${schema}`}return(0,codegen_1._)`${topSchemaRef}${schemaPath}${(0,codegen_1.getProperty)(keyword)}`}__name(schemaRefOrVal,"schemaRefOrVal");exports2.schemaRefOrVal=schemaRefOrVal;function unescapeFragment(str){return unescapeJsonPointer(decodeURIComponent(str))}__name(unescapeFragment,"unescapeFragment");exports2.unescapeFragment=unescapeFragment;function escapeFragment(str){return encodeURIComponent(escapeJsonPointer(str))}__name(escapeFragment,"escapeFragment");exports2.escapeFragment=escapeFragment;function escapeJsonPointer(str){return typeof str=="number"?`${str}`:str.replace(/~/g,"~0").replace(/\//g,"~1")}__name(escapeJsonPointer,"escapeJsonPointer");exports2.escapeJsonPointer=escapeJsonPointer;function unescapeJsonPointer(str){return str.replace(/~1/g,"/").replace(/~0/g,"~")}__name(unescapeJsonPointer,"unescapeJsonPointer");exports2.unescapeJsonPointer=unescapeJsonPointer;function eachItem(xs,f){if(Array.isArray(xs))for(let x of xs)f(x);else f(xs)}__name(eachItem,"eachItem");exports2.eachItem=eachItem;function makeMergeEvaluated({mergeNames,mergeToName,mergeValues,resultToName}){return(gen,from,to,toName)=>{let res=to===void 0?from:to instanceof codegen_1.Name?(from instanceof codegen_1.Name?mergeNames(gen,from,to):mergeToName(gen,from,to),to):from instanceof codegen_1.Name?(mergeToName(gen,to,from),from):mergeValues(from,to);return toName===codegen_1.Name&&!(res instanceof codegen_1.Name)?resultToName(gen,res):res}}__name(makeMergeEvaluated,"makeMergeEvaluated");exports2.mergeEvaluated={props:makeMergeEvaluated({mergeNames:__name((gen,from,to)=>gen.if((0,codegen_1._)`${to} !== true && ${from} !== undefined`,()=>{gen.if((0,codegen_1._)`${from} === true`,()=>gen.assign(to,!0),()=>gen.assign(to,(0,codegen_1._)`${to} || {}`).code((0,codegen_1._)`Object.assign(${to}, ${from})`))}),"mergeNames"),mergeToName:__name((gen,from,to)=>gen.if((0,codegen_1._)`${to} !== true`,()=>{from===!0?gen.assign(to,!0):(gen.assign(to,(0,codegen_1._)`${to} || {}`),setEvaluated(gen,to,from))}),"mergeToName"),mergeValues:__name((from,to)=>from===!0?!0:{...from,...to},"mergeValues"),resultToName:evaluatedPropsToName}),items:makeMergeEvaluated({mergeNames:__name((gen,from,to)=>gen.if((0,codegen_1._)`${to} !== true && ${from} !== undefined`,()=>gen.assign(to,(0,codegen_1._)`${from} === true ? true : ${to} > ${from} ? ${to} : ${from}`)),"mergeNames"),mergeToName:__name((gen,from,to)=>gen.if((0,codegen_1._)`${to} !== true`,()=>gen.assign(to,from===!0?!0:(0,codegen_1._)`${to} > ${from} ? ${to} : ${from}`)),"mergeToName"),mergeValues:__name((from,to)=>from===!0?!0:Math.max(from,to),"mergeValues"),resultToName:__name((gen,items)=>gen.var("items",items),"resultToName")})};function evaluatedPropsToName(gen,ps){if(ps===!0)return gen.var("props",!0);let props=gen.var("props",(0,codegen_1._)`{}`);return ps!==void 0&&setEvaluated(gen,props,ps),props}__name(evaluatedPropsToName,"evaluatedPropsToName");exports2.evaluatedPropsToName=evaluatedPropsToName;function setEvaluated(gen,props,ps){Object.keys(ps).forEach(p2=>gen.assign((0,codegen_1._)`${props}${(0,codegen_1.getProperty)(p2)}`,!0))}__name(setEvaluated,"setEvaluated");exports2.setEvaluated=setEvaluated;var snippets={};function useFunc(gen,f){return gen.scopeValue("func",{ref:f,code:snippets[f.code]||(snippets[f.code]=new code_1._Code(f.code))})}__name(useFunc,"useFunc");exports2.useFunc=useFunc;var Type;(function(Type2){Type2[Type2.Num=0]="Num",Type2[Type2.Str=1]="Str"})(Type||(exports2.Type=Type={}));function getErrorPath(dataProp,dataPropType,jsPropertySyntax){if(dataProp instanceof codegen_1.Name){let isNumber3=dataPropType===Type.Num;return jsPropertySyntax?isNumber3?(0,codegen_1._)`"[" + ${dataProp} + "]"`:(0,codegen_1._)`"['" + ${dataProp} + "']"`:isNumber3?(0,codegen_1._)`"/" + ${dataProp}`:(0,codegen_1._)`"/" + ${dataProp}.replace(/~/g, "~0").replace(/\\//g, "~1")`}return jsPropertySyntax?(0,codegen_1.getProperty)(dataProp).toString():"/"+escapeJsonPointer(dataProp)}__name(getErrorPath,"getErrorPath");exports2.getErrorPath=getErrorPath;function checkStrictMode(it2,msg,mode2=it2.opts.strictSchema){if(mode2){if(msg=`strict mode: ${msg}`,mode2===!0)throw new Error(msg);it2.self.logger.warn(msg)}}__name(checkStrictMode,"checkStrictMode");exports2.checkStrictMode=checkStrictMode}});var require_names=__commonJS({"../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/names.js"(exports2){"use strict";Object.defineProperty(exports2,"__esModule",{value:!0});var codegen_1=require_codegen(),names={data:new codegen_1.Name("data"),valCxt:new codegen_1.Name("valCxt"),instancePath:new codegen_1.Name("instancePath"),parentData:new codegen_1.Name("parentData"),parentDataProperty:new codegen_1.Name("parentDataProperty"),rootData:new codegen_1.Name("rootData"),dynamicAnchors:new codegen_1.Name("dynamicAnchors"),vErrors:new codegen_1.Name("vErrors"),errors:new codegen_1.Name("errors"),this:new codegen_1.Name("this"),self:new codegen_1.Name("self"),scope:new codegen_1.Name("scope"),json:new codegen_1.Name("json"),jsonPos:new codegen_1.Name("jsonPos"),jsonLen:new codegen_1.Name("jsonLen"),jsonPart:new codegen_1.Name("jsonPart")};exports2.default=names}});var require_errors3=__commonJS({"../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/errors.js"(exports2){"use strict";Object.defineProperty(exports2,"__esModule",{value:!0});exports2.extendErrors=exports2.resetErrorsCount=exports2.reportExtraError=exports2.reportError=exports2.keyword$DataError=exports2.keywordError=void 0;var codegen_1=require_codegen(),util_1=require_util(),names_1=require_names();exports2.keywordError={message:__name(({keyword})=>(0,codegen_1.str)`must pass "${keyword}" keyword validation`,"message")};exports2.keyword$DataError={message:__name(({keyword,schemaType})=>schemaType?(0,codegen_1.str)`"${keyword}" keyword must be ${schemaType} ($data)`:(0,codegen_1.str)`"${keyword}" keyword is invalid ($data)`,"message")};function reportError(cxt,error=exports2.keywordError,errorPaths,overrideAllErrors){let{it:it2}=cxt,{gen,compositeRule,allErrors:allErrors2}=it2,errObj=errorObjectCode(cxt,error,errorPaths);overrideAllErrors??(compositeRule||allErrors2)?addError(gen,errObj):returnErrors(it2,(0,codegen_1._)`[${errObj}]`)}__name(reportError,"reportError");exports2.reportError=reportError;function reportExtraError(cxt,error=exports2.keywordError,errorPaths){let{it:it2}=cxt,{gen,compositeRule,allErrors:allErrors2}=it2,errObj=errorObjectCode(cxt,error,errorPaths);addError(gen,errObj),compositeRule||allErrors2||returnErrors(it2,names_1.default.vErrors)}__name(reportExtraError,"reportExtraError");exports2.reportExtraError=reportExtraError;function resetErrorsCount(gen,errsCount){gen.assign(names_1.default.errors,errsCount),gen.if((0,codegen_1._)`${names_1.default.vErrors} !== null`,()=>gen.if(errsCount,()=>gen.assign((0,codegen_1._)`${names_1.default.vErrors}.length`,errsCount),()=>gen.assign(names_1.default.vErrors,null)))}__name(resetErrorsCount,"resetErrorsCount");exports2.resetErrorsCount=resetErrorsCount;function extendErrors({gen,keyword,schemaValue,data:data2,errsCount,it:it2}){if(errsCount===void 0)throw new Error("ajv implementation error");let err=gen.name("err");gen.forRange("i",errsCount,names_1.default.errors,i=>{gen.const(err,(0,codegen_1._)`${names_1.default.vErrors}[${i}]`),gen.if((0,codegen_1._)`${err}.instancePath === undefined`,()=>gen.assign((0,codegen_1._)`${err}.instancePath`,(0,codegen_1.strConcat)(names_1.default.instancePath,it2.errorPath))),gen.assign((0,codegen_1._)`${err}.schemaPath`,(0,codegen_1.str)`${it2.errSchemaPath}/${keyword}`),it2.opts.verbose&&(gen.assign((0,codegen_1._)`${err}.schema`,schemaValue),gen.assign((0,codegen_1._)`${err}.data`,data2))})}__name(extendErrors,"extendErrors");exports2.extendErrors=extendErrors;function addError(gen,errObj){let err=gen.const("err",errObj);gen.if((0,codegen_1._)`${names_1.default.vErrors} === null`,()=>gen.assign(names_1.default.vErrors,(0,codegen_1._)`[${err}]`),(0,codegen_1._)`${names_1.default.vErrors}.push(${err})`),gen.code((0,codegen_1._)`${names_1.default.errors}++`)}__name(addError,"addError");function returnErrors(it2,errs){let{gen,validateName,schemaEnv}=it2;schemaEnv.$async?gen.throw((0,codegen_1._)`new ${it2.ValidationError}(${errs})`):(gen.assign((0,codegen_1._)`${validateName}.errors`,errs),gen.return(!1))}__name(returnErrors,"returnErrors");var E3={keyword:new codegen_1.Name("keyword"),schemaPath:new codegen_1.Name("schemaPath"),params:new codegen_1.Name("params"),propertyName:new codegen_1.Name("propertyName"),message:new codegen_1.Name("message"),schema:new codegen_1.Name("schema"),parentSchema:new codegen_1.Name("parentSchema")};function errorObjectCode(cxt,error,errorPaths){let{createErrors}=cxt.it;return createErrors===!1?(0,codegen_1._)`{}`:errorObject(cxt,error,errorPaths)}__name(errorObjectCode,"errorObjectCode");function errorObject(cxt,error,errorPaths={}){let{gen,it:it2}=cxt,keyValues=[errorInstancePath(it2,errorPaths),errorSchemaPath(cxt,errorPaths)];return extraErrorProps(cxt,error,keyValues),gen.object(...keyValues)}__name(errorObject,"errorObject");function errorInstancePath({errorPath},{instancePath}){let instPath=instancePath?(0,codegen_1.str)`${errorPath}${(0,util_1.getErrorPath)(instancePath,util_1.Type.Str)}`:errorPath;return[names_1.default.instancePath,(0,codegen_1.strConcat)(names_1.default.instancePath,instPath)]}__name(errorInstancePath,"errorInstancePath");function errorSchemaPath({keyword,it:{errSchemaPath}},{schemaPath,parentSchema}){let schPath=parentSchema?errSchemaPath:(0,codegen_1.str)`${errSchemaPath}/${keyword}`;return schemaPath&&(schPath=(0,codegen_1.str)`${schPath}${(0,util_1.getErrorPath)(schemaPath,util_1.Type.Str)}`),[E3.schemaPath,schPath]}__name(errorSchemaPath,"errorSchemaPath");function extraErrorProps(cxt,{params,message},keyValues){let{keyword,data:data2,schemaValue,it:it2}=cxt,{opts,propertyName,topSchemaRef,schemaPath}=it2;keyValues.push([E3.keyword,keyword],[E3.params,typeof params=="function"?params(cxt):params||(0,codegen_1._)`{}`]),opts.messages&&keyValues.push([E3.message,typeof message=="function"?message(cxt):message]),opts.verbose&&keyValues.push([E3.schema,schemaValue],[E3.parentSchema,(0,codegen_1._)`${topSchemaRef}${schemaPath}`],[names_1.default.data,data2]),propertyName&&keyValues.push([E3.propertyName,propertyName])}__name(extraErrorProps,"extraErrorProps")}});var require_boolSchema=__commonJS({"../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/boolSchema.js"(exports2){"use strict";Object.defineProperty(exports2,"__esModule",{value:!0});exports2.boolOrEmptySchema=exports2.topBoolOrEmptySchema=void 0;var errors_1=require_errors3(),codegen_1=require_codegen(),names_1=require_names(),boolError={message:"boolean schema is false"};function topBoolOrEmptySchema(it2){let{gen,schema,validateName}=it2;schema===!1?falseSchemaError(it2,!1):typeof schema=="object"&&schema.$async===!0?gen.return(names_1.default.data):(gen.assign((0,codegen_1._)`${validateName}.errors`,null),gen.return(!0))}__name(topBoolOrEmptySchema,"topBoolOrEmptySchema");exports2.topBoolOrEmptySchema=topBoolOrEmptySchema;function boolOrEmptySchema(it2,valid){let{gen,schema}=it2;schema===!1?(gen.var(valid,!1),falseSchemaError(it2)):gen.var(valid,!0)}__name(boolOrEmptySchema,"boolOrEmptySchema");exports2.boolOrEmptySchema=boolOrEmptySchema;function falseSchemaError(it2,overrideAllErrors){let{gen,data:data2}=it2,cxt={gen,keyword:"false schema",data:data2,schema:!1,schemaCode:!1,schemaValue:!1,params:{},it:it2};(0,errors_1.reportError)(cxt,boolError,void 0,overrideAllErrors)}__name(falseSchemaError,"falseSchemaError")}});var require_rules=__commonJS({"../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/rules.js"(exports2){"use strict";Object.defineProperty(exports2,"__esModule",{value:!0});exports2.getRules=exports2.isJSONType=void 0;var _jsonTypes=["string","number","integer","boolean","null","object","array"],jsonTypes=new Set(_jsonTypes);function isJSONType(x){return typeof x=="string"&&jsonTypes.has(x)}__name(isJSONType,"isJSONType");exports2.isJSONType=isJSONType;function getRules(){let groups={number:{type:"number",rules:[]},string:{type:"string",rules:[]},array:{type:"array",rules:[]},object:{type:"object",rules:[]}};return{types:{...groups,integer:!0,boolean:!0,null:!0},rules:[{rules:[]},groups.number,groups.string,groups.array,groups.object],post:{rules:[]},all:{},keywords:{}}}__name(getRules,"getRules");exports2.getRules=getRules}});var require_applicability=__commonJS({"../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/applicability.js"(exports2){"use strict";Object.defineProperty(exports2,"__esModule",{value:!0});exports2.shouldUseRule=exports2.shouldUseGroup=exports2.schemaHasRulesForType=void 0;function schemaHasRulesForType({schema,self},type){let group=self.RULES.types[type];return group&&group!==!0&&shouldUseGroup(schema,group)}__name(schemaHasRulesForType,"schemaHasRulesForType");exports2.schemaHasRulesForType=schemaHasRulesForType;function shouldUseGroup(schema,group){return group.rules.some(rule=>shouldUseRule(schema,rule))}__name(shouldUseGroup,"shouldUseGroup");exports2.shouldUseGroup=shouldUseGroup;function shouldUseRule(schema,rule){var _a4;return schema[rule.keyword]!==void 0||((_a4=rule.definition.implements)===null||_a4===void 0?void 0:_a4.some(kwd=>schema[kwd]!==void 0))}__name(shouldUseRule,"shouldUseRule");exports2.shouldUseRule=shouldUseRule}});var require_dataType=__commonJS({"../../node_modules/.pnpm/ajv@8.20.0/node_modules/ajv/dist/compile/validate/dataType.js"(exports2){"use strict";Object.defineProperty(exports2,"__esModule",{value:!0});exports2.reportTypeError=exports2.checkDataTypes=exports2.checkDataType=exports2.coerceAndCheckDataType=exports2.getJSONTypes=exports2.getSchemaTypes=exports2.DataType=void 0;var rules_1=require_rules(),applicability_1=require_applicability(),errors_1=require_errors3(),codegen_1=require_codegen(),util_1=require_util(),DataType;(function(DataType2){DataType2[DataType2.Correct=0]="Correct",DataType2[DataType2.Wrong=1]="Wrong"})(DataType||(exports2.DataType=DataType={}));function getSchemaTypes(schema){let types=getJSONTypes(schema.type);if(types.includes("null")){if(schema.nullable===!1)throw new Error("type: null contradicts nullable: false")}else{if(!types.length&&schema.nullable!==void 0)throw new Error('"nullable" cannot be used without "type"');schema.nullable===!0&&types.push("null")}return types}__name(getSchemaTypes,"getSchemaTypes");exports2.getSchemaTypes=getSchemaTypes;function getJSONTypes(ts){let types=Array.isArray(ts)?ts:ts?[ts]:[];if(types.every(rules_1.isJSONType))return types;throw new Error("type must be JSONType or JSONType[]: "+types.join(","))}__name(getJSONTypes,"getJSONTypes");exports2.getJSONTypes=getJSONTypes;function coerceAndCheckDataType(it2,types){let{gen,data:data2,opts}=it2,coerceTo=coerceToTypes(types,opts.coerceTypes),checkTypes=types.length>0&&!(coerceTo.length===0&&types.length===1&&(0,applicability_1.schemaHasRulesForType)(it2,types[0]));if(checkTypes){let wrongType=checkDataTypes(types,data2,opts.strictNumbers,DataType.Wrong);gen.if(wrongType,()=>{coerceTo.length?coerceData(it2,types,coerceTo):reportTypeError(it2)})}return checkTypes}__name(coerceAndCheckDataType,"coerceAndCheckDataType");exports2.coerceAndCheckDataType=coerceAndCheckDataType;var COERCIBLE=new Set(["string","number","integer","boolean","null"]);function coerceToTypes(types,coerceTypes){return coerceTypes?types.filter(t2=>COERCIBLE.has(t2)||coerceTypes==="array"&&t2==="array"):[]}__name(coerceToTypes,"coerceToTypes");function coerceData(it2,types,coerceTo){let{gen,data:data2,opts}=it2,dataType=gen.let("dataType",(0,codegen_1._)`typeof ${data2}`),coerced=gen.let("coerced",(0,codegen_1._)`undefined`);opts.coerceTypes==="array"&&gen.if((0,codegen_1._)`${dataType} == 'object' && Array.isArray(${data2}) && ${data2}.length == 1`,()=>gen.assign(data2,(0,codegen_1._)`${data2}[0]`).assign(dataType,(0,codegen_1._)`typeof ${data2}`).if(checkDataTypes(types,data2,opts.strictNumbers),()=>gen.assign(coerced,data2))),gen.if((0,codegen_1._)`${coerced} !== undefined`);for(let t2 of coerceTo)(COERCIBLE.has(t2)||t2==="array"&&opts.coerceTypes==="array")&&coerceSpecificType(t2);gen.else(),reportTypeError(it2),gen.endIf(),gen.if((0,codegen_1._)`${coerced} !== undefined`,()=>{gen.assign(data2,coerced),assignParentData(it2,coerced)});function coerceSpecificType(t2){switch(t2){case"string":gen.elseIf((0,codegen_1._)`${dataType} == "number" || ${dataType} == "boolean"`).assign(coerced,(0,codegen_1._)`"" + ${data2}`).elseIf((0,codegen_1._)`${data2} === null`).assign(coerced,(0,codegen_1._)`""`);return;case"number":gen.elseIf((0,codegen_1._)`${dataType} == "boolean" || ${data2} === null
|
|
673
673
|
|| (${dataType} == "string" && ${data2} && ${data2} == +${data2})`).assign(coerced,(0,codegen_1._)`+${data2}`);return;case"integer":gen.elseIf((0,codegen_1._)`${dataType} === "boolean" || ${data2} === null
|
|
674
674
|
|| (${dataType} === "string" && ${data2} && ${data2} == +${data2} && !(${data2} % 1))`).assign(coerced,(0,codegen_1._)`+${data2}`);return;case"boolean":gen.elseIf((0,codegen_1._)`${data2} === "false" || ${data2} === 0 || ${data2} === null`).assign(coerced,!1).elseIf((0,codegen_1._)`${data2} === "true" || ${data2} === 1`).assign(coerced,!0);return;case"null":gen.elseIf((0,codegen_1._)`${data2} === "" || ${data2} === 0 || ${data2} === false`),gen.assign(coerced,null);return;case"array":gen.elseIf((0,codegen_1._)`${dataType} === "string" || ${dataType} === "number"
|
|
@@ -1405,7 +1405,7 @@ Header values use Name=secret:KEY, Name=bearer:KEY, Name=token:KEY, or Name=lite
|
|
|
1405
1405
|
`);addScopeOptions3(webhooks.command("events [eventType]").description("List events or describe one event and its example payload")).action((eventType,opts,command)=>eventsCommand(eventType,opts,command)),addScopeOptions3(webhooks.command("list").description("List project webhooks")).action((opts,command)=>listCommand4(opts,command)),addScopeOptions3(webhooks.command("get <webhookId>").description("Show a webhook configuration")).action((webhookId,opts,command)=>getCommand(webhookId,opts,command)),addScopeOptions3(webhooks.command("create <name>").description("Create an outbound webhook").requiredOption("--event <event>","Event type, for example form.submitted").requiredOption("--url <url>","HTTPS destination URL").option("--header <name=source:value>","Add a literal or secret-backed header; repeat for multiple headers",collect2).option("--body <json|@file|->","Custom JSON payload inline, from @file, or stdin with -").option("--form <id>","Only form.submitted events for this form id").option("--agent <name>","Only agent events for this agent name").option("--media-type <type>","Only media events for image, video, audio, document, or other").option("--action <action>","Only entry.changed events with created, updated, or deleted entries").option("--content-type <name>","Only entry.changed events for this content type").option("--locale <locale>","Only entry.changed events for this locale").option("--environments <main|all>","Deliver events from main or all environments","main").option("--debounce-changes <immediate|5s|30s|1m>","Combine rapid entry.changed events into one delivery").option("--disabled","Create the webhook disabled").option("--no-signing","Do not add X-Fimo-Signature headers")).action((name,opts,command)=>createCommand3(name,opts,command)),addScopeOptions3(webhooks.command("update <webhookId>").description("Update an outbound webhook").option("--name <name>","Change the webhook name").option("--event <event>","Change the event type").option("--url <url>","Change the HTTPS destination URL").option("--header <name=source:value>","Replace headers; repeat for multiple headers",collect2).option("--clear-headers","Remove all configured destination headers").option("--body <json|@file|->","Replace the custom payload inline, from @file, or stdin with -").option("--default-body","Send the full event envelope instead of a custom template").option("--form <id>","Filter form.submitted by form id").option("--agent <name>","Filter agent events by agent name").option("--media-type <type>","Filter media events by media type").option("--action <action>","Filter entry.changed by created, updated, or deleted").option("--content-type <name>","Filter entry.changed by content type").option("--locale <locale>","Filter entry.changed by locale").option("--environments <main|all>","Deliver events from main or all environments").option("--debounce-changes <immediate|5s|30s|1m>","Change the entry.changed debounce window").option("--clear-filter","Remove all event filters").option("--enabled <on|off>","Enable or disable delivery").option("--signing <on|off>","Enable or disable X-Fimo-Signature headers")).action((webhookId,opts,command)=>updateCommand2(webhookId,opts,command)),addScopeOptions3(webhooks.command("delete <webhookId>").description("Delete an outbound webhook")).action((webhookId,opts,command)=>deleteCommand2(webhookId,opts,command)),addScopeOptions3(webhooks.command("test <webhookId>").description("Queue a test delivery using example event data").option("--data <json>","Override the event data with a JSON object").option("--wait","Wait up to 60 seconds for the delivery to succeed or fail")).action((webhookId,opts,command)=>testCommand(webhookId,opts,command)),addScopeOptions3(webhooks.command("deliveries <webhookId>").description("List recent webhook deliveries").option("--limit <count>","Maximum deliveries to return (1-100)")).action((webhookId,opts,command)=>deliveriesCommand(webhookId,opts,command)),addScopeOptions3(webhooks.command("delivery <webhookId> <deliveryId>").description("Show a delivery and all attempts")).action((webhookId,deliveryId,opts,command)=>deliveryCommand(webhookId,deliveryId,opts,command)),addScopeOptions3(webhooks.command("retry <webhookId> <deliveryId>").description("Retry an exhausted failed delivery now")).action((webhookId,deliveryId,opts,command)=>retryCommand2(webhookId,deliveryId,opts,command)),addScopeOptions3(webhooks.command("rotate-secret <webhookId>").description("Rotate and reveal a new signing secret once")).action((webhookId,opts,command)=>rotateSecretCommand(webhookId,opts,command))}__name(registerWebhooksCommands,"registerWebhooksCommands");async function resolveScope4(op,opts,_command){let scope;if(opts.project)scope={projectId:opts.project};else{let ctx=await getProjectContext({cwd:opts.cwd});scope={projectId:ctx.projectId,env:ctx.env}}return await requireOperation(op,scope),{...scope,api:new FimoApiClient(loadConfig())}}__name(resolveScope4,"resolveScope");async function eventsCommand(eventType,opts,command){let{api,projectId}=await resolveScope4("webhooks.events",opts,command),events=await api.listWebhookEvents(projectId);if(eventType){let event=events.find(candidate=>candidate.type===eventType);if(!event)throw new WebhookCommandError("WEBHOOK_EVENT_NOT_FOUND",`Unknown webhook event '${eventType}'.`);renderJson("webhooks events",event);return}ui.table({command:"webhooks events",columns:[{key:"event",label:"EVENT"},{key:"family",label:"FAMILY"},{key:"description",label:"DESCRIPTION"},{key:"variables",label:"VARIABLES"}],rows:events.map(event=>({event:event.type,family:event.family,description:event.description,variables:event.variables.join(", ")}))})}__name(eventsCommand,"eventsCommand");async function listCommand4(opts,command){let{api,projectId}=await resolveScope4("webhooks.list",opts,command),webhooks=await api.listProjectWebhooks(projectId);ui.table({command:"webhooks list",columns:[{key:"id",label:"ID"},{key:"name",label:"NAME"},{key:"event",label:"EVENT"},{key:"destination",label:"DESTINATION"},{key:"enabled",label:"ENABLED"},{key:"last",label:"LAST DELIVERY"}],rows:webhooks.map(webhook=>({id:webhook.id,name:webhook.name,event:webhook.eventType,destination:webhook.destination.maskedUrl,enabled:webhook.enabled?"yes":"no",last:webhook.lastDeliveryStatus??""}))})}__name(listCommand4,"listCommand");async function getCommand(webhookId,opts,command){let{api,projectId}=await resolveScope4("webhooks.get",opts,command);renderJson("webhooks get",await api.getProjectWebhook(projectId,webhookId))}__name(getCommand,"getCommand");async function createCommand3(name,opts,command){let{api,projectId}=await resolveScope4("webhooks.create",opts,command),parsed=CreateProjectWebhookRequestSchema.safeParse({name,eventType:opts.event,url:opts.url,enabled:!opts.disabled,filter:createFilter(opts),headers:parseHeaders(opts.header),bodyTemplate:opts.body===void 0?null:await parseJsonInput(opts.body,"--body",opts.cwd),signingEnabled:opts.signing!==!1,entryBatchWindowSeconds:parseEntryBatchWindow(opts.debounceChanges??(opts.event==="entry.changed"?"5s":"immediate"))});if(!parsed.success)throw new WebhookCommandError("WEBHOOK_VALIDATION_FAILED",parsed.error.issues[0]?.message??"Invalid webhook.");let result=await api.createProjectWebhook(projectId,parsed.data);renderJson("webhooks create",{webhook:result.webhook,signingSecret:result.signingSecret,note:"Save the signing secret now. Fimo will not show this value again."})}__name(createCommand3,"createCommand");async function updateCommand2(webhookId,opts,command){let{api,projectId}=await resolveScope4("webhooks.update",opts,command);if(opts.header&&opts.clearHeaders)throw new WebhookCommandError("WEBHOOK_FLAGS_CONFLICT","Use either --header or --clear-headers, not both.");if(opts.body!==void 0&&opts.defaultBody)throw new WebhookCommandError("WEBHOOK_FLAGS_CONFLICT","Use either --body or --default-body, not both.");let current=await api.getProjectWebhook(projectId,webhookId),filter4=createUpdateFilter(current,opts),request={...opts.name!==void 0?{name:opts.name}:{},...opts.event!==void 0?{eventType:opts.event}:{},...opts.url!==void 0?{url:opts.url}:{},...opts.header!==void 0||opts.clearHeaders?{headers:parseHeaders(opts.header)}:{},...opts.body!==void 0?{bodyTemplate:await parseJsonInput(opts.body,"--body",opts.cwd)}:{},...opts.defaultBody?{bodyTemplate:null}:{},...filter4?{filter:filter4}:{},...opts.enabled!==void 0?{enabled:parseOnOff(opts.enabled,"--enabled")}:{},...opts.signing!==void 0?{signingEnabled:parseOnOff(opts.signing,"--signing")}:{},...opts.debounceChanges!==void 0?{entryBatchWindowSeconds:parseEntryBatchWindow(opts.debounceChanges)}:opts.event==="entry.changed"&¤t.eventType!=="entry.changed"?{entryBatchWindowSeconds:5}:{}},parsed=UpdateProjectWebhookRequestSchema.safeParse(request);if(!parsed.success)throw new WebhookCommandError("WEBHOOK_VALIDATION_FAILED",parsed.error.issues[0]?.message??"Invalid webhook.");if(Object.keys(parsed.data).length===0)throw new WebhookCommandError("WEBHOOK_UPDATE_EMPTY","Pass at least one field to update.");renderJson("webhooks update",await api.updateProjectWebhook(projectId,webhookId,parsed.data))}__name(updateCommand2,"updateCommand");async function deleteCommand2(webhookId,opts,command){let{api,projectId}=await resolveScope4("webhooks.delete",opts,command);await api.deleteProjectWebhook(projectId,webhookId),ui.ok({command:"webhooks delete",headline:`Deleted webhook ${webhookId}`,details:{project_id:projectId,webhook_id:webhookId}})}__name(deleteCommand2,"deleteCommand");async function testCommand(webhookId,opts,command){let{api,projectId}=await resolveScope4("webhooks.test",opts,command),data2=opts.data===void 0?void 0:parseJsonObject3(opts.data,"--data"),delivery=await api.testProjectWebhook(projectId,webhookId,{data:data2});if(opts.wait){let deadline=Date.now()+6e4;for(;!["succeeded","failed"].includes(delivery.status)&&Date.now()<deadline;)await new Promise(resolveWait=>setTimeout(resolveWait,500)),delivery=(await api.getProjectWebhookDelivery(projectId,webhookId,delivery.id)).delivery;if(!["succeeded","failed"].includes(delivery.status))throw new WebhookCommandError("WEBHOOK_DELIVERY_TIMEOUT",`Delivery ${delivery.id} did not finish within 60 seconds.`)}renderJson("webhooks test",delivery)}__name(testCommand,"testCommand");async function deliveriesCommand(webhookId,opts,command){let{api,projectId}=await resolveScope4("webhooks.deliveries.list",opts,command),limit=opts.limit===void 0?void 0:parseLimit2(opts.limit),deliveries=await api.listProjectWebhookDeliveries(projectId,webhookId,limit);ui.table({command:"webhooks deliveries",columns:[{key:"id",label:"DELIVERY"},{key:"event",label:"EVENT"},{key:"status",label:"STATUS"},{key:"attempts",label:"ATTEMPTS"},{key:"response",label:"RESPONSE"},{key:"created",label:"CREATED"}],rows:deliveries.map(delivery=>({id:delivery.id,event:delivery.eventType,status:delivery.status,attempts:delivery.attemptCount,response:delivery.responseStatus??"",created:String(delivery.createdAt)}))})}__name(deliveriesCommand,"deliveriesCommand");async function deliveryCommand(webhookId,deliveryId,opts,command){let{api,projectId}=await resolveScope4("webhooks.deliveries.get",opts,command);renderJson("webhooks delivery",await api.getProjectWebhookDelivery(projectId,webhookId,deliveryId))}__name(deliveryCommand,"deliveryCommand");async function retryCommand2(webhookId,deliveryId,opts,command){let{api,projectId}=await resolveScope4("webhooks.deliveries.retry",opts,command);renderJson("webhooks retry",await api.retryProjectWebhookDelivery(projectId,webhookId,deliveryId))}__name(retryCommand2,"retryCommand");async function rotateSecretCommand(webhookId,opts,command){let{api,projectId}=await resolveScope4("webhooks.rotate_secret",opts,command),signingSecret=await api.rotateProjectWebhookSecret(projectId,webhookId);renderJson("webhooks rotate-secret",{webhookId,signingSecret,note:"Save the signing secret now. Fimo will not show this value again."})}__name(rotateSecretCommand,"rotateSecretCommand");function createFilter(opts){return parseFilter({...opts.environments?{environment:opts.environments}:{},...opts.form?{formId:opts.form}:{},...opts.agent?{agentName:opts.agent}:{},...opts.mediaType?{mediaType:opts.mediaType}:{},...opts.action?{action:opts.action}:{},...opts.contentType?{contentType:opts.contentType}:{},...opts.locale?{locale:opts.locale}:{}})}__name(createFilter,"createFilter");function parseFilter(value){let parsed=WebhookFilterSchema.safeParse(value);if(!parsed.success)throw new WebhookCommandError("WEBHOOK_VALIDATION_FAILED",parsed.error.issues[0]?.message??"Invalid webhook filter.");return parsed.data}__name(parseFilter,"parseFilter");function parseEntryBatchWindow(value){let parsed={immediate:0,"5s":5,"30s":30,"1m":60}[value.toLowerCase()];if(parsed===void 0)throw new WebhookCommandError("WEBHOOK_GROUPING_INVALID",`Invalid grouping window '${value}'. Use immediate, 5s, 30s, or 1m.`);return parsed}__name(parseEntryBatchWindow,"parseEntryBatchWindow");function hasFilterOptions(opts){return!!(opts.clearFilter||opts.environments||opts.form||opts.agent||opts.mediaType||opts.action||opts.contentType||opts.locale)}__name(hasFilterOptions,"hasFilterOptions");function createUpdateFilter(current,opts){if(!hasFilterOptions(opts))return;if(opts.clearFilter)return createFilter({environments:opts.environments??"main"});let environment=opts.environments??current.filter.environment??"main";return!(opts.form||opts.agent||opts.mediaType||opts.action||opts.contentType||opts.locale)?parseFilter({...current.filter,environment}):createFilter({...opts,environments:environment})}__name(createUpdateFilter,"createUpdateFilter");function parseHeaders(values){return(values??[]).map(entry=>{let separator=entry.indexOf("=");if(separator<=0)throw new WebhookCommandError("WEBHOOK_HEADER_INVALID",`Invalid --header '${entry}'. Use Name=secret:KEY, Name=bearer:KEY, Name=token:KEY, or Name=literal:value.`);let name=entry.slice(0,separator).trim(),encoded=entry.slice(separator+1);if(encoded.startsWith("secret:"))return{name,value:{source:"secret",key:encoded.slice(7)}};if(encoded.startsWith("bearer:"))return{name,value:{source:"secret",key:encoded.slice(7),prefix:"Bearer "}};if(encoded.startsWith("token:"))return{name,value:{source:"secret",key:encoded.slice(6),prefix:"token "}};if(encoded.startsWith("literal:"))return{name,value:{source:"literal",value:encoded.slice(8)}};throw new WebhookCommandError("WEBHOOK_HEADER_INVALID",`Invalid --header '${entry}'. Use Name=secret:KEY, Name=bearer:KEY, Name=token:KEY, or Name=literal:value.`)})}__name(parseHeaders,"parseHeaders");function parseJson(value,flag2){try{return JSON.parse(value)}catch{throw new WebhookCommandError("WEBHOOK_JSON_INVALID",`${flag2} must be valid JSON. Quote the value so your shell passes it as one argument.`)}}__name(parseJson,"parseJson");async function parseJsonInput(value,flag2,cwd){let input=value;if(value==="-")input=await readStdin2();else if(value.startsWith("@")){let path45=resolve9(resolveProjectCwd(cwd),value.slice(1));try{input=await readFile5(path45,"utf8")}catch{throw new WebhookCommandError("WEBHOOK_INPUT_READ_FAILED",`Could not read ${flag2} input from '${path45}'.`)}}return parseJson(input,flag2)}__name(parseJsonInput,"parseJsonInput");async function readStdin2(){let input="";process.stdin.setEncoding("utf8");for await(let chunk of process.stdin)input+=chunk;return input}__name(readStdin2,"readStdin");function parseJsonObject3(value,flag2){let parsed=parseJson(value,flag2);if(!parsed||typeof parsed!="object"||Array.isArray(parsed))throw new WebhookCommandError("WEBHOOK_DATA_INVALID",`${flag2} must be a JSON object.`);return parsed}__name(parseJsonObject3,"parseJsonObject");function parseOnOff(value,flag2){if(value==="on")return!0;if(value==="off")return!1;throw new WebhookCommandError("WEBHOOK_TOGGLE_INVALID",`${flag2} must be 'on' or 'off'.`)}__name(parseOnOff,"parseOnOff");function parseLimit2(value){let limit=Number(value);if(!Number.isInteger(limit)||limit<1||limit>100)throw new WebhookCommandError("WEBHOOK_LIMIT_INVALID","--limit must be an integer from 1 to 100.");return limit}__name(parseLimit2,"parseLimit");function renderJson(command,data2){ui.result({command,data:data2,render:__name(()=>JSON.stringify(data2,null,2),"render")})}__name(renderJson,"renderJson");init_dist();init_auth();async function whoamiCommand(){let creds=requireCredentials();if(!creds.user){ui.error({command:"whoami",code:"NOT_AUTHENTICATED",message:"Could not resolve the current user from local credentials.",hint:"Run `fimo login` again."});return}let displayName=creds.user.name||creds.user.email,activeOrganization=creds.activeOrganization?.name??null;ui.kv({command:"whoami",headline:`Signed in as ${displayName} (${creds.user.email})`,fields:{user:displayName,email:creds.user.email,active_organization:activeOrganization},hint:activeOrganization===null?"Run `fimo orgs switch` to pick an active organization.":void 0})}__name(whoamiCommand,"whoamiCommand");init_config();var TOP_LEVEL_HELP_GROUPS=[{title:"Account",commands:["login","logout","whoami"]},{title:"Project lifecycle",commands:["create","migrate","deploy","validate","describe"]},{title:"Projects & teams",commands:["projects","orgs","invite","credits","referral","rename","delete","unpublish"]},{title:"Environments & releases",commands:["status","branch","checkout","switch","pull","diff","merge","publish","preview"]},{title:"Content & media",commands:["schemas","entries","forms","translations","assets","generate","models"]},{title:"Domains & analytics",commands:["domains","analytics"]},{title:"Agents & integrations",commands:["agents","skills","rules","integrations","channels","mcp"]},{title:"Configuration",commands:["vars","secrets"]},{title:"Help",commands:["support","help"]}];function configureGroupedHelp(program2){program2.configureHelp({...program2.configureHelp(),formatHelp:__name((cmd,helper)=>formatHelpWithGroupedCommands(cmd,helper,TOP_LEVEL_HELP_GROUPS),"formatHelp")})}__name(configureGroupedHelp,"configureGroupedHelp");function formatHelpWithGroupedCommands(cmd,helper,groups){let termWidth=helper.padWidth(cmd,helper),helpWidth=helper.helpWidth??80,formatItem=__name((term,description)=>helper.formatItem(term,termWidth,description,helper),"formatItem"),output=[`${helper.styleTitle("Usage:")} ${helper.styleUsage(helper.commandUsage(cmd))}`,""],commandDescription=helper.commandDescription(cmd);commandDescription.length>0&&(output=output.concat([helper.boxWrap(helper.styleCommandDescription(commandDescription),helpWidth),""]));let argumentList=helper.visibleArguments(cmd).map(argument=>formatItem(helper.styleArgumentTerm(helper.argumentTerm(argument)),helper.styleArgumentDescription(helper.argumentDescription(argument))));argumentList.length>0&&(output=output.concat([helper.styleTitle("Arguments:"),...argumentList,""]));let optionList=helper.visibleOptions(cmd).map(option=>formatItem(helper.styleOptionTerm(helper.optionTerm(option)),helper.styleOptionDescription(helper.optionDescription(option))));if(optionList.length>0&&(output=output.concat([helper.styleTitle("Options:"),...optionList,""])),helper.showGlobalOptions){let globalOptionList=helper.visibleGlobalOptions(cmd).map(option=>formatItem(helper.styleOptionTerm(helper.optionTerm(option)),helper.styleOptionDescription(helper.optionDescription(option))));globalOptionList.length>0&&(output=output.concat([helper.styleTitle("Global Options:"),...globalOptionList,""]))}let commandSections=formatGroupedCommandSections(cmd,helper,groups,termWidth);return commandSections.length>0&&(output=output.concat([helper.styleTitle("Commands:"),...commandSections,""])),output.join(`
|
|
1406
1406
|
`)}__name(formatHelpWithGroupedCommands,"formatHelpWithGroupedCommands");function formatGroupedCommandSections(cmd,helper,groups,termWidth){let visibleCommands=helper.visibleCommands(cmd);if(visibleCommands.length===0)return[];let commandByName=new Map(visibleCommands.map(command=>[command.name(),command])),renderedNames=new Set,sections=[];for(let group of groups){let rows=group.commands.map(name=>commandByName.get(name)).filter(command=>command!==void 0).map(command=>(renderedNames.add(command.name()),indentBlock(helper.formatItem(helper.styleSubcommandTerm(helper.subcommandTerm(command)),termWidth,helper.styleSubcommandDescription(helper.subcommandDescription(command)),helper))));rows.length>0&&(sections.length>0&§ions.push(""),sections.push(` ${group.title}:`,...rows))}let ungroupedRows=visibleCommands.filter(command=>!renderedNames.has(command.name())).map(command=>indentBlock(helper.formatItem(helper.styleSubcommandTerm(helper.subcommandTerm(command)),termWidth,helper.styleSubcommandDescription(helper.subcommandDescription(command)),helper)));return ungroupedRows.length>0&&(sections.length>0&§ions.push(""),sections.push(" Other commands:",...ungroupedRows)),sections}__name(formatGroupedCommandSections,"formatGroupedCommandSections");function indentBlock(value){return value.split(`
|
|
1407
1407
|
`).map(line=>` ${line}`).join(`
|
|
1408
|
-
`)}__name(indentBlock,"indentBlock");init_agents();init_auth_errors();init_project_context();function computeVersionString(){let pkgVersion="0.0.0";try{let pkg=JSON.parse(fs43.readFileSync(path44.join(CLI_ROOT,"package.json"),"utf8"));typeof pkg.version=="string"&&pkg.version.length>0&&(pkgVersion=pkg.version)}catch{}let releaseId;try{let release=JSON.parse(fs43.readFileSync(path44.join(CLI_ROOT,"release.json"),"utf8"));typeof release.id=="string"&&release.id.length>0&&(releaseId=release.id)}catch{}let{apiUrl}=loadConfig(),detailParts=[];return releaseId&&detailParts.push(`release ${releaseId}`),detailParts.push(apiUrl),`fimo ${pkgVersion} (${detailParts.join(", ")})`}__name(computeVersionString,"computeVersionString");program.name("fimo").description("Fimo CLI").version(computeVersionString()).option("--env <name>","Override the env this command targets (defaults to the current git branch, falling back to `main`)").option("--json","Emit one structured JSON envelope per command (for tools / agents). FIMO_OUTPUT=json env also enables this.").option("--no-color","Disable colour in pretty mode (NO_COLOR env var also honoured)").option("--ascii","Use ASCII fallbacks for unicode glyphs (\u2713 \u2192 [ok], etc.) - for legacy terminals").hook("preAction",thisCommand=>{let opts=thisCommand.optsWithGlobals();initUi({json:opts.json===!0,noColor:opts.color===!1,ascii:opts.ascii===!0,jsonEnvVar:"FIMO_OUTPUT",asciiEnvVar:"FIMO_ASCII"})});program.command("login").description("Sign in through your browser").action(loginCommand);program.command("logout").description("Revoke the current session and clear local credentials").action(logoutCommand);program.command("whoami").description("Show the current signed-in user").action(whoamiCommand);registerProjectSecretsCommands(program);registerIntegrationsCommands(program);registerChannelsCommands(program);registerSchedulesCommands(program);registerHistoryCommands(program);registerSupportCommands(program);registerWebhooksCommands(program);registerLocalesCommands(program);program.command("invite").description("Invite a user to an organization or project").option("--target <target>","Invite target: organization or project").option("--org <organizationId>","Organization ID (defaults to active when needed)").option("--project <projectId>","Project ID (defaults to the current project when available)").option("--email <email>","Email address of the user to invite").option("--role <role>","Role or access level to grant").option("-C, --cwd <dir>","Project directory used to resolve the current project").option("-y, --yes","Skip the confirmation prompt").option("--resend","Resend an existing pending organization invite").action(inviteCommand);program.command("mcp").description("Serve the Fimo MCP server over stdio (for MCP clients such as Claude Code or Cursor)").action(mcpCommand);program.command("clone").description("Clone an existing Fimo project locally").argument("[projectId]","Project ID to clone").argument("[dir]","Target directory (defaults to the project name)").option("--env <name>","Env to clone (defaults to main)").action(cloneCommand);program.command("init").description("Set up a Fimo project locally: sign in, create or link a project, install deps and skills").argument("[dir]","Target directory").option("--project-id <id>","Link an existing project instead of creating a new one").option("--org <organizationId>","Target organization ID when creating (recommended for agents and CI)").option("--env <name>","Env to check out when linking an existing project (defaults to main)").option("--template-root <path>","Override template directory when creating").option("--starter <id>","Add an opt-in project starter (for example fimo-site@1)").option("--package-manager <pm>","Install dependencies with: npm | pnpm | yarn | bun").option("--install","Install dependencies after checkout").option("--no-install","Skip dependency installation after checkout").option("--skills","Install the global Fimo skill for your AI coding agents").option("--no-skills","Skip installing the global Fimo skill").option("--agents <list>",'Comma-separated list of AI agents to install the global Fimo skill for (e.g. claude-code,cursor). Pass "none" to skip.').option("-a, --agent <id>","Repeatable: pass once per agent (-a claude-code -a cursor)",(value,prev2=[])=>[...prev2,value]).option("-y, --yes","Run non-interactively using defaults (no prompts)").action(initCommand);var migrate=program.command("migrate").description("Prepare agent-ready migrations from existing websites into Fimo").argument("[url]","Published source site URL for the agent-ready migration draft").argument("[dir]","Target Fimo project directory (creates one if empty/missing)").option("-C, --cwd <dir>","Existing project directory when omitting [dir]").option("--org <organizationId>","Target organization ID when creating a new project").option("--template-root <path>","Override template directory when creating a new project").option("--install","Install dependencies after scaffolding a new project").option("--no-install","Skip dependency installation after scaffolding a new project").option("--agents <list>","Comma-separated list of AI agents to set up when creating a new project (e.g. claude-code,cursor)").option("-a, --agent <id>","Repeatable: pass once per agent (-a claude-code -a cursor)",(value,prev2=[])=>[...prev2,value]).option("--mode <mode>","Project skill install method for newly created projects: symlink | copy").option("--max-pages <n>","Maximum number of HTML pages to crawl (default 12)").option("--max-assets <n>","Maximum media assets to download into the migration pack (default 40)").option("--download-media","Download detected media assets into the migration pack").option("--no-download-media","Skip downloading detected media assets").option("--route <path>",'Limit the refinement pack to one route (for example "/contact")').action((url,dir,options)=>{if(!url){migrate.help();return}return migrateRunCommand(url,dir,options)});migrate.command("init").description("Create or reuse a Fimo project, crawl a live site, and write migration artifacts").argument("<url>","Published source site URL").argument("[dir]","Target Fimo project directory (creates one if empty/missing)").option("-C, --cwd <dir>","Existing project directory when omitting [dir]").option("--org <organizationId>","Target organization ID when creating a new project").option("--template-root <path>","Override template directory when creating a new project").option("--install","Install dependencies after scaffolding a new project").option("--no-install","Skip dependency installation after scaffolding a new project").option("--agents <list>","Comma-separated list of AI agents to set up when creating a new project (e.g. claude-code,cursor)").option("-a, --agent <id>","Repeatable: pass once per agent (-a claude-code -a cursor)",(value,prev2=[])=>[...prev2,value]).option("--mode <mode>","Project skill install method for newly created projects: symlink | copy").option("--max-pages <n>","Maximum number of HTML pages to crawl (default 12)").option("--max-assets <n>","Maximum media assets to download into the migration pack (default 40)").option("--download-media","Download detected media assets into the migration pack").option("--no-download-media","Skip downloading detected media assets").option("--json","Output the resulting manifest as JSON").action(migrateInitCommand);migrate.command("pull").description("Refresh the current migration artifacts from the source URL stored in manifest.json").option("-C, --cwd <dir>","Project directory").option("--max-pages <n>","Maximum number of HTML pages to crawl (default uses previous manifest)").option("--max-assets <n>","Maximum media assets to download into the migration pack (default 40)").option("--download-media","Download detected media assets into the migration pack").option("--no-download-media","Skip downloading detected media assets").option("--json","Output the refreshed manifest as JSON").action(migratePullCommand);migrate.command("inspect").description("Print a summary of the current migration manifest").option("-C, --cwd <dir>","Project directory").option("--json","Output the manifest as JSON").action(migrateInspectCommand);migrate.command("apply").description("Generate an agent-ready Fimo scaffold from the current migration manifest").option("-C, --cwd <dir>","Project directory").option("--json","Output the apply result as JSON").action(migrateApplyCommand);migrate.command("refine").description("Prepare a high-context agent handoff to refine the generated migration toward the source site").option("-C, --cwd <dir>","Project directory").option("--route <path>",'Limit the refinement pack to one route (for example "/contact")').option("--json","Output the refine result as JSON").action(migrateRefineCommand);migrate.command("import").description("Print regular Fimo CLI commands for importing reviewed migration artifacts").option("-C, --cwd <dir>","Project directory").option("--json","Output suggested commands as JSON").action(migrateImportCommand);migrate.command("manifest").description("Build or refresh the canonical migration manifest at .fimo/migration/manifest.json").option("-C, --cwd <dir>","Project directory").option("--output <path>","Manifest output path relative to the project directory").option("--fresh","Discard previous canonical manifest progress while rebuilding").action(migrateManifestCommand);migrate.command("report").description("Write the migration QA report from the canonical manifest").option("-C, --cwd <dir>","Project directory").option("--manifest <path>","Canonical manifest path relative to the project directory").option("--output <path>","Report output path relative to the project directory").option("--no-update-manifest","Do not write qa.status and qa.checks back to the manifest").action(migrateReportCommand);program.command("deploy").description("Push main to Fimo and deploy to preview (use --publish to also go live)").option("-C, --cwd <dir>","Run against this directory instead of cwd").option("--publish","Also publish the new version after deploying to preview").option("-m, --message <msg>","Commit message for any uncommitted changes").option("--no-restart","Don't restart the sandbox dev server after pull \u2014 rely on Vite HMR. Use when only HMR-safe files changed (components/pages/styles/content). See the `fimo` skill for when to use this.").option("--force","Deploy even if validation fails (escape hatch; may still fail later in the sandbox)").action(deployCommand);program.command("validate").description("Run all checks and sync local state with the Fimo backend").option("-C, --cwd <dir>","Run against this directory instead of cwd").option("--json","Emit structured JSON output (for CI / agents)").action(validateCommand);program.command("describe [path]").description("Print a structured snapshot of the current Fimo project (read-only)").option("-C, --cwd <dir>","Run against this directory instead of cwd").option("--depth <n>","Tree depth (default 3). Ignored when --full is set.").option("--full","Disable depth and width truncation (still respects the 10k-entry cap)").option("--json","Emit structured JSON output (for CI / agents)").action(describeCommand);program.command("credits").description("Show the current project credit balance").option("-C, --cwd <dir>","Project directory").option("--project <projectId>","Project ID (defaults to the current project)").option("--json","Emit structured JSON output").action(creditsCommand);program.command("delete").description("Delete the current linked project").option("-C, --cwd <dir>","Project directory").option("-y, --yes","Skip confirmation prompt").action(options=>projectsDeleteCommand(void 0,options));program.command("unpublish").description("Unpublish the current project").option("-C, --cwd <dir>","Project directory").action(options=>projectsUnpublishCommand(void 0,options));program.command("rename").description("Set the display name of the current project").argument("<name>",'New display name (e.g. "Acme Blog")').option("-C, --cwd <dir>","Project directory").action((name,options)=>projectsRenameCommand(name,void 0,options));var orgs=program.command("orgs").description("Manage organizations");orgs.command("list").description("List organizations you belong to").action(orgsListCommand);orgs.command("switch").description("Switch the active organization used by `fimo init`").option("--org <id-or-slug>","Switch to this organization without prompting").action(switchCommand);orgs.command("members").description("List members of an organization (defaults to the active org)").option("--org <organizationId>","Organization ID (defaults to active)").action(orgsMembersCommand);var referral=program.command("referral").description("Share and inspect your referral program tools");referral.command("link").description("Print your referral link").action(referralLinkCommand);referral.command("stats").description("Show your referral stats").action(referralStatsCommand);var projects=program.command("projects").description("Manage projects across an organization");projects.command("list").description("List projects in an organization (defaults to the active org)").option("--org <organizationId>","Organization ID (defaults to active)").action(projectsListCommand);projects.command("create").description("Scaffold a new project (alias of `fimo init`)").argument("[dir]","Target directory").option("--org <organizationId>","Target organization ID (auto if you belong to one)").option("--template-root <path>","Override template directory").option("--starter <id>","Add an opt-in project starter (for example fimo-site@1)").option("--package-manager <pm>","Install dependencies with: npm | pnpm | yarn | bun").option("--install","Install dependencies after scaffolding").option("--no-install","Skip dependency installation after scaffolding").action(initCommand);projects.command("clone").description("Clone an existing Fimo project locally").argument("[projectId]","Project ID to clone").argument("[dir]","Target directory (defaults to the project name)").option("--env <name>","Env to clone (defaults to main)").action(cloneCommand);projects.command("delete").description("Delete a project (defaults to the current linked project)").argument("[projectId]","Explicit project ID").option("-C, --cwd <dir>","Project directory").option("-y, --yes","Skip confirmation prompt").action(projectsDeleteCommand);projects.command("publish").description("Publish a project (defaults to the current project)").argument("[projectId]","Explicit project ID").option("-C, --cwd <dir>","Project directory").action(projectsPublishCommand);projects.command("unpublish").description("Unpublish a project (defaults to the current project)").argument("[projectId]","Explicit project ID").option("-C, --cwd <dir>","Project directory").action(projectsUnpublishCommand);projects.command("rename").description("Set the display name of a project (defaults to the current project)").argument("<name>",'New display name (e.g. "Acme Blog")').argument("[projectId]","Explicit project ID").option("-C, --cwd <dir>","Project directory").action(projectsRenameCommand);var domains=program.command("domains").description("Manage your default URL and custom domains");domains.command("list").alias("ls").description("Show the default URL and any custom domains").option("--project <projectId>","Project ID (defaults to the current project)").option("-C, --cwd <dir>","Project directory").option("--json","Output as JSON").action(domainsListCommand);domains.command("rename-default").description("Rename your default URL (the <slug>.fimo.site subdomain Fimo provides)").argument("<slug>",'New slug (e.g. "acme-coffee")').option("--project <projectId>","Project ID (defaults to the current project)").option("-C, --cwd <dir>","Project directory").option("--json","Output as JSON").action(domainsRenameDefaultCommand);domains.command("suggest-default").description("Suggest available default URLs; pick one to claim (or list with --json)").option("--base <text>","Override the base text used to generate suggestions (defaults to your project display name)").option("--max <n>","Number of suggestions to fetch (1\u201310, default 5)").option("--pick <slug-or-index>","Non-interactive: claim this suggestion by slug or numeric index").option("--project <projectId>","Project ID (defaults to the current project)").option("-C, --cwd <dir>","Project directory").option("--json","Output as JSON (no prompt, no claim)").action(domainsSuggestDefaultCommand);domains.command("add").description("Attach a custom domain to your project (Premium plan required)").argument("<hostname>",'The hostname to attach (e.g. "blog.example.com")').option("--redirect-www","Also configure an apex \u2192 www redirect").option("--wait [duration]","Poll until DNS is verified (e.g. --wait, --wait 10m)").option("--project <projectId>","Project ID (defaults to the current project)").option("-C, --cwd <dir>","Project directory").option("--json","Output the resulting domain record as JSON after instructions").action(domainsAddCommand);domains.command("remove").alias("rm").description("Detach a custom domain by hostname or ID").argument("<hostname-or-id>","Hostname or domain ID").option("-y, --yes","Skip the confirmation prompt").option("--project <projectId>","Project ID (defaults to the current project)").option("-C, --cwd <dir>","Project directory").action(domainsRemoveCommand);domains.command("refresh").description("Re-check DNS and SSL status for a custom domain").argument("<hostname-or-id>","Hostname or domain ID").option("--wait [duration]","Poll until SSL is active (default; pass --no-wait to print one snapshot)").option("--no-wait","Print the refreshed status once and exit").option("--project <projectId>","Project ID (defaults to the current project)").option("-C, --cwd <dir>","Project directory").option("--json","Output the resulting domain record as JSON").action(domainsRefreshCommand);domains.command("search").description("Search for available domain names to buy through Fimo").argument("<keyword>",'Search keyword (e.g. "acme coffee")').option("--tld <list>",'Restrict TLDs (comma-separated, e.g. "com,io,dev")').option("--max-price <amount>","Filter results to this purchase price ceiling (in dollars)").option("--limit <n>","Truncate to the first N results (default 20)").option("--json","Output as JSON").action(domainsSearchCommand);domains.command("pricing").description("Show the price for a specific domain (purchase + renewal)").argument("<domain>",'Domain name (e.g. "example.com")').option("--years <n>","Multiply purchase price by this many years (default 1)").option("--json","Output as JSON").action(domainsPricingCommand);domains.command("buy").description("Buy a domain through Fimo. Creates a checkout invoice; no charge until you pay it in the browser.").argument("<domain>",'Domain name to register (e.g. "example.com")').option("--years <n>","Years to register for (default uses the TLD minimum)").option("--auto-renew","Enable auto-renewal (default)").option("--no-auto-renew","Disable auto-renewal \u2014 domain will not renew automatically").option("-y, --yes","Skip the interactive confirmation prompt").option("--open","Open the checkout URL in your browser after creating the invoice").option("--wait [duration]","Poll until payment completes and registration succeeds").option("--org <organizationId>","Organization ID (defaults to the current project's org)").option("-C, --cwd <dir>","Project directory used to resolve the org").option("--json","Output the resulting invoice record as JSON").action(domainsBuyCommand);domains.command("owned").description("List domains your organization has registered through Fimo").option("--org <organizationId>","Organization ID (defaults to the current project's org)").option("--status <list>",'Filter by status (comma-separated, e.g. "owned,pending_payment")').option("--limit <n>","Truncate to the first N results").option("-C, --cwd <dir>","Project directory used to resolve the org").option("--json","Output as JSON").action(domainsOwnedCommand);var scripts=program.command("scripts",{hidden:!0}).description("Internal/advanced primitives. Most users want `fimo validate`.");scripts.command("sync-schemas").description("Regenerate TypeScript clients for src/schemas/*.json").option("-C, --cwd <dir>","Project directory").action(syncSchemasCommand);scripts.command("sync-forms").description("Regenerate TypeScript clients for src/forms/*.json").option("-C, --cwd <dir>","Project directory").action(syncFormsCommand);scripts.command("validate-route-metadata").description("Cross-validate src/routes.ts against .fimo/config.json#routes (v4)").option("-C, --cwd <dir>","Project directory").action(validateRouteMetadataCommand);scripts.command("extract-translations").description("Legacy local helper: scan src/ for literal t() label keys").option("-C, --cwd <dir>","Project directory").action(extractTranslationsCommand);scripts.command("lint").description("Lint project files (translation keys + oxlint)").argument("[path]","Single file to lint (omit for whole project)").option("-C, --cwd <dir>","Project directory").action(lintCommand);program.command("export-static",{hidden:!0}).description("Post-build: clean dist/server and *.data files (after react-router build)").option("-C, --cwd <dir>","Project directory").action(exportStaticCommand);program.command("resolve-routes",{hidden:!0}).description("Map changed files back to affected preview routes").argument("[files...]","Changed files to resolve").option("-C, --cwd <dir>","Project directory").action(resolveRoutesCommand);var branchCmd=program.command("branch").description("List, create, or delete envs (multi-surface env = git branch + per-env Neon DB + sandbox)").argument("[name]","Env name (omit to list)").option("-v, --verbose","Show preview URLs + deleted envs").option("--all","Also list Fimo's own agent envs (task/*), normally hidden").option("-d, --delete","Delete the named env (drops sandbox + Neon branch + R2 prefix)").option("--from <env>","Parent env to fork from when creating (defaults to current)").action(async(name,_options,command)=>{if(!name){await branchListCommand(command);return}if(command.opts().delete){await branchDeleteCommand(name,command);return}await branchCreateCommand(name,command)});program.command("checkout").description("Switch to an env (or create + switch with -b)").argument("<name>","Env name").option("-b, --create","Create the env if it does not exist").option("--from <env>","Parent env (only with -b)").action(checkoutCommand);program.command("switch").description("Alias for `fimo checkout` (switch envs)").argument("<name>","Env name").action(checkoutCommand);program.command("pull").description("Sync the current env's data plane from its parent").option("--from <env>","Sync from an explicit ancestor (defaults to declared parent)").action(pullCommand);program.command("diff").description("Two-env diff across all surfaces").argument("[from]","From env (defaults to current env)").argument("[to]","To env (defaults to main)").option("-C, --cwd <dir>","Project directory").option("--surface <name>","Limit to a single surface (code | schemas | content | ...)").option("--key <key>","Drill into one item within --surface (W2 \u2014 per-item before/after)").option("--all","Render the full item list, bypassing the per-surface cap").option("--json","Emit raw JSON instead of the rendered report").option("--no-color","Disable ANSI colour output").action(diffCommand);program.command("merge").description("Merge another env into the current one (multi-surface, atomic, with conflict resolver)").argument("<from>","Source env").option("-C, --cwd <dir>","Project directory").option("--allow-direct-merge","Override the main-branch protected-flow gate").option("-y, --yes","Accept parent-wins for every conflict (non-interactive)").option("--resume","Resume an in-flight merge from its persisted draft (W3.6)").option("--json","Emit raw JSON instead of the rendered report").option("--no-color","Disable ANSI colour output").action(mergeCommand);program.command("publish").description("Tag main@HEAD as release/<version> + trigger prod swap").option("-C, --cwd <dir>","Project directory").option("--version <ver>","Semver version for the release (e.g. 1.4.2)").option("--notes <text>","Optional release notes (markdown)").option("--skip-validate","Skip the lint + codegen + smoke pre-checks (operator override)").action(publishCommand);program.command("status").description("Multi-surface env status \u2014 the showcase command").option("-C, --cwd <dir>","Project directory").option("--short","One-line summary per surface (no bodies)").option("--json","Emit raw JSON instead of the rendered report").option("--vs <env>","Comparison target (defaults to the parent env or main)").option("--no-color","Disable ANSI colour output").option("--code","Limit to the code surface").option("--content","Limit to the content surface").option("--i18n","Limit to the translations surface").option("--assets","Limit to the assets surface").option("--forms","Limit to the forms surface").option("--all","Render the full item list, bypassing the per-surface cap").action(statusCommand2);registerAgentsCommands(program);registerPreviewCommands(program);program.addCommand(new Command("git-credential").argument("<operation>","get | store | erase (git credential protocol)").description("Internal git credential helper (invoked by git)").action(gitCredentialCommand),{hidden:!0});registerGenerate(program);registerMediaTaskCommands(program);var schemas2=program.command("schemas").description("Manage content-type schemas");schemas2.command("list").description("List all registered schemas").option("-C, --cwd <dir>","Project directory").action(schemaListCommand);schemas2.command("get").description("Get a schema by type name").argument("<typeName>","Content type name (e.g. BlogPost)").option("-C, --cwd <dir>","Project directory").action(schemaGetCommand);schemas2.command("push").description("Push schema JSON files to the API (create or update)").argument("[typeName]","Schema name to push (omit to push all)").option("-C, --cwd <dir>","Project directory").option("--rename <from=to>","Preserve a renamed field (repeatable, supports nested paths)",(value,previous)=>[...previous,value],[]).action(schemaPushCommand);schemas2.command("delete").description("Delete a schema by type name").argument("<typeName>","Content type name").option("-C, --cwd <dir>","Project directory").action(schemaDeleteCommand);var entries=program.command("entries").description("Manage content entries");entries.command("list").description("List entries of a content type").argument("<typeName>","Content type name").option("-C, --cwd <dir>","Project directory").option("--limit <n>","Max entries to return").option("--offset <n>","Offset for pagination").option("--search <query>","Search query").option("--where <json>",`JSON filter object, e.g. '{"featured":true}'`).option("--sort <field>","Sort field, prefix with - for descending").option("--fields <fields>","Comma-separated fields to return, e.g. slug,title,excerpt").option("--populate <fields>","Comma-separated reference fields to populate, e.g. author,contributors").option("--locale <locale>","Locale to list (default en)").option("--sort-by <field>","Sort field").option("--sort-direction <dir>","Sort direction (asc|desc)").action(entriesListCommand);entries.command("get").description("Get a single entry").argument("<typeName>","Content type name").argument("<id>","Entry ID").option("-C, --cwd <dir>","Project directory").option("--locale <locale>","Entry locale (defaults to the project locale)").action(entriesGetCommand);entries.command("create").description("Create a new entry").argument("<typeName>","Content type name").option("-C, --cwd <dir>","Project directory").requiredOption("--body <json>","Entry JSON body (slug + data)").option("--locale <locale>","Entry locale (default en)").option("--document-id <id>","Document ID shared by localized variants").action(entriesCreateCommand);entries.command("update").description("Update an existing entry").argument("<typeName>","Content type name").argument("<id>","Entry ID").option("-C, --cwd <dir>","Project directory").requiredOption("--body <json>","Updated entry JSON body").option("--locale <locale>","Entry locale (defaults to the project locale)").action(entriesUpdateCommand);entries.command("delete").description("Delete an entry").argument("<typeName>","Content type name").argument("<id>","Entry ID").option("-C, --cwd <dir>","Project directory").option("--locale <locale>","Entry locale (defaults to the project locale)").action(entriesDeleteCommand);entries.command("query").description("Run a read-only SQL query over the entries table").option("-C, --cwd <dir>","Project directory").option("--sql <query>","SQL SELECT query").option("--file <path>","Read the SQL query from a file").option("--stdin","Read the SQL query from stdin").action(entriesQueryCommand);entries.command("bulk-create").description("Create multiple entries").argument("<typeName>","Content type name").option("-C, --cwd <dir>","Project directory").option("--body <json>","JSON array of entry bodies").option("--file <path>","Read entry bodies from a JSON file").option("--stdin","Read entry bodies from stdin").action(entriesBulkCreateCommand);entries.command("bulk-update").description("Update multiple entries").argument("<typeName>","Content type name").option("-C, --cwd <dir>","Project directory").option("--ids <ids>","Comma-separated IDs").option("--where <json>",`JSON filter object, e.g. '{"status":"draft"}'`).option("--body <json>","Updated entry JSON body").option("--file <path>","Read per-entry updates from a JSON file").option("--stdin","Read per-entry updates from stdin").action(entriesBulkUpdateCommand);entries.command("bulk-delete").description("Delete multiple entries").argument("<typeName>","Content type name").option("-C, --cwd <dir>","Project directory").option("--ids <ids>","Comma-separated IDs").option("--where <json>",`JSON filter object, e.g. '{"archived":true}'`).option("--locale <locale>","Entry locale (defaults to the project locale)").action(entriesBulkDeleteCommand);var singles=program.command("singles").description("Manage single content types");singles.command("get").description("Get a Single").argument("<typeName>","Single type name").option("-C, --cwd <dir>","Project directory").option("--locale <locale>","Single locale (defaults to the project locale)").option("--populate <fields>","Comma-separated reference fields to populate").action(singlesGetCommand);singles.command("update").description("Update a Single").argument("<typeName>","Single type name").option("-C, --cwd <dir>","Project directory").option("--body <json>","Updated Single JSON body").option("--file <path>","Read the updated Single JSON body from a file").option("--stdin","Read the updated Single JSON body from stdin").option("--locale <locale>","Single locale (defaults to the project locale)").action(singlesUpdateCommand);var assets2=program.command("assets").description("Manage media assets");assets2.command("list").description("List assets").option("-C, --cwd <dir>","Project directory").option("--parent-id <id>","Filter by parent folder").option("--search <query>","Search across name, alt text, caption, and AI-generated alt / caption (case-insensitive)").option("--type <type>","Filter by entry type (file|folder)").option("--image","Filter to image MIME types (shortcut for --mime-prefix image/)").option("--video","Filter to video MIME types (shortcut for --mime-prefix video/)").option("--audio","Filter to audio MIME types (shortcut for --mime-prefix audio/)").option("--mime-prefix <prefix>",'Filter by MIME type prefix (e.g. "image/png")').option("--sort-by <field>","Sort field").option("--limit <n>","Max results").option("--offset <n>","Offset").action(assetsListCommand);assets2.command("upload").description("Upload a file to the media library").argument("<file>","Path to the file to upload").option("-C, --cwd <dir>","Project directory").option("--name <name>","Asset display name").option("--parent-id <id>","Target folder ID").option("--folder-path <path>","Target folder path, creating missing folders").action(assetsUploadCommand);var modelsCmd=new Command("models").description("Browse available media generation models");program.addCommand(modelsCmd,{hidden:!0});modelsCmd.command("list").description("List Fal models enabled for this project").option("-C, --cwd <dir>","Project directory").option("--modality <m>","Filter by modality (image | video | audio)").option("--search <query>","Search names and descriptions").option("--category <category>","Filter by Fal media category").option("--tag <t>","Filter by tag (repeatable; AND semantics \u2014 model must have every tag)",(value,previous)=>[...previous,value],[]).option("--extended","Per-model card: alias, provider, tags, price, best-for, flags").option("--json","Machine-readable JSON output").action(modelsListCommand);modelsCmd.command("show").description("Show a Fal model and its available flags").argument("<key>","Namespaced model id from `fimo models list`").option("-C, --cwd <dir>","Project directory").option("--json","Machine-readable JSON output (includes the per-model flag list)").action(modelsShowCommand);assets2.command("create-folder").description("Create a folder in the media library").argument("<name>","Folder name").option("-C, --cwd <dir>","Project directory").option("--parent-id <id>","Parent folder ID").action(assetsCreateFolderCommand);assets2.command("move").description("Move an asset to a different folder").argument("<id>","Asset ID").option("-C, --cwd <dir>","Project directory").requiredOption("--parent-id <id>",'Target folder ID (use "null" for root)').action(assetsMoveCommand);assets2.command("delete").description("Delete an asset").argument("<id>","Asset ID").option("-C, --cwd <dir>","Project directory").action(assetsDeleteCommand);assets2.command("open").description("Fetch asset metadata; optionally download locally or open in default viewer").argument("<id>","Asset ID").option("-C, --cwd <dir>","Project directory").option("--download","Download the asset bytes to a local file and print the path").option("--browser","Open the asset URL in the OS default viewer (open / xdg-open / start)").option("--path <path>","Override download destination (default: <tmpdir>/fimo-assets/<id>.<ext>). Implies --download.").action((id,options,cmd)=>(options.path&&!options.download&&(options.download=!0),assetsOpenCommand(id,options,cmd)));var forms2=program.command("forms").description("Manage forms");forms2.command("list").description("List all forms").option("-C, --cwd <dir>","Project directory").action(formsListCommand);forms2.command("get").description("Get a form by ID").argument("<id>","Form ID").option("-C, --cwd <dir>","Project directory").action(formsGetCommand);forms2.command("push").description("Push form JSON files to the API (create or update, patches id back)").argument("[formName]","Form name to push (omit to push all)").option("-C, --cwd <dir>","Project directory").action(formsPushCommand);forms2.command("delete").description("Delete a form").argument("<id>","Form ID").option("-C, --cwd <dir>","Project directory").action(formsDeleteCommand);var supportedAgentsHelp=`
|
|
1408
|
+
`)}__name(indentBlock,"indentBlock");init_agents();init_auth_errors();init_project_context();function computeVersionString(){let pkgVersion="0.0.0";try{let pkg=JSON.parse(fs43.readFileSync(path44.join(CLI_ROOT,"package.json"),"utf8"));typeof pkg.version=="string"&&pkg.version.length>0&&(pkgVersion=pkg.version)}catch{}let releaseId;try{let release=JSON.parse(fs43.readFileSync(path44.join(CLI_ROOT,"release.json"),"utf8"));typeof release.id=="string"&&release.id.length>0&&(releaseId=release.id)}catch{}let{apiUrl}=loadConfig(),detailParts=[];return releaseId&&detailParts.push(`release ${releaseId}`),detailParts.push(apiUrl),`fimo ${pkgVersion} (${detailParts.join(", ")})`}__name(computeVersionString,"computeVersionString");program.name("fimo").description("Fimo CLI").version(computeVersionString()).option("--env <name>","Override the env this command targets (defaults to the current git branch, falling back to `main`)").option("--json","Emit one structured JSON envelope per command (for tools / agents). FIMO_OUTPUT=json env also enables this.").option("--no-color","Disable colour in pretty mode (NO_COLOR env var also honoured)").option("--ascii","Use ASCII fallbacks for unicode glyphs (\u2713 \u2192 [ok], etc.) - for legacy terminals").hook("preAction",thisCommand=>{let opts=thisCommand.optsWithGlobals();initUi({json:opts.json===!0,noColor:opts.color===!1,ascii:opts.ascii===!0,jsonEnvVar:"FIMO_OUTPUT",asciiEnvVar:"FIMO_ASCII"})});program.command("login").description("Sign in through your browser").action(loginCommand);program.command("logout").description("Revoke the current session and clear local credentials").action(logoutCommand);program.command("whoami").description("Show the current signed-in user").action(whoamiCommand);registerProjectSecretsCommands(program);registerIntegrationsCommands(program);registerChannelsCommands(program);registerSchedulesCommands(program);registerHistoryCommands(program);registerSupportCommands(program);registerWebhooksCommands(program);registerLocalesCommands(program);program.command("invite").description("Invite a user to an organization or project").option("--target <target>","Invite target: organization or project").option("--org <organizationId>","Organization ID (defaults to active when needed)").option("--project <projectId>","Project ID (defaults to the current project when available)").option("--email <email>","Email address of the user to invite").option("--role <role>","Role or access level to grant").option("-C, --cwd <dir>","Project directory used to resolve the current project").option("-y, --yes","Skip the confirmation prompt").option("--resend","Resend an existing pending organization invite").action(inviteCommand);program.command("mcp").description("Serve the Fimo MCP server over stdio (for MCP clients such as Claude Code or Cursor)").action(mcpCommand);program.command("clone").description("Clone an existing Fimo project locally").argument("[projectId]","Project ID to clone").argument("[dir]","Target directory (defaults to the project name)").option("--env <name>","Env to clone (defaults to main)").action(cloneCommand);program.command("init").description("Set up a Fimo project locally: sign in, create or link a project, install deps and skills").argument("[dir]","Target directory").option("--project-id <id>","Link an existing project instead of creating a new one").option("--org <organizationId>","Target organization ID when creating (recommended for agents and CI)").option("--env <name>","Env to check out when linking an existing project (defaults to main)").option("--framework <framework>","Project scaffold: react-router | nextjs (defaults to react-router)").option("--template-root <path>","Override template directory when creating").option("--starter <id>","Add an opt-in project starter (for example fimo-site@1)").option("--package-manager <pm>","Install dependencies with: npm | pnpm | yarn | bun").option("--install","Install dependencies after checkout").option("--no-install","Skip dependency installation after checkout").option("--skills","Install the global Fimo skill for your AI coding agents").option("--no-skills","Skip installing the global Fimo skill").option("--agents <list>",'Comma-separated list of AI agents to install the global Fimo skill for (e.g. claude-code,cursor). Pass "none" to skip.').option("-a, --agent <id>","Repeatable: pass once per agent (-a claude-code -a cursor)",(value,prev2=[])=>[...prev2,value]).option("-y, --yes","Run non-interactively using defaults (no prompts)").action(initCommand);var migrate=program.command("migrate").description("Prepare agent-ready migrations from existing websites into Fimo").argument("[url]","Published source site URL for the agent-ready migration draft").argument("[dir]","Target Fimo project directory (creates one if empty/missing)").option("-C, --cwd <dir>","Existing project directory when omitting [dir]").option("--org <organizationId>","Target organization ID when creating a new project").option("--template-root <path>","Override template directory when creating a new project").option("--install","Install dependencies after scaffolding a new project").option("--no-install","Skip dependency installation after scaffolding a new project").option("--agents <list>","Comma-separated list of AI agents to set up when creating a new project (e.g. claude-code,cursor)").option("-a, --agent <id>","Repeatable: pass once per agent (-a claude-code -a cursor)",(value,prev2=[])=>[...prev2,value]).option("--mode <mode>","Project skill install method for newly created projects: symlink | copy").option("--max-pages <n>","Maximum number of HTML pages to crawl (default 12)").option("--max-assets <n>","Maximum media assets to download into the migration pack (default 40)").option("--download-media","Download detected media assets into the migration pack").option("--no-download-media","Skip downloading detected media assets").option("--route <path>",'Limit the refinement pack to one route (for example "/contact")').action((url,dir,options)=>{if(!url){migrate.help();return}return migrateRunCommand(url,dir,options)});migrate.command("init").description("Create or reuse a Fimo project, crawl a live site, and write migration artifacts").argument("<url>","Published source site URL").argument("[dir]","Target Fimo project directory (creates one if empty/missing)").option("-C, --cwd <dir>","Existing project directory when omitting [dir]").option("--org <organizationId>","Target organization ID when creating a new project").option("--template-root <path>","Override template directory when creating a new project").option("--install","Install dependencies after scaffolding a new project").option("--no-install","Skip dependency installation after scaffolding a new project").option("--agents <list>","Comma-separated list of AI agents to set up when creating a new project (e.g. claude-code,cursor)").option("-a, --agent <id>","Repeatable: pass once per agent (-a claude-code -a cursor)",(value,prev2=[])=>[...prev2,value]).option("--mode <mode>","Project skill install method for newly created projects: symlink | copy").option("--max-pages <n>","Maximum number of HTML pages to crawl (default 12)").option("--max-assets <n>","Maximum media assets to download into the migration pack (default 40)").option("--download-media","Download detected media assets into the migration pack").option("--no-download-media","Skip downloading detected media assets").option("--json","Output the resulting manifest as JSON").action(migrateInitCommand);migrate.command("pull").description("Refresh the current migration artifacts from the source URL stored in manifest.json").option("-C, --cwd <dir>","Project directory").option("--max-pages <n>","Maximum number of HTML pages to crawl (default uses previous manifest)").option("--max-assets <n>","Maximum media assets to download into the migration pack (default 40)").option("--download-media","Download detected media assets into the migration pack").option("--no-download-media","Skip downloading detected media assets").option("--json","Output the refreshed manifest as JSON").action(migratePullCommand);migrate.command("inspect").description("Print a summary of the current migration manifest").option("-C, --cwd <dir>","Project directory").option("--json","Output the manifest as JSON").action(migrateInspectCommand);migrate.command("apply").description("Generate an agent-ready Fimo scaffold from the current migration manifest").option("-C, --cwd <dir>","Project directory").option("--json","Output the apply result as JSON").action(migrateApplyCommand);migrate.command("refine").description("Prepare a high-context agent handoff to refine the generated migration toward the source site").option("-C, --cwd <dir>","Project directory").option("--route <path>",'Limit the refinement pack to one route (for example "/contact")').option("--json","Output the refine result as JSON").action(migrateRefineCommand);migrate.command("import").description("Print regular Fimo CLI commands for importing reviewed migration artifacts").option("-C, --cwd <dir>","Project directory").option("--json","Output suggested commands as JSON").action(migrateImportCommand);migrate.command("manifest").description("Build or refresh the canonical migration manifest at .fimo/migration/manifest.json").option("-C, --cwd <dir>","Project directory").option("--output <path>","Manifest output path relative to the project directory").option("--fresh","Discard previous canonical manifest progress while rebuilding").action(migrateManifestCommand);migrate.command("report").description("Write the migration QA report from the canonical manifest").option("-C, --cwd <dir>","Project directory").option("--manifest <path>","Canonical manifest path relative to the project directory").option("--output <path>","Report output path relative to the project directory").option("--no-update-manifest","Do not write qa.status and qa.checks back to the manifest").action(migrateReportCommand);program.command("deploy").description("Push main to Fimo and deploy to preview (use --publish to also go live)").option("-C, --cwd <dir>","Run against this directory instead of cwd").option("--publish","Also publish the new version after deploying to preview").option("-m, --message <msg>","Commit message for any uncommitted changes").option("--no-restart","Don't restart the sandbox dev server after pull \u2014 rely on Vite HMR. Use when only HMR-safe files changed (components/pages/styles/content). See the `fimo` skill for when to use this.").option("--force","Deploy even if validation fails (escape hatch; may still fail later in the sandbox)").action(deployCommand);program.command("validate").description("Run all checks and sync local state with the Fimo backend").option("-C, --cwd <dir>","Run against this directory instead of cwd").option("--json","Emit structured JSON output (for CI / agents)").action(validateCommand);program.command("describe [path]").description("Print a structured snapshot of the current Fimo project (read-only)").option("-C, --cwd <dir>","Run against this directory instead of cwd").option("--depth <n>","Tree depth (default 3). Ignored when --full is set.").option("--full","Disable depth and width truncation (still respects the 10k-entry cap)").option("--json","Emit structured JSON output (for CI / agents)").action(describeCommand);program.command("credits").description("Show the current project credit balance").option("-C, --cwd <dir>","Project directory").option("--project <projectId>","Project ID (defaults to the current project)").option("--json","Emit structured JSON output").action(creditsCommand);program.command("delete").description("Delete the current linked project").option("-C, --cwd <dir>","Project directory").option("-y, --yes","Skip confirmation prompt").action(options=>projectsDeleteCommand(void 0,options));program.command("unpublish").description("Unpublish the current project").option("-C, --cwd <dir>","Project directory").action(options=>projectsUnpublishCommand(void 0,options));program.command("rename").description("Set the display name of the current project").argument("<name>",'New display name (e.g. "Acme Blog")').option("-C, --cwd <dir>","Project directory").action((name,options)=>projectsRenameCommand(name,void 0,options));var orgs=program.command("orgs").description("Manage organizations");orgs.command("list").description("List organizations you belong to").action(orgsListCommand);orgs.command("switch").description("Switch the active organization used by `fimo init`").option("--org <id-or-slug>","Switch to this organization without prompting").action(switchCommand);orgs.command("members").description("List members of an organization (defaults to the active org)").option("--org <organizationId>","Organization ID (defaults to active)").action(orgsMembersCommand);var referral=program.command("referral").description("Share and inspect your referral program tools");referral.command("link").description("Print your referral link").action(referralLinkCommand);referral.command("stats").description("Show your referral stats").action(referralStatsCommand);var projects=program.command("projects").description("Manage projects across an organization");projects.command("list").description("List projects in an organization (defaults to the active org)").option("--org <organizationId>","Organization ID (defaults to active)").action(projectsListCommand);projects.command("create").description("Scaffold a new project (alias of `fimo init`)").argument("[dir]","Target directory").option("--org <organizationId>","Target organization ID (auto if you belong to one)").option("--framework <framework>","Project scaffold: react-router | nextjs (defaults to react-router)").option("--template-root <path>","Override template directory").option("--starter <id>","Add an opt-in project starter (for example fimo-site@1)").option("--package-manager <pm>","Install dependencies with: npm | pnpm | yarn | bun").option("--install","Install dependencies after scaffolding").option("--no-install","Skip dependency installation after scaffolding").action(initCommand);projects.command("clone").description("Clone an existing Fimo project locally").argument("[projectId]","Project ID to clone").argument("[dir]","Target directory (defaults to the project name)").option("--env <name>","Env to clone (defaults to main)").action(cloneCommand);projects.command("delete").description("Delete a project (defaults to the current linked project)").argument("[projectId]","Explicit project ID").option("-C, --cwd <dir>","Project directory").option("-y, --yes","Skip confirmation prompt").action(projectsDeleteCommand);projects.command("publish").description("Publish a project (defaults to the current project)").argument("[projectId]","Explicit project ID").option("-C, --cwd <dir>","Project directory").action(projectsPublishCommand);projects.command("unpublish").description("Unpublish a project (defaults to the current project)").argument("[projectId]","Explicit project ID").option("-C, --cwd <dir>","Project directory").action(projectsUnpublishCommand);projects.command("rename").description("Set the display name of a project (defaults to the current project)").argument("<name>",'New display name (e.g. "Acme Blog")').argument("[projectId]","Explicit project ID").option("-C, --cwd <dir>","Project directory").action(projectsRenameCommand);var domains=program.command("domains").description("Manage your default URL and custom domains");domains.command("list").alias("ls").description("Show the default URL and any custom domains").option("--project <projectId>","Project ID (defaults to the current project)").option("-C, --cwd <dir>","Project directory").option("--json","Output as JSON").action(domainsListCommand);domains.command("rename-default").description("Rename your default URL (the <slug>.fimo.site subdomain Fimo provides)").argument("<slug>",'New slug (e.g. "acme-coffee")').option("--project <projectId>","Project ID (defaults to the current project)").option("-C, --cwd <dir>","Project directory").option("--json","Output as JSON").action(domainsRenameDefaultCommand);domains.command("suggest-default").description("Suggest available default URLs; pick one to claim (or list with --json)").option("--base <text>","Override the base text used to generate suggestions (defaults to your project display name)").option("--max <n>","Number of suggestions to fetch (1\u201310, default 5)").option("--pick <slug-or-index>","Non-interactive: claim this suggestion by slug or numeric index").option("--project <projectId>","Project ID (defaults to the current project)").option("-C, --cwd <dir>","Project directory").option("--json","Output as JSON (no prompt, no claim)").action(domainsSuggestDefaultCommand);domains.command("add").description("Attach a custom domain to your project (Premium plan required)").argument("<hostname>",'The hostname to attach (e.g. "blog.example.com")').option("--redirect-www","Also configure an apex \u2192 www redirect").option("--wait [duration]","Poll until DNS is verified (e.g. --wait, --wait 10m)").option("--project <projectId>","Project ID (defaults to the current project)").option("-C, --cwd <dir>","Project directory").option("--json","Output the resulting domain record as JSON after instructions").action(domainsAddCommand);domains.command("remove").alias("rm").description("Detach a custom domain by hostname or ID").argument("<hostname-or-id>","Hostname or domain ID").option("-y, --yes","Skip the confirmation prompt").option("--project <projectId>","Project ID (defaults to the current project)").option("-C, --cwd <dir>","Project directory").action(domainsRemoveCommand);domains.command("refresh").description("Re-check DNS and SSL status for a custom domain").argument("<hostname-or-id>","Hostname or domain ID").option("--wait [duration]","Poll until SSL is active (default; pass --no-wait to print one snapshot)").option("--no-wait","Print the refreshed status once and exit").option("--project <projectId>","Project ID (defaults to the current project)").option("-C, --cwd <dir>","Project directory").option("--json","Output the resulting domain record as JSON").action(domainsRefreshCommand);domains.command("search").description("Search for available domain names to buy through Fimo").argument("<keyword>",'Search keyword (e.g. "acme coffee")').option("--tld <list>",'Restrict TLDs (comma-separated, e.g. "com,io,dev")').option("--max-price <amount>","Filter results to this purchase price ceiling (in dollars)").option("--limit <n>","Truncate to the first N results (default 20)").option("--json","Output as JSON").action(domainsSearchCommand);domains.command("pricing").description("Show the price for a specific domain (purchase + renewal)").argument("<domain>",'Domain name (e.g. "example.com")').option("--years <n>","Multiply purchase price by this many years (default 1)").option("--json","Output as JSON").action(domainsPricingCommand);domains.command("buy").description("Buy a domain through Fimo. Creates a checkout invoice; no charge until you pay it in the browser.").argument("<domain>",'Domain name to register (e.g. "example.com")').option("--years <n>","Years to register for (default uses the TLD minimum)").option("--auto-renew","Enable auto-renewal (default)").option("--no-auto-renew","Disable auto-renewal \u2014 domain will not renew automatically").option("-y, --yes","Skip the interactive confirmation prompt").option("--open","Open the checkout URL in your browser after creating the invoice").option("--wait [duration]","Poll until payment completes and registration succeeds").option("--org <organizationId>","Organization ID (defaults to the current project's org)").option("-C, --cwd <dir>","Project directory used to resolve the org").option("--json","Output the resulting invoice record as JSON").action(domainsBuyCommand);domains.command("owned").description("List domains your organization has registered through Fimo").option("--org <organizationId>","Organization ID (defaults to the current project's org)").option("--status <list>",'Filter by status (comma-separated, e.g. "owned,pending_payment")').option("--limit <n>","Truncate to the first N results").option("-C, --cwd <dir>","Project directory used to resolve the org").option("--json","Output as JSON").action(domainsOwnedCommand);var scripts=program.command("scripts",{hidden:!0}).description("Internal/advanced primitives. Most users want `fimo validate`.");scripts.command("sync-schemas").description("Regenerate TypeScript clients for src/schemas/*.json").option("-C, --cwd <dir>","Project directory").action(syncSchemasCommand);scripts.command("sync-forms").description("Regenerate TypeScript clients for src/forms/*.json").option("-C, --cwd <dir>","Project directory").action(syncFormsCommand);scripts.command("validate-route-metadata").description("Cross-validate src/routes.ts against .fimo/config.json#routes (v4)").option("-C, --cwd <dir>","Project directory").action(validateRouteMetadataCommand);scripts.command("extract-translations").description("Legacy local helper: scan src/ for literal t() label keys").option("-C, --cwd <dir>","Project directory").action(extractTranslationsCommand);scripts.command("lint").description("Lint project files (translation keys + oxlint)").argument("[path]","Single file to lint (omit for whole project)").option("-C, --cwd <dir>","Project directory").action(lintCommand);program.command("export-static",{hidden:!0}).description("Post-build: clean dist/server and *.data files (after react-router build)").option("-C, --cwd <dir>","Project directory").action(exportStaticCommand);program.command("resolve-routes",{hidden:!0}).description("Map changed files back to affected preview routes").argument("[files...]","Changed files to resolve").option("-C, --cwd <dir>","Project directory").action(resolveRoutesCommand);var branchCmd=program.command("branch").description("List, create, or delete envs (multi-surface env = git branch + per-env Neon DB + sandbox)").argument("[name]","Env name (omit to list)").option("-v, --verbose","Show preview URLs + deleted envs").option("--all","Also list Fimo's own agent envs (task/*), normally hidden").option("-d, --delete","Delete the named env (drops sandbox + Neon branch + R2 prefix)").option("--from <env>","Parent env to fork from when creating (defaults to current)").action(async(name,_options,command)=>{if(!name){await branchListCommand(command);return}if(command.opts().delete){await branchDeleteCommand(name,command);return}await branchCreateCommand(name,command)});program.command("checkout").description("Switch to an env (or create + switch with -b)").argument("<name>","Env name").option("-b, --create","Create the env if it does not exist").option("--from <env>","Parent env (only with -b)").action(checkoutCommand);program.command("switch").description("Alias for `fimo checkout` (switch envs)").argument("<name>","Env name").action(checkoutCommand);program.command("pull").description("Sync the current env's data plane from its parent").option("--from <env>","Sync from an explicit ancestor (defaults to declared parent)").action(pullCommand);program.command("diff").description("Two-env diff across all surfaces").argument("[from]","From env (defaults to current env)").argument("[to]","To env (defaults to main)").option("-C, --cwd <dir>","Project directory").option("--surface <name>","Limit to a single surface (code | schemas | content | ...)").option("--key <key>","Drill into one item within --surface (W2 \u2014 per-item before/after)").option("--all","Render the full item list, bypassing the per-surface cap").option("--json","Emit raw JSON instead of the rendered report").option("--no-color","Disable ANSI colour output").action(diffCommand);program.command("merge").description("Merge another env into the current one (multi-surface, atomic, with conflict resolver)").argument("<from>","Source env").option("-C, --cwd <dir>","Project directory").option("--allow-direct-merge","Override the main-branch protected-flow gate").option("-y, --yes","Accept parent-wins for every conflict (non-interactive)").option("--resume","Resume an in-flight merge from its persisted draft (W3.6)").option("--json","Emit raw JSON instead of the rendered report").option("--no-color","Disable ANSI colour output").action(mergeCommand);program.command("publish").description("Tag main@HEAD as release/<version> + trigger prod swap").option("-C, --cwd <dir>","Project directory").option("--version <ver>","Semver version for the release (e.g. 1.4.2)").option("--notes <text>","Optional release notes (markdown)").option("--skip-validate","Skip the lint + codegen + smoke pre-checks (operator override)").action(publishCommand);program.command("status").description("Multi-surface env status \u2014 the showcase command").option("-C, --cwd <dir>","Project directory").option("--short","One-line summary per surface (no bodies)").option("--json","Emit raw JSON instead of the rendered report").option("--vs <env>","Comparison target (defaults to the parent env or main)").option("--no-color","Disable ANSI colour output").option("--code","Limit to the code surface").option("--content","Limit to the content surface").option("--i18n","Limit to the translations surface").option("--assets","Limit to the assets surface").option("--forms","Limit to the forms surface").option("--all","Render the full item list, bypassing the per-surface cap").action(statusCommand2);registerAgentsCommands(program);registerPreviewCommands(program);program.addCommand(new Command("git-credential").argument("<operation>","get | store | erase (git credential protocol)").description("Internal git credential helper (invoked by git)").action(gitCredentialCommand),{hidden:!0});registerGenerate(program);registerMediaTaskCommands(program);var schemas2=program.command("schemas").description("Manage content-type schemas");schemas2.command("list").description("List all registered schemas").option("-C, --cwd <dir>","Project directory").action(schemaListCommand);schemas2.command("get").description("Get a schema by type name").argument("<typeName>","Content type name (e.g. BlogPost)").option("-C, --cwd <dir>","Project directory").action(schemaGetCommand);schemas2.command("push").description("Push schema JSON files to the API (create or update)").argument("[typeName]","Schema name to push (omit to push all)").option("-C, --cwd <dir>","Project directory").option("--rename <from=to>","Preserve a renamed field (repeatable, supports nested paths)",(value,previous)=>[...previous,value],[]).action(schemaPushCommand);schemas2.command("delete").description("Delete a schema by type name").argument("<typeName>","Content type name").option("-C, --cwd <dir>","Project directory").action(schemaDeleteCommand);var entries=program.command("entries").description("Manage content entries");entries.command("list").description("List entries of a content type").argument("<typeName>","Content type name").option("-C, --cwd <dir>","Project directory").option("--limit <n>","Max entries to return").option("--offset <n>","Offset for pagination").option("--search <query>","Search query").option("--where <json>",`JSON filter object, e.g. '{"featured":true}'`).option("--sort <field>","Sort field, prefix with - for descending").option("--fields <fields>","Comma-separated fields to return, e.g. slug,title,excerpt").option("--populate <fields>","Comma-separated reference fields to populate, e.g. author,contributors").option("--locale <locale>","Locale to list (default en)").option("--sort-by <field>","Sort field").option("--sort-direction <dir>","Sort direction (asc|desc)").action(entriesListCommand);entries.command("get").description("Get a single entry").argument("<typeName>","Content type name").argument("<id>","Entry ID").option("-C, --cwd <dir>","Project directory").option("--locale <locale>","Entry locale (defaults to the project locale)").action(entriesGetCommand);entries.command("create").description("Create a new entry").argument("<typeName>","Content type name").option("-C, --cwd <dir>","Project directory").requiredOption("--body <json>","Entry JSON body (slug + data)").option("--locale <locale>","Entry locale (default en)").option("--document-id <id>","Document ID shared by localized variants").action(entriesCreateCommand);entries.command("update").description("Update an existing entry").argument("<typeName>","Content type name").argument("<id>","Entry ID").option("-C, --cwd <dir>","Project directory").requiredOption("--body <json>","Updated entry JSON body").option("--locale <locale>","Entry locale (defaults to the project locale)").action(entriesUpdateCommand);entries.command("delete").description("Delete an entry").argument("<typeName>","Content type name").argument("<id>","Entry ID").option("-C, --cwd <dir>","Project directory").option("--locale <locale>","Entry locale (defaults to the project locale)").action(entriesDeleteCommand);entries.command("query").description("Run a read-only SQL query over the entries table").option("-C, --cwd <dir>","Project directory").option("--sql <query>","SQL SELECT query").option("--file <path>","Read the SQL query from a file").option("--stdin","Read the SQL query from stdin").action(entriesQueryCommand);entries.command("bulk-create").description("Create multiple entries").argument("<typeName>","Content type name").option("-C, --cwd <dir>","Project directory").option("--body <json>","JSON array of entry bodies").option("--file <path>","Read entry bodies from a JSON file").option("--stdin","Read entry bodies from stdin").action(entriesBulkCreateCommand);entries.command("bulk-update").description("Update multiple entries").argument("<typeName>","Content type name").option("-C, --cwd <dir>","Project directory").option("--ids <ids>","Comma-separated IDs").option("--where <json>",`JSON filter object, e.g. '{"status":"draft"}'`).option("--body <json>","Updated entry JSON body").option("--file <path>","Read per-entry updates from a JSON file").option("--stdin","Read per-entry updates from stdin").action(entriesBulkUpdateCommand);entries.command("bulk-delete").description("Delete multiple entries").argument("<typeName>","Content type name").option("-C, --cwd <dir>","Project directory").option("--ids <ids>","Comma-separated IDs").option("--where <json>",`JSON filter object, e.g. '{"archived":true}'`).option("--locale <locale>","Entry locale (defaults to the project locale)").action(entriesBulkDeleteCommand);var singles=program.command("singles").description("Manage single content types");singles.command("get").description("Get a Single").argument("<typeName>","Single type name").option("-C, --cwd <dir>","Project directory").option("--locale <locale>","Single locale (defaults to the project locale)").option("--populate <fields>","Comma-separated reference fields to populate").action(singlesGetCommand);singles.command("update").description("Update a Single").argument("<typeName>","Single type name").option("-C, --cwd <dir>","Project directory").option("--body <json>","Updated Single JSON body").option("--file <path>","Read the updated Single JSON body from a file").option("--stdin","Read the updated Single JSON body from stdin").option("--locale <locale>","Single locale (defaults to the project locale)").action(singlesUpdateCommand);var assets2=program.command("assets").description("Manage media assets");assets2.command("list").description("List assets").option("-C, --cwd <dir>","Project directory").option("--parent-id <id>","Filter by parent folder").option("--search <query>","Search across name, alt text, caption, and AI-generated alt / caption (case-insensitive)").option("--type <type>","Filter by entry type (file|folder)").option("--image","Filter to image MIME types (shortcut for --mime-prefix image/)").option("--video","Filter to video MIME types (shortcut for --mime-prefix video/)").option("--audio","Filter to audio MIME types (shortcut for --mime-prefix audio/)").option("--mime-prefix <prefix>",'Filter by MIME type prefix (e.g. "image/png")').option("--sort-by <field>","Sort field").option("--limit <n>","Max results").option("--offset <n>","Offset").action(assetsListCommand);assets2.command("upload").description("Upload a file to the media library").argument("<file>","Path to the file to upload").option("-C, --cwd <dir>","Project directory").option("--name <name>","Asset display name").option("--parent-id <id>","Target folder ID").option("--folder-path <path>","Target folder path, creating missing folders").action(assetsUploadCommand);var modelsCmd=new Command("models").description("Browse available media generation models");program.addCommand(modelsCmd,{hidden:!0});modelsCmd.command("list").description("List Fal models enabled for this project").option("-C, --cwd <dir>","Project directory").option("--modality <m>","Filter by modality (image | video | audio)").option("--search <query>","Search names and descriptions").option("--category <category>","Filter by Fal media category").option("--tag <t>","Filter by tag (repeatable; AND semantics \u2014 model must have every tag)",(value,previous)=>[...previous,value],[]).option("--extended","Per-model card: alias, provider, tags, price, best-for, flags").option("--json","Machine-readable JSON output").action(modelsListCommand);modelsCmd.command("show").description("Show a Fal model and its available flags").argument("<key>","Namespaced model id from `fimo models list`").option("-C, --cwd <dir>","Project directory").option("--json","Machine-readable JSON output (includes the per-model flag list)").action(modelsShowCommand);assets2.command("create-folder").description("Create a folder in the media library").argument("<name>","Folder name").option("-C, --cwd <dir>","Project directory").option("--parent-id <id>","Parent folder ID").action(assetsCreateFolderCommand);assets2.command("move").description("Move an asset to a different folder").argument("<id>","Asset ID").option("-C, --cwd <dir>","Project directory").requiredOption("--parent-id <id>",'Target folder ID (use "null" for root)').action(assetsMoveCommand);assets2.command("delete").description("Delete an asset").argument("<id>","Asset ID").option("-C, --cwd <dir>","Project directory").action(assetsDeleteCommand);assets2.command("open").description("Fetch asset metadata; optionally download locally or open in default viewer").argument("<id>","Asset ID").option("-C, --cwd <dir>","Project directory").option("--download","Download the asset bytes to a local file and print the path").option("--browser","Open the asset URL in the OS default viewer (open / xdg-open / start)").option("--path <path>","Override download destination (default: <tmpdir>/fimo-assets/<id>.<ext>). Implies --download.").action((id,options,cmd)=>(options.path&&!options.download&&(options.download=!0),assetsOpenCommand(id,options,cmd)));var forms2=program.command("forms").description("Manage forms");forms2.command("list").description("List all forms").option("-C, --cwd <dir>","Project directory").action(formsListCommand);forms2.command("get").description("Get a form by ID").argument("<id>","Form ID").option("-C, --cwd <dir>","Project directory").action(formsGetCommand);forms2.command("push").description("Push form JSON files to the API (create or update, patches id back)").argument("[formName]","Form name to push (omit to push all)").option("-C, --cwd <dir>","Project directory").action(formsPushCommand);forms2.command("delete").description("Delete a form").argument("<id>","Form ID").option("-C, --cwd <dir>","Project directory").action(formsDeleteCommand);var supportedAgentsHelp=`
|
|
1409
1409
|
Supported agents:
|
|
1410
1410
|
Universal (always covered via AGENTS.md, no per-agent file needed):
|
|
1411
1411
|
Codex, OpenCode, Aider, and other AGENTS.md-native tools
|
|
@@ -44,5 +44,5 @@ export function FimoScripts() {
|
|
|
44
44
|
// @ts-ignore - import.meta.env is a Vite feature
|
|
45
45
|
const previewScriptUrl = import.meta.env.VITE_PREVIEW_SCRIPT_URL;
|
|
46
46
|
const siteSchemas = buildSiteSchemas();
|
|
47
|
-
return (_jsxs(_Fragment, { children: [runtime ? _jsx("script", { type: "module", dangerouslySetInnerHTML: { __html: runtime } }) : null, previewScriptUrl ? _jsx("script", { src: previewScriptUrl }) : null, siteSchemas.map((schema, index) => (_jsx("script", { type: "application/ld+json", dangerouslySetInnerHTML: { __html: JSON.stringify(schema) } }, index)))] }));
|
|
47
|
+
return (_jsxs(_Fragment, { children: [runtime ? _jsx("script", { type: "module", dangerouslySetInnerHTML: { __html: runtime } }) : null, previewScriptUrl ? _jsx("script", { src: previewScriptUrl, defer: true }) : null, siteSchemas.map((schema, index) => (_jsx("script", { type: "application/ld+json", dangerouslySetInnerHTML: { __html: JSON.stringify(schema) } }, index)))] }));
|
|
48
48
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export declare const TEMPLATE_FRAMEWORKS: readonly ['react-router', '
|
|
1
|
+
export declare const TEMPLATE_FRAMEWORKS: readonly ['react-router', 'nextjs'];
|
|
2
2
|
export type TemplateFramework = (typeof TEMPLATE_FRAMEWORKS)[number];
|
|
3
3
|
export declare const DEFAULT_TEMPLATE: TemplateFramework;
|
|
4
4
|
/**
|
|
@@ -27,7 +27,7 @@ const MODULE_DIR = path.dirname(fileURLToPath(import.meta.url));
|
|
|
27
27
|
const PACKAGE_ROOT = path.resolve(MODULE_DIR, '..', '..');
|
|
28
28
|
const RELEASE_FILE = path.join(PACKAGE_ROOT, 'release.json');
|
|
29
29
|
const PACKAGE_JSON_FILE = path.join(PACKAGE_ROOT, 'package.json');
|
|
30
|
-
export const TEMPLATE_FRAMEWORKS = ['react-router', '
|
|
30
|
+
export const TEMPLATE_FRAMEWORKS = ['react-router', 'nextjs'];
|
|
31
31
|
export const DEFAULT_TEMPLATE = 'react-router';
|
|
32
32
|
/**
|
|
33
33
|
* Absolute path to the requested framework's template directory.
|
package/package.json
CHANGED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# Fimo project
|
|
2
|
+
|
|
3
|
+
This is a Fimo project. Fimo connects content, media, forms, analytics, editing, environments, and hosting to this Next.js application.
|
|
4
|
+
|
|
5
|
+
## Load the Fimo skills before doing Fimo work
|
|
6
|
+
|
|
7
|
+
Load only the skill relevant to the task:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pnpm exec fimo skills get fimo-code # code and framework APIs from this project runtime
|
|
11
|
+
npx fimo@latest skills get fimo-cli # operational workflows: push, deploy, labels, domains
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
Use the command that matches the project lockfile. Add `--ref <doc>` for one reference at a time. For Next.js code, start with `fimo-code --ref frameworks/next`, then load the App Router, Pages Router, or locale reference only when needed.
|
|
15
|
+
|
|
16
|
+
## Never hardcode editable values
|
|
17
|
+
|
|
18
|
+
- **Content**: declare a schema, push it, use its generated client, and render with `fimo/next` or `fimo/next/client`.
|
|
19
|
+
- **Strings**: use labels and `t('key')`.
|
|
20
|
+
- **Media**: use the active framework adapter's `Image` / `Video` primitives.
|
|
21
|
+
- **Forms**: use the generated Zod schema and submit helper.
|
|
22
|
+
|
|
23
|
+
The scaffolded homepage is disposable. Replace it on the first real generation.
|
|
24
|
+
|
|
25
|
+
## Development loop
|
|
26
|
+
|
|
27
|
+
1. Start the application with the project package manager (`pnpm dev`, `npm run dev`, `yarn dev`, or `bun dev`).
|
|
28
|
+
2. Build and verify against the local server.
|
|
29
|
+
3. Offer `fimo deploy` for a hosted preview or `fimo deploy --publish` to go live. Deploy only after the developer confirms.
|
|
30
|
+
|
|
31
|
+
## Project rules
|
|
32
|
+
|
|
33
|
+
- The application owns routes, locale resolution, links, HTML language/direction, and SEO. Fimo connects to those decisions.
|
|
34
|
+
- Do not add a second deployment platform.
|
|
35
|
+
- Never edit `.fimo/project.json`; it links this directory to the remote project.
|
|
36
|
+
- Keep secrets in the Fimo dashboard, not in committed environment files.
|
|
37
|
+
- Pass flags to interactive Fimo commands when scripting them.
|
|
38
|
+
|
|
39
|
+
<!-- BEGIN:nextjs-agent-rules -->
|
|
40
|
+
|
|
41
|
+
# This is NOT the Next.js you know
|
|
42
|
+
|
|
43
|
+
This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices.
|
|
44
|
+
|
|
45
|
+
This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean.
|
|
46
|
+
|
|
47
|
+
<!-- END:nextjs-agent-rules -->
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "fimo-template",
|
|
3
|
+
"version": "0.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"scripts": {
|
|
7
|
+
"dev": "next dev",
|
|
8
|
+
"build": "next build",
|
|
9
|
+
"start": "next start",
|
|
10
|
+
"lint": "oxlint --deny-warnings",
|
|
11
|
+
"typecheck": "next typegen && tsc --noEmit"
|
|
12
|
+
},
|
|
13
|
+
"dependencies": {
|
|
14
|
+
"@tanstack/react-query": "^5.80.6",
|
|
15
|
+
"fimo": "latest",
|
|
16
|
+
"next": "^16.3.0",
|
|
17
|
+
"react": "^19.2.7",
|
|
18
|
+
"react-dom": "^19.2.7"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@types/node": "^24.12.0",
|
|
22
|
+
"@types/react": "^19.2.14",
|
|
23
|
+
"@types/react-dom": "^19.2.3",
|
|
24
|
+
"oxlint": "^1.55.0",
|
|
25
|
+
"typescript": "7.0.2"
|
|
26
|
+
},
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=22.22.0"
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
color-scheme: light;
|
|
3
|
+
font-family: Arial, Helvetica, sans-serif;
|
|
4
|
+
background: #f7f7f5;
|
|
5
|
+
color: #1a1a1a;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
* {
|
|
9
|
+
box-sizing: border-box;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
body {
|
|
13
|
+
margin: 0;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
main {
|
|
17
|
+
min-height: 100vh;
|
|
18
|
+
display: grid;
|
|
19
|
+
align-content: center;
|
|
20
|
+
gap: 1rem;
|
|
21
|
+
max-width: 48rem;
|
|
22
|
+
padding: 3rem;
|
|
23
|
+
margin: 0 auto;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
h1,
|
|
27
|
+
p {
|
|
28
|
+
margin: 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
h1 {
|
|
32
|
+
font-size: clamp(2.75rem, 8vw, 5.5rem);
|
|
33
|
+
line-height: 0.95;
|
|
34
|
+
letter-spacing: -0.06em;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
p {
|
|
38
|
+
max-width: 38rem;
|
|
39
|
+
font-size: 1.125rem;
|
|
40
|
+
line-height: 1.6;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.eyebrow {
|
|
44
|
+
font-size: 0.75rem;
|
|
45
|
+
font-weight: 700;
|
|
46
|
+
letter-spacing: 0.12em;
|
|
47
|
+
text-transform: uppercase;
|
|
48
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { FimoProvider } from 'fimo/next/client';
|
|
2
|
+
import type { ReactNode } from 'react';
|
|
3
|
+
|
|
4
|
+
import './globals.css';
|
|
5
|
+
|
|
6
|
+
export default function RootLayout({ children }: Readonly<{ children: ReactNode }>) {
|
|
7
|
+
const previewScriptUrl = process.env.NEXT_PUBLIC_FIMO_PREVIEW_SCRIPT_URL;
|
|
8
|
+
|
|
9
|
+
return (
|
|
10
|
+
<html lang="en">
|
|
11
|
+
<body>
|
|
12
|
+
<FimoProvider>{children}</FimoProvider>
|
|
13
|
+
{previewScriptUrl ? <script src={previewScriptUrl} defer /> : null}
|
|
14
|
+
</body>
|
|
15
|
+
</html>
|
|
16
|
+
);
|
|
17
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"compilerOptions": {
|
|
3
|
+
"target": "ES2022",
|
|
4
|
+
"lib": ["dom", "dom.iterable", "esnext"],
|
|
5
|
+
"allowJs": false,
|
|
6
|
+
"skipLibCheck": true,
|
|
7
|
+
"strict": true,
|
|
8
|
+
"noEmit": true,
|
|
9
|
+
"esModuleInterop": true,
|
|
10
|
+
"module": "esnext",
|
|
11
|
+
"moduleResolution": "bundler",
|
|
12
|
+
"resolveJsonModule": true,
|
|
13
|
+
"isolatedModules": true,
|
|
14
|
+
"jsx": "react-jsx",
|
|
15
|
+
"incremental": true,
|
|
16
|
+
"plugins": [{ "name": "next" }],
|
|
17
|
+
"paths": {
|
|
18
|
+
"@/*": ["./src/*"]
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"include": ["next-env.d.ts", ".next/types/**/*.ts", ".next/dev/types/**/*.ts", "**/*.ts", "**/*.tsx"],
|
|
22
|
+
"exclude": ["node_modules"]
|
|
23
|
+
}
|