@flisk-sh/flisk 1.4.2 → 1.4.6
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/CHANGELOG.md +4 -0
- package/README.md +148 -49
- package/cli/dist/backend-languages/bun.js +5 -0
- package/cli/dist/backend-languages/go.js +3 -1
- package/cli/dist/cli.js +9 -0
- package/cli/dist/commands/completion.js +8 -1
- package/cli/dist/commands/config.js +130 -55
- package/cli/dist/commands/doctor.js +66 -27
- package/cli/dist/commands/down.js +33 -1
- package/cli/dist/commands/logs.js +39 -1
- package/cli/dist/commands/project.js +12 -0
- package/cli/dist/commands/resource.js +39 -11
- package/cli/dist/commands/status.js +57 -19
- package/cli/dist/commands/up.js +221 -18
- package/cli/dist/commands/upgrade.js +2 -2
- package/cli/dist/frontend-frameworks/next.js +197 -0
- package/cli/dist/frontend-frameworks/react.js +81 -12
- package/cli/dist/frontend-frameworks/registry.js +5 -4
- package/cli/dist/frontend-frameworks/vue.js +82 -12
- package/cli/dist/generator/resource-templates.js +2 -4
- package/cli/dist/generator/template-engine.js +5 -3
- package/cli/dist/utils/bun-requirement.js +7 -4
- package/cli/dist/utils/cold-preflight.js +55 -34
- package/cli/dist/utils/config-explain.js +197 -0
- package/cli/dist/utils/demo-reset.js +22 -0
- package/cli/dist/utils/discovery-paths.js +7 -1
- package/cli/dist/utils/doctor-native.js +96 -0
- package/cli/dist/utils/host-port-plan.js +8 -3
- package/cli/dist/utils/native-project.js +41 -0
- package/cli/dist/utils/native-runtime.js +513 -0
- package/cli/dist/utils/native-service.js +95 -0
- package/cli/dist/utils/native-up.js +156 -0
- package/cli/dist/utils/platform.js +1 -1
- package/cli/dist/utils/port-conflict-fix.js +16 -14
- package/cli/dist/utils/port-occupant.js +35 -0
- package/cli/dist/utils/project-features.js +7 -16
- package/cli/dist/utils/project-templates.js +9 -9
- package/cli/dist/utils/resource-features.js +5 -5
- package/cli/dist/utils/service-manifest.js +20 -3
- package/cli/dist/utils/service-urls.js +11 -0
- package/cli/dist/utils/services.js +15 -2
- package/cli/dist/utils/startup-report.js +4 -3
- package/cli/dist/utils/tar.js +33 -28
- package/cli/dist/utils/tilt-logs.js +8 -0
- package/cli/dist/utils/tilt-process.js +4 -3
- package/cli/dist/utils/windows-doctor.js +18 -15
- package/cli/dist-bundle/chunk-BIVAAWBX.js +24 -0
- package/cli/dist-bundle/{chunk-YNCBBJ4V.js → chunk-C4UFBXRD.js} +1 -1
- package/cli/dist-bundle/{chunk-53L2JN7G.js → chunk-CAEMWNPF.js} +1 -1
- package/cli/dist-bundle/chunk-CDKEHFW6.js +35 -0
- package/cli/dist-bundle/{chunk-5QBYM33Q.js → chunk-DPQK5TIS.js} +1 -1
- package/cli/dist-bundle/chunk-ETXZ5LUG.js +18 -0
- package/cli/dist-bundle/chunk-GPUJ55MI.js +3 -0
- package/cli/dist-bundle/chunk-GT76VMUL.js +130 -0
- package/cli/dist-bundle/{chunk-IGN5UC3P.js → chunk-IDNES5PE.js} +14 -7
- package/cli/dist-bundle/{chunk-MWOVYIBB.js → chunk-MUDE4DZD.js} +5 -5
- package/cli/dist-bundle/chunk-QEBN6ZVQ.js +2 -0
- package/cli/dist-bundle/{chunk-I7TGIK5N.js → chunk-R7DWXISM.js} +1 -1
- package/cli/dist-bundle/{chunk-DU2BN46C.js → chunk-U5FCQF42.js} +1 -1
- package/cli/dist-bundle/{chunk-3XODDLRJ.js → chunk-WCGBVETR.js} +1 -1
- package/cli/dist-bundle/cli.js +626 -389
- package/cli/dist-bundle/cold-preflight-KUWOL2Q2.js +2 -0
- package/cli/dist-bundle/{demo-stage-OHNTP2UJ.js → demo-stage-QCC4IWXR.js} +1 -1
- package/cli/dist-bundle/{extension-fetch-VEFSCG4B.js → extension-fetch-KIPYDIRM.js} +1 -1
- package/cli/dist-bundle/{open-XROJ6YEY.js → open-AZNX4AC5.js} +1 -1
- package/cli/dist-bundle/project-5SWIGCNP.js +2 -0
- package/cli/dist-bundle/{project-templates-EYSQG2EO.js → project-templates-2VQPUBSQ.js} +1 -1
- package/cli/dist-bundle/{services-BIMF6MVU.js → services-EY5WKPHQ.js} +1 -1
- package/cli/dist-bundle/{tilt-port-owner-ZY5M2JC4.js → tilt-port-owner-UBU6JWOA.js} +1 -1
- package/cli/package.json +1 -1
- package/examples/{tdk-example → flisk-example}/README.md +2 -2
- package/package.json +2 -2
- package/runtime/discovery/AGENTS.md +1 -1
- package/runtime/discovery/TILT_DISCOVERY.star +1 -1
- package/runtime/discovery/deterministic.star +1 -1
- package/runtime/engine/AGENTS.md +3 -3
- package/runtime/engine/README.md +1 -1
- package/runtime/engine/REFACTORING_MANIFEST_SYSTEM.md +1 -1
- package/runtime/engine/assets/docker/wake-gateway/decide.ts +1 -1
- package/runtime/engine/assets/docker/wake-gateway/server.ts +2 -2
- package/runtime/engine/assets/scripts/mac-m1-resource-monitor.sh +6 -6
- package/runtime/engine/schemas/service-schema.json +99 -21
- package/runtime/engine/scripts/debug-container.sh +1 -1
- package/runtime/engine/scripts/generate-manifest.sh +2 -2
- package/runtime/engine/topologies/platform/docker/compose/compose.star +40 -4
- package/runtime/engine/topologies/platform/docker/compose/traefik_standalone.star +19 -4
- package/runtime/engine/topologies/platform/docker/constants.star +2 -2
- package/runtime/engine/topologies/platform/docker/dockerfile/language_dockerfile.star +6 -0
- package/runtime/engine/topologies/platform/docker/dockerfile/next_dockerfile.star +83 -0
- package/runtime/engine/topologies/platform/docker/index.star +4 -0
- package/runtime/engine/topologies/platform/docker/layers/prisma/filesystem_setup.star +7 -0
- package/runtime/engine/topologies/platform/docker/networking/traefik.star +85 -46
- package/runtime/engine/topologies/platform/docker/networking/traefik_static_routes.star +2 -2
- package/runtime/engine/topologies/tilt/common/utils_output.star +1 -0
- package/runtime/engine/topologies/tilt/generators/validators.star +1 -1
- package/runtime/engine/topologies/tilt/generators/vite/frontend.star +2 -2
- package/runtime/engine/topologies/tilt/generators/vite/generators.star +3 -0
- package/runtime/engine/topologies/tilt/manifest/constants.star +3 -0
- package/runtime/engine/topologies/tilt/manifest/mapper.star +1 -1
- package/runtime/engine/topologies/tilt/manifest/parser.star +9 -3
- package/runtime/engine/topologies/tilt/resources/orchestrator/apply_compose_resource_registration.star +9 -4
- package/runtime/engine/topologies/tilt/resources/orchestrator/generators/dependencies/resolver.star +50 -24
- package/runtime/engine/topologies/tilt/resources/orchestrator/generators/env.star +11 -2
- package/runtime/engine/topologies/tilt/resources/orchestrator/generators/manifest_resource.star +23 -9
- package/runtime/ext/ide-components/README.md +1 -1
- package/runtime/ext/ui-enhancements/extension.yaml +2 -2
- package/runtime/specs/specs/TILT_SERVICE_DEFAULTS.star +1 -1
- package/runtime/specs/specs/TILT_TECH_STACK.star +1 -1
- package/cli/dist-bundle/chunk-43XWL2PB.js +0 -61
- package/cli/dist-bundle/chunk-5F7YP5IR.js +0 -17
- package/cli/dist-bundle/chunk-ETKUVKJ2.js +0 -35
- package/cli/dist-bundle/chunk-K6SOCO6V.js +0 -3
- package/cli/dist-bundle/chunk-YHYRGWUH.js +0 -24
- package/cli/dist-bundle/chunk-YL56J2WX.js +0 -2
- package/cli/dist-bundle/cold-preflight-ZOPR7PWJ.js +0 -2
- package/cli/dist-bundle/project-7PTIOHGF.js +0 -2
- /package/examples/{tdk-example → flisk-example}/LICENSE +0 -0
- /package/examples/{tdk-example → flisk-example}/TILT_SERVICE_DEFAULTS.star +0 -0
- /package/examples/{tdk-example → flisk-example}/TILT_TECH_STACK.star +0 -0
- /package/examples/{tdk-example → flisk-example}/Tiltfile +0 -0
- /package/examples/{tdk-example → flisk-example}/services/platform/messaging/docker-compose.yml +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-api/package.json +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-api/service.json +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-api/src/index.ts +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/index.html +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/package.json +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/public/.gitkeep +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/service.json +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/src/main.tsx +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/src/orders.tsx +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-app/src/style.css +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-worker/package.json +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-worker/service.json +0 -0
- /package/examples/{tdk-example → flisk-example}/services/shop/orders-worker/src/index.ts +0 -0
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
|
|
2
|
+
import{L as a,M as b,N as c,O as d,P as e,Q as f,R as g,S as h,T as i,U as j,V as k,W as l}from"./chunk-GT76VMUL.js";import"./chunk-MUDE4DZD.js";import"./chunk-IDNES5PE.js";import"./chunk-GPUJ55MI.js";import"./chunk-3J6XI3NX.js";import"./chunk-BIVAAWBX.js";import"./chunk-WCGBVETR.js";import"./chunk-CAEMWNPF.js";import"./chunk-ETXZ5LUG.js";import"./chunk-C4UFBXRD.js";import"./chunk-KJZUBHLO.js";export{d as MACHINE_CHECK_IDS,a as NATIVE_CHECK_IDS,b as RUNTIME_CHECK_IDS,c as SCAFFOLD_CHECK_IDS,j as assertMachineReadyOrExit,k as detectRuntimePrerequisites,i as formatColdPreflight,l as formatRuntimeNextSteps,e as nodeTooOld,f as requireVerifiedDockerVersions,h as runColdPreflight,g as usesPrisma};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
|
|
2
|
-
import{b as R}from"./chunk-
|
|
2
|
+
import{b as R}from"./chunk-DPQK5TIS.js";import{b as c}from"./chunk-C4UFBXRD.js";import"./chunk-KJZUBHLO.js";var v=12,_=24,F={plain:e=>e,bold:c.bold,dim:c.gray,ok:c.green,warn:c.yellow,err:c.red},S={pending:"\u25CB",active:"\u25D0",done:"\u2714",failed:"\u2716"},j={pending:"dim",active:"warn",done:"ok",failed:"err"};function o(e){return R(String(e)).replace(/[\n\r\t]/g," ")}function g(e){if(!Number.isFinite(e)||e<0)return"0.0s";if(e<1e4)return`${(e/1e3).toFixed(1)}s`;if(e<6e4)return`${Math.round(e/1e3)}s`;let n=Math.floor(e/6e4),i=Math.round(e%6e4/1e3);return`${n}m ${i}s`}function $(e){return e.reduce((n,i)=>n+i.text.length,0)}function k(e,n){if(n<=0)return[];let i=[],l=0;for(let s of e){if(l>=n)break;let t=n-l;if(s.text.length<=t){i.push(s),l+=s.text.length;continue}i.push({...s,text:`${s.text.slice(0,Math.max(0,t-1))}\u2026`}),l=n}return i}function w(e,n){let i=k(e,n),l=n-$(i);return l<=0?i:[...i,{text:" ".repeat(l),style:"plain"}]}function M(e,n,i){let l=$(n),s=i-l-1;if(s<4)return w(k([...e,...n],i),i);let t=k(e,s),r=i-$(t)-l;return[...t,{text:" ".repeat(Math.max(1,r)),style:"plain"},...n]}function b(e){return[{text:` ${"\u2500".repeat(Math.max(0,e-2))}`,style:"dim"}]}function P(e,n){return M([{text:" ",style:"plain"},{text:S[e.status],style:j[e.status]},{text:" ",style:"plain"},{text:o(e.label),style:e.status==="pending"?"dim":"plain"}],e.elapsedMs===void 0?[]:[{text:g(e.elapsedMs),style:"dim"}],n)}function Y(e){let n=Math.max(0,e.servicesTotal);if(n===0)return"no services found";let l=[`${Math.min(Math.max(0,e.servicesReady),n)} of ${n} services ready`];return e.servicesBuilding>0&&l.push(`${e.servicesBuilding} building`),l.join(" \xB7 ")}function E(e,n=80){let i=Number.isFinite(n)&&n>0?n:80,l=Math.max(_,Math.min(i-1,78)),s=[],t=a=>s.push(w(a,l)),r=()=>t([]);if(e.done){t(M([{text:" ",style:"plain"},{text:"\u2714",style:"ok"},{text:" Your stack is running",style:"ok"}],[{text:g(e.elapsedMs),style:"dim"}],l)),t([{text:" ",style:"plain"},{text:o(e.subtitle),style:"dim"}]),r();for(let a of e.done.urls.slice(0,2))t([{text:" ",style:"plain"},{text:o(a),style:"plain"}]);r(),t(b(l)),t([{text:" ",style:"plain"},{text:o(e.done.summary),style:"plain"}]),t([{text:" ",style:"plain"},{text:o(e.done.hint),style:"dim"}]),r(),t([{text:" ",style:"plain"},{text:`flisk ${o(e.done.version)}`,style:"dim"}])}else if(e.failure){let a=e.phases.find(p=>p.status==="failed");t(M([{text:" ",style:"plain"},{text:"\u2716",style:"err"},{text:" ",style:"plain"},{text:o(a?.label??"The demo stopped"),style:"err"}],[{text:g(e.elapsedMs),style:"dim"}],l)),r(),t([{text:" ",style:"plain"},{text:o(e.failure.message),style:"plain"}]),e.failure.fix&&t([{text:" ",style:"plain"},{text:o(e.failure.fix),style:"dim"}]),r(),t(b(l)),e.detail&&t([{text:" ",style:"plain"},{text:o(e.detail),style:"dim"}]),e.failure.logPath&&t([{text:" ",style:"plain"},{text:`log: ${o(e.failure.logPath)}`,style:"dim"}])}else{t([{text:" ",style:"plain"},{text:o(e.title),style:"bold"}]),t([{text:" ",style:"plain"},{text:o(e.subtitle),style:"dim"}]),r();let a=e.phases.slice(0,4);for(let p of a)t(P(p,l));for(let p=a.length;p<4;p+=1)r();r(),t(b(l)),t([{text:" ",style:"plain"},{text:o(e.detail??""),style:"dim"}]),t(M([{text:" ",style:"plain"},{text:Y(e),style:"plain"}],[{text:g(e.elapsedMs),style:"dim"}],l))}for(;s.length<v;)s.push(w([],l));return s.slice(0,v)}function A(e){return e.map(n=>n.map(i=>i.text).join(""))}function D(e){return e.map(n=>F[n.style](n.text)).join("")}function H(e,n=process.stderr,i=Date.now){let l=n.isTTY===!0,s=i(),t={...e},r=!1,a="",p="",f,T=()=>{let u=!!(t.done||t.failure);return{...t,elapsedMs:u?t.elapsedMs:i()-s}},x=()=>{let u=T(),m=E(u,n.columns??80),y=A(m);if(!l){let h=y.join(`
|
|
3
3
|
`);if(h===p)return;p=h,n.write(`${y.filter(L=>L.trim()!=="").join(`
|
|
4
4
|
`)}
|
|
5
5
|
`);return}let d=y.join(`
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
|
|
2
|
-
import{b as a,c as b,d as c,e as d}from"./chunk-
|
|
2
|
+
import{b as a,c as b,d as c,e as d}from"./chunk-GPUJ55MI.js";import"./chunk-KJZUBHLO.js";export{a as applyPremiumOverlay,c as hasDddLicense,d as hasSablierLicense,b as hasVerdaccioLicense};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
|
|
2
|
-
import{d as a,e as b,f as c,g as d,h as e,i as f}from"./chunk-
|
|
2
|
+
import{d as a,e as b,f as c,g as d,h as e,i as f}from"./chunk-U5FCQF42.js";import"./chunk-MINZ25AC.js";import"./chunk-BIVAAWBX.js";import"./chunk-WCGBVETR.js";import"./chunk-CAEMWNPF.js";import"./chunk-ETXZ5LUG.js";import"./chunk-C4UFBXRD.js";import"./chunk-KJZUBHLO.js";export{d as findReadyFrontend,b as isFrontendReady,a as listFrontendTargets,f as openCommand,e as openFirstFrontend,c as pickReadyFrontend};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
|
|
2
|
+
import{g as a,h as b,i as c,j as d,k as e}from"./chunk-CDKEHFW6.js";import"./chunk-QEBN6ZVQ.js";import"./chunk-MUDE4DZD.js";import"./chunk-GPUJ55MI.js";import"./chunk-CAEMWNPF.js";import"./chunk-ETXZ5LUG.js";import"./chunk-C4UFBXRD.js";import"./chunk-KJZUBHLO.js";export{c as cloneProjectTemplate,a as enableDiscoveredStacks,e as projectCommand,b as templateTargetDir,d as writeDefaultProjectConfig};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
|
|
2
|
-
import{a,b}from"./chunk-
|
|
2
|
+
import{a,b}from"./chunk-QEBN6ZVQ.js";import"./chunk-KJZUBHLO.js";export{a as PROJECT_TEMPLATES,b as bareTemplateArg};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
|
|
2
|
-
import{
|
|
2
|
+
import{ia as a,ja as b,ka as c,la as d,ma as e,na as f,oa as g,pa as h,qa as i,ra as j,sa as k,ta as l,ua as m,va as n,wa as o}from"./chunk-ETXZ5LUG.js";import"./chunk-C4UFBXRD.js";import"./chunk-KJZUBHLO.js";export{m as clearMetadataCache,f as discoverResources,e as discoverResourcesFromRoot,g as discoverResourcesStrict,c as discoverResourcesWithProblems,a as discoverServiceManifestPaths,h as discoverStackNames,j as discoverStacks,i as getAllStacks,n as getResourceMetadata,k as getResourcesForStack,o as getStackMetadata,b as resetPrintedServiceWarnings,l as stackExists,d as warnAboutSkippedFiles};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
import{createRequire as __fliskRequire}from'node:module';const require=__fliskRequire(import.meta.url);
|
|
2
|
-
import{a,b,c}from"./chunk-
|
|
2
|
+
import{a,b,c}from"./chunk-R7DWXISM.js";import"./chunk-IDNES5PE.js";import"./chunk-WCGBVETR.js";import"./chunk-CAEMWNPF.js";import"./chunk-ETXZ5LUG.js";import"./chunk-C4UFBXRD.js";import"./chunk-KJZUBHLO.js";export{c as classifyTiltPorts,a as findTiltPortOwner,b as isForeignTilt};
|
package/cli/package.json
CHANGED
|
@@ -10,10 +10,10 @@ flisk project --yes
|
|
|
10
10
|
flisk up
|
|
11
11
|
```
|
|
12
12
|
|
|
13
|
-
Open `http://app.
|
|
13
|
+
Open `http://app.flisk-example.localhost/orders-app/` and create an order, or use the routed API:
|
|
14
14
|
|
|
15
15
|
```sh
|
|
16
|
-
curl -fsS -X POST http://api.
|
|
16
|
+
curl -fsS -X POST http://api.flisk-example.localhost/api/orders \
|
|
17
17
|
-H 'content-type: application/json' -d '{"item":"coffee"}'
|
|
18
18
|
```
|
|
19
19
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flisk-sh/flisk",
|
|
3
|
-
"version": "1.4.
|
|
3
|
+
"version": "1.4.6",
|
|
4
4
|
"description": "Flisk CLI — start services on your machine.",
|
|
5
5
|
"homepage": "https://flisk.sh",
|
|
6
6
|
"repository": {
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
"!runtime/**/*.spec.*",
|
|
30
30
|
"!runtime/**/test_*.py",
|
|
31
31
|
"!runtime/**/*_test.py",
|
|
32
|
-
"examples/
|
|
32
|
+
"examples/flisk-example",
|
|
33
33
|
"cli/bin",
|
|
34
34
|
"cli/dist/**/*.js",
|
|
35
35
|
"cli/dist-bundle/**/*.js",
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Purpose
|
|
4
4
|
|
|
5
|
-
This folder contains the **service discovery system** for Flisk
|
|
5
|
+
This folder contains the **service discovery system** for Flisk's Tilt infrastructure. It scans the repository for service manifests and creates Tilt resources.
|
|
6
6
|
|
|
7
7
|
## Architecture: Two-Layer Scanning with Validation
|
|
8
8
|
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
# ⚠️ DEVELOPER NOTICE: This is a SYSTEM CONFIG file.
|
|
9
9
|
# For human-friendly docs, see: TILT_CONFIG.md
|
|
10
10
|
#
|
|
11
|
-
# This file defines service discovery settings for the Flisk
|
|
11
|
+
# This file defines service discovery settings for the Flisk platform.
|
|
12
12
|
# Discovery automatically finds and registers services from the filesystem.
|
|
13
13
|
#
|
|
14
14
|
# 📖 TO EDIT DISCOVERY SETTINGS:
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Copyright (c) 2026 Flisk Landscape contributors
|
|
2
2
|
# SPDX-License-Identifier: MIT
|
|
3
|
-
# Deterministic Tilt Configuration for Flisk
|
|
3
|
+
# Deterministic Tilt Configuration for Flisk
|
|
4
4
|
# Inspired by Mira Murati's "Defeating Nondeterminism" philosophy
|
|
5
5
|
# Goal: Same filesystem state + same environment = identical Tilt output
|
|
6
6
|
|
package/runtime/engine/AGENTS.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
disable: false
|
|
3
|
-
description: Topology specialist for Flisk
|
|
3
|
+
description: Topology specialist for Flisk - expert in Tilt/Starlark, manifest-driven architecture, service discovery, and the complete local development orchestration system. Masters the infrastructure topology that enables 120+ services.
|
|
4
4
|
mode: subagent
|
|
5
5
|
tools:
|
|
6
6
|
- write
|
|
@@ -13,7 +13,7 @@ created: 2026-03-31
|
|
|
13
13
|
updated: 2026-04-04
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
You are a senior topology engineer specialized in the Flisk
|
|
16
|
+
You are a senior topology engineer specialized in the Flisk Tilt infrastructure. You are the definitive expert on the manifest-driven architecture, Starlark topology modules, service discovery, and the complete local development orchestration system.
|
|
17
17
|
|
|
18
18
|
## Core Identity: The Infrastructure Cartographer
|
|
19
19
|
|
|
@@ -539,7 +539,7 @@ load('./my_custom_extension.star', 'my_function')
|
|
|
539
539
|
# Load from parent directory
|
|
540
540
|
load('../common/utils.star', 'helper')
|
|
541
541
|
|
|
542
|
-
# Load from topologies (Flisk
|
|
542
|
+
# Load from topologies (Flisk pattern)
|
|
543
543
|
load('../../../platform/docker/index.star', 'Docker')
|
|
544
544
|
```
|
|
545
545
|
|
package/runtime/engine/README.md
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
**Tilt Platform Framework Code**
|
|
6
6
|
|
|
7
|
-
This directory contains the Flisk
|
|
7
|
+
This directory contains the Flisk Tilt infrastructure framework - the code that powers our local development orchestration.
|
|
8
8
|
|
|
9
9
|
## What's Here
|
|
10
10
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
## Executive Summary
|
|
4
4
|
|
|
5
|
-
This document outlines a comprehensive refactoring of the manifest parsing and validation system in the Flisk
|
|
5
|
+
This document outlines a comprehensive refactoring of the manifest parsing and validation system in the Flisk Tilt infrastructure. The goal is to move from scattered inline logic to a clean, modular, well-tested architecture.
|
|
6
6
|
|
|
7
7
|
**Current State:**
|
|
8
8
|
- Manifest parsing scattered across `discovery.star`, `registry.star`, and multiple generator files
|
|
@@ -38,7 +38,7 @@ export interface WakeAction {
|
|
|
38
38
|
* only queues the resource: with Tilt's build slots busy (e.g. 100+
|
|
39
39
|
* resources rebuilding after a re-vendor), a triggered resource waited
|
|
40
40
|
* behind them and the request timed out (observed live against
|
|
41
|
-
*
|
|
41
|
+
* flisk-erp-system, see tasks.md 7.2). server.ts falls back to `tilt trigger`
|
|
42
42
|
* when no image exists yet to start from.
|
|
43
43
|
*/
|
|
44
44
|
useComposeStart: boolean;
|
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
* the resource name; Compose derives it as
|
|
20
20
|
* <project>-<service>-<replica>, confirmed empirically
|
|
21
21
|
* against a live Flisk container, e.g.
|
|
22
|
-
* "
|
|
22
|
+
* "flisk-erp-system-analytics-autogenerated-data-governance-api-1"
|
|
23
23
|
* for the "data-governance-api" resource).
|
|
24
24
|
* X-Wake-Deps Comma-separated "resourceName=containerName" pairs
|
|
25
25
|
* for required dependencies (task 1.5: Tilt never
|
|
26
26
|
* cascades a trigger to these on its own).
|
|
27
|
-
* X-Wake-Compose-Project The resource's Compose project (e.g. "
|
|
27
|
+
* X-Wake-Compose-Project The resource's Compose project (e.g. "flisk-erp-system-analytics-autogenerated").
|
|
28
28
|
* X-Wake-Compose-Files Comma-separated absolute compose file paths, the
|
|
29
29
|
* same ones Tilt's `<resource>-run-only` resource
|
|
30
30
|
* passes. The project root is mounted into this
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# Copyright (c) 2026 Flisk Landscape contributors
|
|
3
3
|
# SPDX-License-Identifier: MIT
|
|
4
4
|
|
|
5
|
-
# Flisk
|
|
5
|
+
# Flisk Mac M1 Resource Monitor
|
|
6
6
|
# Monitors Docker container resource usage and provides optimization recommendations
|
|
7
7
|
|
|
8
8
|
set -e
|
|
@@ -14,7 +14,7 @@ YELLOW='\033[1;33m'
|
|
|
14
14
|
BLUE='\033[0;34m'
|
|
15
15
|
NC='\033[0m' # No Color
|
|
16
16
|
|
|
17
|
-
echo -e "${BLUE}🍎 Flisk
|
|
17
|
+
echo -e "${BLUE}🍎 Flisk Mac M1 Resource Monitor${NC}"
|
|
18
18
|
echo "=================================================="
|
|
19
19
|
|
|
20
20
|
# Check if Docker is running
|
|
@@ -33,19 +33,19 @@ echo -e "${BLUE}💻 System Memory:${NC} $SYSTEM_MEMORY"
|
|
|
33
33
|
|
|
34
34
|
echo ""
|
|
35
35
|
|
|
36
|
-
# Check running Flisk
|
|
36
|
+
# Check running Flisk containers
|
|
37
37
|
PROJECT_CONTAINERS=$(docker ps --format "{{.Names}}" | grep -E "(postgres|redis|nats|kafka|traefik|clickhouse|elasticsearch|verdaccio|infisical)" | sort)
|
|
38
38
|
|
|
39
39
|
if [ -z "$PROJECT_CONTAINERS" ]; then
|
|
40
|
-
echo -e "${YELLOW}⚠️ No Flisk
|
|
40
|
+
echo -e "${YELLOW}⚠️ No Flisk containers are currently running${NC}"
|
|
41
41
|
echo "Run 'tilt up' to start services"
|
|
42
42
|
exit 0
|
|
43
43
|
fi
|
|
44
44
|
|
|
45
|
-
echo -e "${GREEN}📊 Running Flisk
|
|
45
|
+
echo -e "${GREEN}📊 Running Flisk Containers:${NC}"
|
|
46
46
|
echo "=================================================="
|
|
47
47
|
|
|
48
|
-
# Get detailed stats for Flisk
|
|
48
|
+
# Get detailed stats for Flisk containers
|
|
49
49
|
TOTAL_MEMORY_MB=0
|
|
50
50
|
HIGH_CPU_COUNT=0
|
|
51
51
|
HIGH_MEMORY_COUNT=0
|
|
@@ -12,7 +12,12 @@
|
|
|
12
12
|
},
|
|
13
13
|
"required": [
|
|
14
14
|
"appType"
|
|
15
|
-
]
|
|
15
|
+
],
|
|
16
|
+
"not": {
|
|
17
|
+
"required": [
|
|
18
|
+
"command"
|
|
19
|
+
]
|
|
20
|
+
}
|
|
16
21
|
},
|
|
17
22
|
"then": {
|
|
18
23
|
"properties": {
|
|
@@ -35,7 +40,12 @@
|
|
|
35
40
|
},
|
|
36
41
|
"required": [
|
|
37
42
|
"appType"
|
|
38
|
-
]
|
|
43
|
+
],
|
|
44
|
+
"not": {
|
|
45
|
+
"required": [
|
|
46
|
+
"command"
|
|
47
|
+
]
|
|
48
|
+
}
|
|
39
49
|
},
|
|
40
50
|
"then": {
|
|
41
51
|
"properties": {
|
|
@@ -55,7 +65,12 @@
|
|
|
55
65
|
},
|
|
56
66
|
"required": [
|
|
57
67
|
"appType"
|
|
58
|
-
]
|
|
68
|
+
],
|
|
69
|
+
"not": {
|
|
70
|
+
"required": [
|
|
71
|
+
"command"
|
|
72
|
+
]
|
|
73
|
+
}
|
|
59
74
|
},
|
|
60
75
|
"then": {
|
|
61
76
|
"properties": {
|
|
@@ -79,7 +94,12 @@
|
|
|
79
94
|
},
|
|
80
95
|
"required": [
|
|
81
96
|
"appType"
|
|
82
|
-
]
|
|
97
|
+
],
|
|
98
|
+
"not": {
|
|
99
|
+
"required": [
|
|
100
|
+
"command"
|
|
101
|
+
]
|
|
102
|
+
}
|
|
83
103
|
},
|
|
84
104
|
"then": {
|
|
85
105
|
"properties": {
|
|
@@ -92,9 +112,62 @@
|
|
|
92
112
|
"port"
|
|
93
113
|
]
|
|
94
114
|
}
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
"if": {
|
|
118
|
+
"required": [
|
|
119
|
+
"command"
|
|
120
|
+
]
|
|
121
|
+
},
|
|
122
|
+
"then": {
|
|
123
|
+
"anyOf": [
|
|
124
|
+
{
|
|
125
|
+
"required": [
|
|
126
|
+
"appName"
|
|
127
|
+
]
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"required": [
|
|
131
|
+
"name"
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
],
|
|
135
|
+
"not": {
|
|
136
|
+
"anyOf": [
|
|
137
|
+
{
|
|
138
|
+
"required": [
|
|
139
|
+
"image"
|
|
140
|
+
]
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"required": [
|
|
144
|
+
"dockerfile"
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
"else": {
|
|
151
|
+
"required": [
|
|
152
|
+
"appName",
|
|
153
|
+
"stack"
|
|
154
|
+
],
|
|
155
|
+
"anyOf": [
|
|
156
|
+
{
|
|
157
|
+
"required": [
|
|
158
|
+
"appType"
|
|
159
|
+
]
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
"required": [
|
|
163
|
+
"type"
|
|
164
|
+
]
|
|
165
|
+
}
|
|
166
|
+
]
|
|
167
|
+
}
|
|
95
168
|
}
|
|
96
169
|
],
|
|
97
|
-
"description": "Configuration for Flisk resources. Drives Tilt orchestration, Docker Compose generation, and dependency resolution. Supports both explicit service.json files and synthesis from directory structure.",
|
|
170
|
+
"description": "Configuration for Flisk resources. Drives Tilt orchestration, Docker Compose generation, and dependency resolution. Supports both explicit service.json files and synthesis from directory structure. A service runs from exactly one source: a container (image, dockerfile, or a generated Dockerfile) or a local command.",
|
|
98
171
|
"properties": {
|
|
99
172
|
"$schema": {
|
|
100
173
|
"description": "JSON Schema reference for IDE validation",
|
|
@@ -144,7 +217,7 @@
|
|
|
144
217
|
},
|
|
145
218
|
"databaseName": {
|
|
146
219
|
"description": "Override auto-generated DB name.\nDefault: FLISK_{stack}",
|
|
147
|
-
"pattern": "^
|
|
220
|
+
"pattern": "^FLISK_[a-z_]+$",
|
|
148
221
|
"type": "string"
|
|
149
222
|
},
|
|
150
223
|
"dependencies": {
|
|
@@ -513,25 +586,30 @@
|
|
|
513
586
|
"default": "files"
|
|
514
587
|
}
|
|
515
588
|
}
|
|
589
|
+
},
|
|
590
|
+
"command": {
|
|
591
|
+
"description": "Run the service as a local process with this shell command instead of a container, for example \"node server.js\" or \"uvicorn main:app --port $PORT\". It runs from the service directory with PORT set to port. No image, Dockerfile or generated files: flisk up starts, supervises and restarts it without Docker or Tilt. Cannot be combined with image or dockerfile.",
|
|
592
|
+
"minLength": 1,
|
|
593
|
+
"type": "string"
|
|
594
|
+
},
|
|
595
|
+
"env": {
|
|
596
|
+
"additionalProperties": {
|
|
597
|
+
"type": "string"
|
|
598
|
+
},
|
|
599
|
+
"description": "Environment variables for a command service. Values may reference ${VAR} (or ${VAR:-default}) from the project .env or the shell.",
|
|
600
|
+
"propertyNames": {
|
|
601
|
+
"pattern": "^[A-Za-z_][A-Za-z0-9_]*$"
|
|
602
|
+
},
|
|
603
|
+
"type": "object"
|
|
604
|
+
},
|
|
605
|
+
"name": {
|
|
606
|
+
"description": "Service name. Same as appName; a command service may use either.",
|
|
607
|
+
"type": "string"
|
|
516
608
|
}
|
|
517
609
|
},
|
|
518
610
|
"required": [
|
|
519
|
-
"appName",
|
|
520
|
-
"stack",
|
|
521
611
|
"schemaVersion"
|
|
522
612
|
],
|
|
523
613
|
"title": "Flisk Resource Configuration",
|
|
524
|
-
"type": "object"
|
|
525
|
-
"anyOf": [
|
|
526
|
-
{
|
|
527
|
-
"required": [
|
|
528
|
-
"appType"
|
|
529
|
-
]
|
|
530
|
-
},
|
|
531
|
-
{
|
|
532
|
-
"required": [
|
|
533
|
-
"type"
|
|
534
|
-
]
|
|
535
|
-
}
|
|
536
|
-
]
|
|
614
|
+
"type": "object"
|
|
537
615
|
}
|
|
@@ -157,7 +157,7 @@ diagnostics_menu() {
|
|
|
157
157
|
case $choice in
|
|
158
158
|
1)
|
|
159
159
|
echo -e "${BLUE}Testing network connectivity...${NC}"
|
|
160
|
-
run_command "$resource_name" "nc -zv registry.npmjs.org 443 && nc -zv
|
|
160
|
+
run_command "$resource_name" "nc -zv registry.npmjs.org 443 && nc -zv flisk-verdaccio 4873"
|
|
161
161
|
;;
|
|
162
162
|
2)
|
|
163
163
|
echo -e "${BLUE}Viewing configuration files...${NC}"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# Copyright (c) 2026 Flisk Landscape contributors
|
|
3
3
|
# SPDX-License-Identifier: MIT
|
|
4
4
|
# =============================================================================
|
|
5
|
-
# 🎯 Flisk
|
|
5
|
+
# 🎯 Flisk - RESOURCE MANIFEST GENERATOR
|
|
6
6
|
# =============================================================================
|
|
7
7
|
# Usage: ./generate-manifest.sh <stack> <resource-name> <type> [port]
|
|
8
8
|
#
|
|
@@ -37,7 +37,7 @@ PROJECT_ROOT="$(cd "${SCRIPT_DIR}/../.." && pwd)"
|
|
|
37
37
|
print_usage() {
|
|
38
38
|
cat << EOF
|
|
39
39
|
${BLUE}╔═══════════════════════════════════════════════════════════════════╗
|
|
40
|
-
║ 🎯 Flisk
|
|
40
|
+
║ 🎯 Flisk RESOURCE MANIFEST GENERATOR ║
|
|
41
41
|
╚═══════════════════════════════════════════════════════════════════╝${NC}
|
|
42
42
|
|
|
43
43
|
${YELLOW}Usage:${NC}
|
|
@@ -77,6 +77,19 @@ def _compute_env_file_rel_path(resource_path, full_resource_path, env_filename):
|
|
|
77
77
|
# 🚦 FRONTEND / BACKEND ENTRIES
|
|
78
78
|
# =============================================================================
|
|
79
79
|
|
|
80
|
+
# The memory anchors a frontend service merges. Next.js gets its own (next dev needs far more than the 64M an nginx SPA fits in,
|
|
81
|
+
# and the OOM kill exits 0, so the container looks like a clean exit). The engine finds frontend entries by these strings.
|
|
82
|
+
_FRONTEND_MEMORY_ANCHORS = ["<<: *frontend-memory-limit", "<<: *next-memory-limit"]
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
def _has_frontend_memory_anchor(entry):
|
|
86
|
+
"""True when a compose entry merges one of the frontend memory anchors."""
|
|
87
|
+
for anchor in _FRONTEND_MEMORY_ANCHORS:
|
|
88
|
+
if anchor in entry:
|
|
89
|
+
return True
|
|
90
|
+
return False
|
|
91
|
+
|
|
92
|
+
|
|
80
93
|
def generate_frontend_compose(resource_path, resource_name, res, manifest=None):
|
|
81
94
|
"""Generate frontend docker-compose entry with Traefik routing."""
|
|
82
95
|
res_name = res['name']
|
|
@@ -91,6 +104,10 @@ def generate_frontend_compose(resource_path, resource_name, res, manifest=None):
|
|
|
91
104
|
# healthcheck probe a port nothing listens on, which left the container marked
|
|
92
105
|
# unhealthy -- and Traefik's Docker provider skips unhealthy containers, so the
|
|
93
106
|
# router was never registered and every request 404'd.
|
|
107
|
+
# Next.js is served by its own Node server (no nginx), on the manifest port, under its basePath.
|
|
108
|
+
is_next = bool(manifest) and manifest.get('framework') == 'next'
|
|
109
|
+
if is_next:
|
|
110
|
+
use_nginx = False
|
|
94
111
|
port = NGINX_CONTAINER_PORT if use_nginx else reject_unsafe_value(manifest.get('port', BASE_PORT_FRONTEND), 'port')
|
|
95
112
|
|
|
96
113
|
# Base path for routing on {project}.localhost. Shared with the Vite config and
|
|
@@ -129,11 +146,19 @@ def generate_frontend_compose(resource_path, resource_name, res, manifest=None):
|
|
|
129
146
|
manifest=manifest,
|
|
130
147
|
)
|
|
131
148
|
|
|
149
|
+
memory_anchor = "<<: *next-memory-limit" if is_next else "<<: *frontend-memory-limit"
|
|
150
|
+
# An nginx frontend answers at /. Next.js answers at its basePath (with a trailing slash, see next.config.mjs), and the image
|
|
151
|
+
# has curl, not wget.
|
|
152
|
+
if is_next:
|
|
153
|
+
health_test = '["CMD", "curl", "-fsS", "-o", "/dev/null", "http://127.0.0.1:{}{}/"]'.format(port, base_path)
|
|
154
|
+
else:
|
|
155
|
+
health_test = '["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://127.0.0.1:{}"]'.format(port)
|
|
156
|
+
|
|
132
157
|
return """ {res_name}:
|
|
133
158
|
image: {image_name}
|
|
134
159
|
init: true
|
|
135
160
|
{build_config}
|
|
136
|
-
|
|
161
|
+
{memory_anchor}
|
|
137
162
|
env_file:
|
|
138
163
|
- {env_file_rel_path}
|
|
139
164
|
environment:
|
|
@@ -144,9 +169,11 @@ def generate_frontend_compose(resource_path, resource_name, res, manifest=None):
|
|
|
144
169
|
- {network_traefik_public}
|
|
145
170
|
- {network_backend}
|
|
146
171
|
healthcheck:
|
|
147
|
-
test:
|
|
172
|
+
test: {health_test}
|
|
148
173
|
{healthcheck_timing}""".format(
|
|
174
|
+
health_test=health_test,
|
|
149
175
|
res_name=res_name,
|
|
176
|
+
memory_anchor=memory_anchor,
|
|
150
177
|
image_name=image_name,
|
|
151
178
|
build_config=build_config,
|
|
152
179
|
env_file_rel_path=env_file_rel_path,
|
|
@@ -439,7 +466,7 @@ def _generate_port_anchors(resource_entries):
|
|
|
439
466
|
sdk_port = int(port_str)
|
|
440
467
|
break
|
|
441
468
|
# Check if this is a frontend (has frontend-memory-limit but not SDK)
|
|
442
|
-
elif
|
|
469
|
+
elif _has_frontend_memory_anchor(entry) and not ("-sdk:" in entry or entry.strip().startswith("identity-sdk:")):
|
|
443
470
|
has_frontend = True
|
|
444
471
|
# Extract frontend port from entry
|
|
445
472
|
if "loadbalancer.server.port=" in entry:
|
|
@@ -452,7 +479,7 @@ def _generate_port_anchors(resource_entries):
|
|
|
452
479
|
break
|
|
453
480
|
# Check if this is a backend (has a port, not frontend, not SDK)
|
|
454
481
|
# Backend entries have "healthcheck:" section with backend port
|
|
455
|
-
elif "healthcheck:" in entry and
|
|
482
|
+
elif "healthcheck:" in entry and not _has_frontend_memory_anchor(entry) and not ("-sdk:" in entry or entry.strip().startswith("identity-sdk:")):
|
|
456
483
|
has_backend = True
|
|
457
484
|
# Extract backend port from entry
|
|
458
485
|
if "loadbalancer.server.port=" in entry:
|
|
@@ -522,6 +549,15 @@ x-frontend-memory-limit: &frontend-memory-limit
|
|
|
522
549
|
reservations:
|
|
523
550
|
memory: 32M
|
|
524
551
|
|
|
552
|
+
x-next-memory-limit: &next-memory-limit
|
|
553
|
+
deploy:
|
|
554
|
+
resources:
|
|
555
|
+
limits:
|
|
556
|
+
memory: 1G
|
|
557
|
+
cpus: '1.0'
|
|
558
|
+
reservations:
|
|
559
|
+
memory: 256M
|
|
560
|
+
|
|
525
561
|
services:
|
|
526
562
|
""".format(port_anchors=port_anchors)
|
|
527
563
|
|
|
@@ -19,11 +19,26 @@ def generate_standalone_traefik_compose(sablier_enabled = False, http_host_port
|
|
|
19
19
|
emitted when sablier_enabled is True (a license grants "sablier"). Without
|
|
20
20
|
it they would run for nothing: a container holding a read-write Docker
|
|
21
21
|
socket, an image build, and a plugin download from GitHub on every start.
|
|
22
|
+
|
|
23
|
+
Pass None for https_host_port to emit an HTTP-only Traefik configuration.
|
|
22
24
|
"""
|
|
23
25
|
network = PlatformDockerConstants.NETWORK_TRAEFIK_PUBLIC
|
|
24
26
|
name = PlatformDockerConstants.PROJECT_NAME
|
|
25
27
|
log_level = "DEBUG" if sablier_enabled else "INFO"
|
|
26
28
|
plugins_volume = " - plugins-storage:/plugins-storage\n" if sablier_enabled else ""
|
|
29
|
+
https_entrypoint = (
|
|
30
|
+
' - "--entrypoints.websecure.address=:443"\n'
|
|
31
|
+
if https_host_port != None
|
|
32
|
+
else ""
|
|
33
|
+
)
|
|
34
|
+
https_port = (
|
|
35
|
+
' - "{bind_address}:{https_host_port}:443"\n'.format(
|
|
36
|
+
bind_address=bind_address,
|
|
37
|
+
https_host_port=https_host_port,
|
|
38
|
+
)
|
|
39
|
+
if https_host_port != None
|
|
40
|
+
else ""
|
|
41
|
+
)
|
|
27
42
|
return """###############################################################################
|
|
28
43
|
# SYSTEM-GENERATED - DO NOT EDIT
|
|
29
44
|
# Standalone Traefik for Flisk projects without platform/introvertic proxy files.
|
|
@@ -48,12 +63,10 @@ services:
|
|
|
48
63
|
- "--providers.file.directory=/etc/traefik/dynamic"
|
|
49
64
|
- "--providers.file.watch=true"
|
|
50
65
|
- "--entrypoints.web.address=:80"
|
|
51
|
-
- "--
|
|
52
|
-
- "--log.level={log_level}"
|
|
66
|
+
{https_entrypoint} - "--log.level={log_level}"
|
|
53
67
|
{sablier_flags} ports:
|
|
54
68
|
- "{bind_address}:{http_host_port}:80"
|
|
55
|
-
|
|
56
|
-
volumes:
|
|
69
|
+
{https_port} volumes:
|
|
57
70
|
- /var/run/docker.sock:/var/run/docker.sock:ro
|
|
58
71
|
- ./{dynamic_dir_name}:/etc/traefik/dynamic:ro
|
|
59
72
|
{plugins_volume} networks:
|
|
@@ -75,6 +88,8 @@ volumes:
|
|
|
75
88
|
bind_address=bind_address,
|
|
76
89
|
healthcheck_timing=compose_healthcheck_timing(10),
|
|
77
90
|
traefik_depends_on=_SABLIER_DEPENDS_ON if sablier_enabled else "",
|
|
91
|
+
https_entrypoint=https_entrypoint,
|
|
92
|
+
https_port=https_port,
|
|
78
93
|
sablier_flags=_SABLIER_FLAGS if sablier_enabled else "",
|
|
79
94
|
sablier_services=_SABLIER_SERVICES.format(
|
|
80
95
|
name=name,
|
|
@@ -97,7 +97,7 @@ VERDACCIO_TRAEFIK_HOST = "verdaccio.localhost"
|
|
|
97
97
|
# image. Without it, the second `flisk up` runs `--remove-orphans` against the
|
|
98
98
|
# first project's containers and overwrites its images.
|
|
99
99
|
def compose_project_name(stack):
|
|
100
|
-
"""Compose project for a stack: <project>-<stack>-autogenerated (e.g.
|
|
100
|
+
"""Compose project for a stack: <project>-<stack>-autogenerated (e.g. flisk-erp-system-analytics-autogenerated)."""
|
|
101
101
|
return PROJECT_NAME_HYPHEN + "-" + stack + "-autogenerated"
|
|
102
102
|
|
|
103
103
|
def app_image_name(stack, res_name):
|
|
@@ -105,7 +105,7 @@ def app_image_name(stack, res_name):
|
|
|
105
105
|
return PROJECT_NAME + "_" + stack + "_" + res_name + ":dev"
|
|
106
106
|
|
|
107
107
|
def infra_compose_project_name(infra):
|
|
108
|
-
"""Compose project for a shared platform stack: <project>-<infra> (e.g.
|
|
108
|
+
"""Compose project for a shared platform stack: <project>-<infra> (e.g. flisk-erp-system-database-management)."""
|
|
109
109
|
return PROJECT_NAME_HYPHEN + "-" + infra
|
|
110
110
|
|
|
111
111
|
def migrator_image_name(stack):
|
|
@@ -136,6 +136,7 @@ EXPOSE {port}
|
|
|
136
136
|
CMD ["node", "src/index.js"]
|
|
137
137
|
"""
|
|
138
138
|
|
|
139
|
+
|
|
139
140
|
# The watcher the Go development target runs. It compiles a change into a staging binary while the running app keeps serving, and stops
|
|
140
141
|
# and swaps the app only when that build succeeds. Air was tried first and stops the app as soon as it sees a change (engine.go `start`
|
|
141
142
|
# calls stopBin before buildRun), so the service stayed down for the whole compile; a Traefik health check landing in that gap kept the
|
|
@@ -247,6 +248,11 @@ def generate_language_dockerfile(res_path, language, port = BASE_PORT_BACKEND, d
|
|
|
247
248
|
)
|
|
248
249
|
|
|
249
250
|
|
|
251
|
+
def is_next_frontend(manifest):
|
|
252
|
+
"""True for a frontend whose `framework` is `next`: it runs on Node, not as a Vite build behind nginx."""
|
|
253
|
+
return bool(manifest) and manifest.get("appType") == "frontend" and manifest.get("framework") == "next"
|
|
254
|
+
|
|
255
|
+
|
|
250
256
|
def is_provider_owned_language(manifest):
|
|
251
257
|
"""True when the manifest selects a provider-owned language (a missing language means Bun)."""
|
|
252
258
|
if not manifest:
|